From bb76047605c7d8d0db8bcc27c145438e2c85b607 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 23 Jun 2025 17:09:39 +0530 Subject: [PATCH 01/63] Implemeted an API to store logs from mobile Application --- .../Controllers/LogController.cs | 130 ++++++++++++++++++ Marco.Pms.Services/Service/ILoggingService.cs | 5 +- Marco.Pms.Services/Service/LoggingServices.cs | 18 ++- 3 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 Marco.Pms.Services/Controllers/LogController.cs diff --git a/Marco.Pms.Services/Controllers/LogController.cs b/Marco.Pms.Services/Controllers/LogController.cs new file mode 100644 index 0000000..6047642 --- /dev/null +++ b/Marco.Pms.Services/Controllers/LogController.cs @@ -0,0 +1,130 @@ +using System.Text.Json; +using Marco.Pms.Model.Logs; +using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Serilog.Context; + +namespace Marco.Pms.Services.Controllers +{ + [Authorize] + [Route("api/[controller]")] + [ApiController] + public class LogController : ControllerBase + { + private readonly ILoggingService _logger; + public LogController(ILoggingService logger) + { + _logger = logger; + } + [HttpPost] + /// + /// Receives a batch of log entries from mobile applications and processes them. + /// Logs are enriched with context properties like UserAgent, Timestamp, and IpAddress. + /// + /// A list of LogStructure objects containing log details. + /// An indicating the success of the operation. + public IActionResult MobileLogging([FromBody] List logs) + { + var demoDetails = new + { + name = "Pooja", + job = "Tester", + org = "MarcoAiot" + }; + // Check if logs are provided to avoid processing empty requests + if (logs == null || !logs.Any()) + { + _logger.LogWarning("MobileLogging endpoint received an empty or null log list."); + return BadRequest("No log entries provided."); + } + + // Iterate through each log entry received from the client + foreach (var log in logs) + { + object? detailsObject = null; + + // Attempt to deserialize the 'Details' string into a dynamic object + // This allows structured logging of the details payload. + log.Details = JsonSerializer.Serialize(demoDetails); + if (!string.IsNullOrWhiteSpace(log.Details)) + { + try + { + // Use JsonDocument for potentially more efficient parsing if you just need the raw JSON or a dynamic object + // For simply logging it as a structured property, object works. + detailsObject = JsonSerializer.Deserialize>(log.Details); + + } + catch (JsonException ex) + { + // Log a warning if deserialization fails, but continue processing other logs + _logger.LogWarning("Failed to deserialize 'Details' for a log entry. Raw details: '{RawDetails}'. Error: {ErrorMessage}", log.Details, ex.Message); + } + } + + // Push common properties to the Serilog LogContext for the current log operation. + // These properties will be attached to the log event itself. + using (LogContext.PushProperty("UserAgent", log.UserAgent)) + using (LogContext.PushProperty("Timestamp", log.TimeStamp)) + using (LogContext.PushProperty("IpAddress", log.IpAddress)) + { + // If details were successfully parsed, push them as a structured property. + if (detailsObject != null) + { + using (LogContext.PushProperty("Details", detailsObject, true)) // 'true' for destructuring + { + LogByLevel(log.LogLevel, log.Message); + } + } + else + { + // If details were null or failed to parse, log without the details property + LogByLevel(log.LogLevel, log.Message); + } + } + } + + // Return 200 OK indicating successful receipt of logs. + // As logging is typically a "fire and forget" operation from the client's perspective, + // we don't need to await individual log writes here. + // The logger provider handles the actual writing asynchronously in the background. + _logger.LogInfo("Successfully processed {LogCount} mobile log entries.", logs.Count); + return Ok("Logs received successfully."); + } + + /// + /// Logs a message at the specified log level using the injected ILogger. + /// + /// The string representation of the log level (e.g., "info", "warning"). + /// The log message. + private void LogByLevel(string? logLevel, string? message) + { + // Default message if null or empty + message = string.IsNullOrWhiteSpace(message) ? "No message provided." : message; + + // Use a switch expression or simple if/else for clarity based on log level + switch (logLevel?.ToLowerInvariant()) // Use ToLowerInvariant for case-insensitive comparison + { + case "info": + case "information": // Common alias for info + _logger.LogInfo(message); + break; + case "warn": + case "warning": + _logger.LogWarning(message); + break; + case "error": + _logger.LogError(message); + break; + case "critical": + _logger.LogCritical(message); + break; + default: + // Log unknown levels as information to ensure they are captured + _logger.LogInfo("[Unknown Level] {Message}", message); + break; + } + } + } +} diff --git a/Marco.Pms.Services/Service/ILoggingService.cs b/Marco.Pms.Services/Service/ILoggingService.cs index 39dbb00..bf97e35 100644 --- a/Marco.Pms.Services/Service/ILoggingService.cs +++ b/Marco.Pms.Services/Service/ILoggingService.cs @@ -1,12 +1,11 @@ -using Serilog.Context; - -namespace MarcoBMS.Services.Service +namespace MarcoBMS.Services.Service { public interface ILoggingService { void LogInfo(string? message, params object[]? args); void LogWarning(string? message, params object[]? args); void LogError(string? message, params object[]? args); + void LogCritical(string? message, params object[]? args); } } diff --git a/Marco.Pms.Services/Service/LoggingServices.cs b/Marco.Pms.Services/Service/LoggingServices.cs index 4328a2a..c6a7577 100644 --- a/Marco.Pms.Services/Service/LoggingServices.cs +++ b/Marco.Pms.Services/Service/LoggingServices.cs @@ -18,10 +18,11 @@ namespace MarcoBMS.Services.Service { _logger.LogError(message, args); } - else { + else + { _logger.LogError(message); } - } + } public void LogInfo(string? message, params object[]? args) { @@ -48,6 +49,19 @@ namespace MarcoBMS.Services.Service _logger.LogWarning(message); } } + + public void LogCritical(string? message, params object[]? args) + { + using (LogContext.PushProperty("LogLevel", "Critical")) + if (args != null) + { + _logger.LogCritical(message, args); + } + else + { + _logger.LogCritical(message); + } + } } } -- 2.43.0 From 373d80260fd13ff6e3277fb062eef426feadb1c7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 24 Jun 2025 10:10:03 +0530 Subject: [PATCH 02/63] Removed demo objects for which is used for testing purpose --- Marco.Pms.Services/Controllers/LogController.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Marco.Pms.Services/Controllers/LogController.cs b/Marco.Pms.Services/Controllers/LogController.cs index 6047642..15a956b 100644 --- a/Marco.Pms.Services/Controllers/LogController.cs +++ b/Marco.Pms.Services/Controllers/LogController.cs @@ -26,12 +26,6 @@ namespace Marco.Pms.Services.Controllers /// An indicating the success of the operation. public IActionResult MobileLogging([FromBody] List logs) { - var demoDetails = new - { - name = "Pooja", - job = "Tester", - org = "MarcoAiot" - }; // Check if logs are provided to avoid processing empty requests if (logs == null || !logs.Any()) { @@ -46,7 +40,6 @@ namespace Marco.Pms.Services.Controllers // Attempt to deserialize the 'Details' string into a dynamic object // This allows structured logging of the details payload. - log.Details = JsonSerializer.Serialize(demoDetails); if (!string.IsNullOrWhiteSpace(log.Details)) { try -- 2.43.0 From 019ef5d9974231d8ceb6983528ca88979af1a43a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 26 Jul 2025 14:57:05 +0530 Subject: [PATCH 03/63] Optimized the contact list API in Directory Controller --- .../Controllers/DirectoryController.cs | 150 +- .../MappingProfiles/MappingProfile.cs | 21 +- Marco.Pms.Services/Program.cs | 1 + .../Service/DirectoryService.cs | 1778 +++++++++++++++++ .../ServiceInterfaces/IDirectoryService.cs | 28 + 5 files changed, 1912 insertions(+), 66 deletions(-) create mode 100644 Marco.Pms.Services/Service/DirectoryService.cs create mode 100644 Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 9eb06e0..16da931 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -1,6 +1,7 @@ using Marco.Pms.Model.Dtos.Directory; using Marco.Pms.Model.Utilities; -using Marco.Pms.Services.Helpers; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +15,32 @@ namespace Marco.Pms.Services.Controllers public class DirectoryController : ControllerBase { - private readonly DirectoryHelper _directoryHelper; + private readonly IDirectoryService _directoryService; + private readonly UserHelper _userHelper; private readonly ILoggingService _logger; + private readonly Guid tenantId; - - public DirectoryController(DirectoryHelper directoryHelper, ILoggingService logger) + public DirectoryController(IDirectoryService directoryHelper, UserHelper userHelper, ILoggingService logger) { - _directoryHelper = directoryHelper; + _directoryService = directoryHelper; + _userHelper = userHelper; _logger = logger; + tenantId = userHelper.GetTenantId(); } + #region =================================================================== Contact APIs =================================================================== + #region =================================================================== Contact Get APIs =================================================================== + + [HttpGet("list")] + public async Task GetContactList([FromQuery] string? search, [FromQuery] string? filter, [FromQuery] Guid? projectId, [FromQuery] bool active = true, + [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetListOfContactsAsync(search: search, filter: filter, projectId: projectId, active: active, pageSize: pageSize, pageNumber: pageNumber, tenantId, loggedInEmployee); + + return StatusCode(response.StatusCode, response); + + } [HttpGet] public async Task GetContactList([FromQuery] string? search, [FromQuery] List? bucketIds, [FromQuery] List? categoryIds, [FromQuery] Guid? projectId, [FromQuery] bool active = true) { @@ -32,7 +49,7 @@ namespace Marco.Pms.Services.Controllers BucketIds = bucketIds, CategoryIds = categoryIds }; - var response = await _directoryHelper.GetListOfContacts(search, active, filterDto, projectId); + var response = await _directoryService.GetListOfContactsOld(search, active, filterDto, projectId); if (response.StatusCode == 200) @@ -53,7 +70,7 @@ namespace Marco.Pms.Services.Controllers [HttpGet("contact-bucket/{bucketId}")] public async Task GetContactsListByBucketId(Guid bucketId) { - var response = await _directoryHelper.GetContactsListByBucketId(bucketId); + var response = await _directoryService.GetContactsListByBucketId(bucketId); if (response.StatusCode == 200) { return Ok(response); @@ -68,55 +85,10 @@ namespace Marco.Pms.Services.Controllers } } - [HttpPost] - public async Task CreateContact([FromBody] CreateContactDto createContact) - { - if (!ModelState.IsValid) - { - var errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => e.ErrorMessage) - .ToList(); - _logger.LogWarning("User sent Invalid Date while marking attendance"); - return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); - } - var response = await _directoryHelper.CreateContact(createContact); - if (response.StatusCode == 200) - { - return Ok(response); - } - else - { - return BadRequest(response); - } - } - - [HttpPut("{id}")] - public async Task UpdateContact(Guid id, [FromBody] UpdateContactDto updateContact) - { - var response = await _directoryHelper.UpdateContact(id, updateContact); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); - } - } - [HttpGet("profile/{id}")] public async Task GetContactProfile(Guid id) { - var response = await _directoryHelper.GetContactProfile(id); + var response = await _directoryService.GetContactProfile(id); if (response.StatusCode == 200) { return Ok(response); @@ -134,14 +106,61 @@ namespace Marco.Pms.Services.Controllers [HttpGet("organization")] public async Task GetOrganizationList() { - var response = await _directoryHelper.GetOrganizationList(); + var response = await _directoryService.GetOrganizationList(); return Ok(response); } + #endregion + + [HttpPost] + public async Task CreateContact([FromBody] CreateContactDto createContact) + { + if (!ModelState.IsValid) + { + var errors = ModelState.Values + .SelectMany(v => v.Errors) + .Select(e => e.ErrorMessage) + .ToList(); + _logger.LogWarning("User sent Invalid Date while marking attendance"); + return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); + } + var response = await _directoryService.CreateContact(createContact); + if (response.StatusCode == 200) + { + return Ok(response); + } + else + { + return BadRequest(response); + } + } + + [HttpPut("{id}")] + public async Task UpdateContact(Guid id, [FromBody] UpdateContactDto updateContact) + { + var response = await _directoryService.UpdateContact(id, updateContact); + if (response.StatusCode == 200) + { + return Ok(response); + } + else if (response.StatusCode == 404) + { + return NotFound(response); + } + else if (response.StatusCode == 401) + { + return Unauthorized(response); + } + else + { + return BadRequest(response); + } + } + [HttpDelete("{id}")] public async Task DeleteContact(Guid id, [FromQuery] bool? active) { - var response = await _directoryHelper.DeleteContact(id, active ?? false); + var response = await _directoryService.DeleteContact(id, active ?? false); if (response.StatusCode == 200) { return Ok(response); @@ -155,13 +174,14 @@ namespace Marco.Pms.Services.Controllers return BadRequest(response); } } + #endregion // -------------------------------- Contact Notes -------------------------------- [HttpGet("notes")] public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int? pageSize, [FromQuery] int pageNumber) { - var response = await _directoryHelper.GetListOFAllNotes(projectId, pageSize ?? 25, pageNumber); + var response = await _directoryService.GetListOFAllNotes(projectId, pageSize ?? 25, pageNumber); return StatusCode(response.StatusCode, response); } @@ -169,7 +189,7 @@ namespace Marco.Pms.Services.Controllers public async Task CreateContactNote([FromBody] CreateContactNoteDto noteDto) { - var response = await _directoryHelper.CreateContactNote(noteDto); + var response = await _directoryService.CreateContactNote(noteDto); if (response.StatusCode == 200) { return Ok(response); @@ -187,7 +207,7 @@ namespace Marco.Pms.Services.Controllers [HttpGet("notes/{ContactId}")] public async Task GetNoteListByContactId(Guid contactId, [FromQuery] bool active = true) { - var response = await _directoryHelper.GetNoteListByContactId(contactId, active); + var response = await _directoryService.GetNoteListByContactId(contactId, active); if (response.StatusCode == 200) { return Ok(response); @@ -205,7 +225,7 @@ namespace Marco.Pms.Services.Controllers [HttpPut("note/{id}")] public async Task UpdateContactNote(Guid id, [FromBody] UpdateContactNoteDto noteDto) { - var response = await _directoryHelper.UpdateContactNote(id, noteDto); + var response = await _directoryService.UpdateContactNote(id, noteDto); if (response.StatusCode == 200) { return Ok(response); @@ -223,7 +243,7 @@ namespace Marco.Pms.Services.Controllers [HttpDelete("note/{id}")] public async Task DeleteContactNote(Guid id, [FromQuery] bool? active) { - var response = await _directoryHelper.DeleteContactNote(id, active ?? false); + var response = await _directoryService.DeleteContactNote(id, active ?? false); return Ok(response); } @@ -232,7 +252,7 @@ namespace Marco.Pms.Services.Controllers [HttpGet("buckets")] public async Task GetBucketList() { - var response = await _directoryHelper.GetBucketList(); + var response = await _directoryService.GetBucketList(); if (response.StatusCode == 200) { return Ok(response); @@ -259,7 +279,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogWarning("User sent Invalid Date while marking attendance"); return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); } - var response = await _directoryHelper.CreateBucket(bucketDto); + var response = await _directoryService.CreateBucket(bucketDto); if (response.StatusCode == 200) { return Ok(response); @@ -282,7 +302,7 @@ namespace Marco.Pms.Services.Controllers [HttpPut("bucket/{id}")] public async Task UpdateBucket(Guid id, [FromBody] UpdateBucketDto bucketDto) { - var response = await _directoryHelper.UpdateBucket(id, bucketDto); + var response = await _directoryService.UpdateBucket(id, bucketDto); if (response.StatusCode == 200) { return Ok(response); @@ -304,7 +324,7 @@ namespace Marco.Pms.Services.Controllers [HttpPost("assign-bucket/{bucketId}")] public async Task AssignBucket(Guid bucketId, [FromBody] List assignBuckets) { - var response = await _directoryHelper.AssignBucket(bucketId, assignBuckets); + var response = await _directoryService.AssignBucket(bucketId, assignBuckets); if (response.StatusCode == 200) { return Ok(response); @@ -326,7 +346,7 @@ namespace Marco.Pms.Services.Controllers [HttpDelete("bucket/{id}")] public async Task DeleteBucket(Guid id) { - var response = await _directoryHelper.DeleteBucket(id); + var response = await _directoryService.DeleteBucket(id); if (response.StatusCode == 200) { return Ok(response); diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index bf3777c..46b119b 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,10 +1,13 @@ using AutoMapper; +using Marco.Pms.Model.Directory; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.Employee; +using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; namespace Marco.Pms.Services.MappingProfiles @@ -60,9 +63,25 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Comment)); #endregion - #region ======================================================= Projects ======================================================= + #region ======================================================= Employee ======================================================= + CreateMap(); + #endregion + + #region ======================================================= Directory ======================================================= + + CreateMap(); + + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + #endregion + + } } } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 5549702..c53a212 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -172,6 +172,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion #region Helpers diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs new file mode 100644 index 0000000..06883c6 --- /dev/null +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -0,0 +1,1778 @@ +using AutoMapper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.Directory; +using Marco.Pms.Model.Dtos.Directory; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Mapper; +using Marco.Pms.Model.Projects; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Directory; +using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; +using Microsoft.EntityFrameworkCore; +using System.Text.Json; + +namespace Marco.Pms.Services.Service +{ + public class DirectoryService : IDirectoryService + { + private readonly IDbContextFactory _dbContextFactory; + private readonly ApplicationDbContext _context; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly ILoggingService _logger; + private readonly UserHelper _userHelper; + private readonly IMapper _mapper; + private readonly PermissionServices _permissionServices; + + public DirectoryService( + IDbContextFactory dbContextFactory, + ApplicationDbContext context, + ILoggingService logger, + IServiceScopeFactory serviceScopeFactory, + UserHelper userHelper, + IMapper mapper, + PermissionServices permissionServices) + { + _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); + _context = context ?? throw new ArgumentNullException(nameof(context)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); + _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + _permissionServices = permissionServices ?? throw new ArgumentNullException(nameof(permissionServices)); + } + #region =================================================================== Contact APIs =================================================================== + + #region =================================================================== Contact Get APIs =================================================================== + + /// + /// Retrieves a paginated list of contacts based on permissions, search criteria, and filters. + /// + /// A search term to filter contacts by name, organization, email, phone, or tag. + /// A JSON string representing ContactFilterDto for advanced filtering. + /// Optional project ID to filter contacts assigned to a specific project. + /// Boolean to filter for active or inactive contacts. + /// The number of records per page. + /// The current page number. + /// The ID of the tenant to which the contacts belong. + /// The employee making the request, used for permission checks. + /// An ApiResponse containing the paginated list of contacts or an error. + public async Task> GetListOfContactsAsync(string? search, string? filter, Guid? projectId, bool active, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee) + { + Guid loggedInEmployeeId = loggedInEmployee.Id; + _logger.LogInfo( + "Attempting to fetch contact list for Tenant {TenantId} by Employee {EmployeeId}. Search: '{Search}', Filter: '{Filter}'", + tenantId, loggedInEmployeeId, search ?? "", filter ?? ""); + + try + { + // Use a single DbContext for the entire operation to ensure consistency. + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + + // Step 1: Perform initial permission checks in parallel. + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + var hasAdminPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); + var hasManagerPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryManager, loggedInEmployee.Id); + var hasUserPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryUser, loggedInEmployee.Id); + await Task.WhenAll(hasAdminPermissionTask, hasManagerPermissionTask, hasUserPermissionTask); + + var hasAdminPermission = hasAdminPermissionTask.Result; + var hasManagerPermission = hasManagerPermissionTask.Result; + var hasUserPermission = hasUserPermissionTask.Result; + + // Step 2: Build the core IQueryable with all filtering logic applied on the server. + // This is the most critical optimization. + var contactQuery = dbContext.Contacts.Where(c => c.TenantId == tenantId && c.IsActive == active); + + // --- Permission-based Filtering --- + if (!hasAdminPermission) + { + if (hasManagerPermission || hasUserPermission) + { + // User can see contacts in buckets they created or are assigned to. + var employeeBucketIds = await dbContext.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployeeId) + .Select(eb => eb.BucketId) + .ToListAsync(); + + var accessibleBucketIds = await dbContext.Buckets + .Where(b => b.TenantId == tenantId && (b.CreatedByID == loggedInEmployeeId || employeeBucketIds.Contains(b.Id))) + .Select(b => b.Id) + .ToListAsync(); + + contactQuery = contactQuery.Where(c => dbContext.ContactBucketMappings.Any(cbm => + cbm.ContactId == c.Id && accessibleBucketIds.Contains(cbm.BucketId))); + } + else + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get contact list due to lack of permissions.", loggedInEmployeeId); + return ApiResponse.SuccessResponse("Access Denied", "You do not have permission to view any contacts.", 403); + } + } + + // --- Advanced Filtering from 'filter' parameter --- + ContactFilterDto? contactFilter = TryDeserializeFilter(filter); + if (contactFilter?.BucketIds?.Any() ?? false) + { + // Note: Permission filtering is already applied. Here we further restrict by the user's filter choice. + contactQuery = contactQuery.Where(c => dbContext.ContactBucketMappings.Any(cbm => + cbm.ContactId == c.Id && contactFilter.BucketIds.Contains(cbm.BucketId))); + } + if (contactFilter?.CategoryIds?.Any() ?? false) + { + contactQuery = contactQuery.Where(c => c.ContactCategoryId.HasValue && contactFilter.CategoryIds.Contains(c.ContactCategoryId.Value)); + } + + // --- Standard Filtering --- + if (projectId != null) + { + contactQuery = contactQuery.Where(c => dbContext.ContactProjectMappings.Any(cpm => cpm.ContactId == c.Id && cpm.ProjectId == projectId)); + } + + // --- Search Term Filtering --- + if (!string.IsNullOrWhiteSpace(search)) + { + var searchTermLower = search.ToLower(); + contactQuery = contactQuery.Where(c => + (c.Name != null && c.Name.ToLower().Contains(searchTermLower)) || + (c.Organization != null && c.Organization.ToLower().Contains(searchTermLower)) || + dbContext.ContactsEmails.Any(e => e.ContactId == c.Id && e.EmailAddress.ToLower().Contains(searchTermLower)) || + dbContext.ContactsPhones.Any(p => p.ContactId == c.Id && p.PhoneNumber.ToLower().Contains(searchTermLower)) || + dbContext.ContactTagMappings.Any(ctm => ctm.ContactId == c.Id && ctm.ContactTag != null && ctm.ContactTag.Name.ToLower().Contains(searchTermLower)) + ); + } + + // Step 3: Get the total count for pagination before applying Skip/Take. + var totalCount = await contactQuery.CountAsync(); + if (totalCount == 0) + { + return ApiResponse.SuccessResponse(new { TotalPages = 0, CurrentPage = pageNumber, PageSize = pageSize, Data = new List() }, "No contacts found matching the criteria.", 200); + } + + // Step 4: Apply ordering and pagination to get the primary Contact entities for the current page. + var contacts = await contactQuery + .OrderBy(c => c.Name) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .Include(c => c.ContactCategory) // Include direct navigation properties if they exist + .ToListAsync(); + + var finalContactIds = contacts.Select(c => c.Id).ToList(); + + // Step 5: Batch-fetch all related data for only the contacts on the current page. + // This is highly efficient and avoids the N+1 problem. + var phonesTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactsPhones + .Where(p => finalContactIds.Contains(p.ContactId)) + .ToListAsync(); + }); + + var emailsTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactsEmails + .Where(e => finalContactIds.Contains(e.ContactId)) + .ToListAsync(); + }); + + var tagsTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactTagMappings + .Include(t => t.ContactTag) + .Where(t => finalContactIds.Contains(t.ContactId)) + .ToListAsync(); + }); + + var projectsTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactProjectMappings + .Where(p => finalContactIds.Contains(p.ContactId)) + .ToListAsync(); + }); + + var bucketsTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactBucketMappings + .Where(b => finalContactIds.Contains(b.ContactId)) + .ToListAsync(); + }); + + // Now, await all the independent, thread-safe tasks. + await Task.WhenAll(phonesTask, emailsTask, tagsTask, projectsTask, bucketsTask); + + // Use Lookups for efficient in-memory mapping. + var phonesLookup = (phonesTask.Result).ToLookup(p => p.ContactId); + var emailsLookup = (emailsTask.Result).ToLookup(e => e.ContactId); + var tagsLookup = (tagsTask.Result).ToLookup(t => t.ContactId); + var projectsLookup = (projectsTask.Result).ToLookup(p => p.ContactId); + var bucketsLookup = (bucketsTask.Result).ToLookup(b => b.ContactId); + + // Step 6: Map entities to ViewModels, populating with the pre-fetched related data. + var list = contacts.Select(c => + { + var contactVM = _mapper.Map(c); + contactVM.ContactPhones = _mapper.Map>(phonesLookup[c.Id]); + contactVM.ContactEmails = _mapper.Map>(emailsLookup[c.Id]); + contactVM.Tags = _mapper.Map>(tagsLookup[c.Id].Select(ctm => ctm.ContactTag)); + contactVM.ProjectIds = projectsLookup[c.Id].Select(p => p.ProjectId).ToList(); + contactVM.BucketIds = bucketsLookup[c.Id].Select(b => b.BucketId).ToList(); + return contactVM; + }).ToList(); + + // Step 7: Construct and return the final response. + var response = new + { + TotalPages = (int)Math.Ceiling((double)totalCount / pageSize), + CurrentPage = pageNumber, + PageSize = pageSize, + Data = list + }; + + _logger.LogInfo("{Count} contacts were fetched successfully for Tenant {TenantId} by Employee {EmployeeId}", list.Count, tenantId, loggedInEmployeeId); + return ApiResponse.SuccessResponse(response, $"{list.Count} contacts fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "An unexpected error occurred while fetching contact list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, loggedInEmployeeId); + return ApiResponse.ErrorResponse("An internal error occurred.", ExceptionMapper(ex), 500); + } + } + public async Task> GetListOfContactsOld(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); + List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).ToListAsync(); + bucketIds = buckets.Select(b => b.Id).ToList(); + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + var buckets = await _context.Buckets.Where(b => b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); + var createdBucketIds = buckets.Select(b => b.Id).ToList(); + bucketIds.AddRange(createdBucketIds); + bucketIds = bucketIds.Distinct().ToList(); + } + else + { + _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts, but do not have permission", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + } + + List filterbucketIds = bucketIds; + if (filterDto != null && filterDto.BucketIds != null && filterDto.BucketIds.Count > 0) + { + filterbucketIds = filterDto.BucketIds; + } + List? contactBuckets = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); + List contactIds = contactBuckets.Where(b => filterbucketIds.Contains(b.BucketId)).Select(cb => cb.ContactId).ToList(); + List contacts = new List(); + + var contactProjects = await _context.ContactProjectMappings.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); + + if (projectId != null && projectId != Guid.Empty) + { + contactProjects = contactProjects.Where(p => p.ProjectId == projectId).ToList(); + contactIds = contactProjects.Select(p => p.ContactId).Distinct().ToList(); + } + + if (filterDto != null && filterDto.CategoryIds != null && filterDto.CategoryIds.Count > 0) + { + var categoryIds = filterDto.CategoryIds; + contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && categoryIds.Contains(c.ContactCategoryId ?? Guid.Empty) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); + } + else + { + contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); + } + + var phoneNo = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); + var Emails = await _context.ContactsEmails.Where(E => contactIds.Contains(E.ContactId)).ToListAsync(); + var Tags = await _context.ContactTagMappings.Where(t => contactIds.Contains(t.ContactId)).ToListAsync(); + + List TagIds = Tags.Select(t => t.ContactTagId).ToList(); + + var TagList = await _context.ContactTagMasters.Where(t => TagIds.Contains(t.Id)).ToListAsync(); + + if (search != null && search != string.Empty) + { + List filteredContactIds = new List(); + phoneNo = phoneNo.Where(p => Compare(p.PhoneNumber, search)).ToList(); + filteredContactIds = phoneNo.Select(p => p.ContactId).ToList(); + + Emails = Emails.Where(e => Compare(e.EmailAddress, search)).ToList(); + filteredContactIds.AddRange(Emails.Select(e => e.ContactId).ToList()); + filteredContactIds = filteredContactIds.Distinct().ToList(); + + contacts = contacts.Where(c => Compare(c.Name, search) || Compare(c.Organization, search) || filteredContactIds.Contains(c.Id)).ToList(); + } + + List list = new List(); + + foreach (var contact in contacts) + { + + ContactVM contactVM = new ContactVM(); + List contactEmailVms = new List(); + List contactPhoneVms = new List(); + + List conatctTagVms = new List(); + var phones = phoneNo.Where(p => p.ContactId == contact.Id).ToList(); + var emails = Emails.Where(e => e.ContactId == contact.Id).ToList(); + var tagMappingss = Tags.Where(t => t.ContactId == contact.Id).ToList(); + var projectMapping = contactProjects.Where(p => p.ContactId == contact.Id).ToList(); + var bucketMapping = contactBuckets.Where(b => b.ContactId == contact.Id).ToList(); + + + if (emails != null && emails.Count > 0) + { + foreach (var email in emails) + { + ContactEmailVM emailVM = new ContactEmailVM(); + emailVM = email.ToContactEmailVMFromContactEmail(); + contactEmailVms.Add(emailVM); + } + } + + if (phones != null && phones.Count > 0) + { + foreach (var phone in phones) + { + ContactPhoneVM phoneVM = new ContactPhoneVM(); + phoneVM = phone.ToContactPhoneVMFromContactPhone(); + contactPhoneVms.Add(phoneVM); + } + + } + if (tagMappingss != null && tagMappingss.Count > 0) + { + foreach (var tagMapping in tagMappingss) + { + ContactTagVM tagVM = new ContactTagVM(); ; + var tag = TagList.Find(t => t.Id == tagMapping.ContactTagId); + + tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); + conatctTagVms.Add(tagVM); + + + } + } + contactVM = contact.ToContactVMFromContact(); + + if (projectMapping != null && projectMapping.Count > 0) + { + contactVM.ProjectIds = projectMapping.Select(p => p.ProjectId).ToList(); + } + if (bucketMapping != null && bucketMapping.Count > 0) + { + contactVM.BucketIds = bucketMapping.Select(p => p.BucketId).ToList(); + } + + contactVM.ContactEmails = contactEmailVms; + contactVM.ContactPhones = contactPhoneVms; + contactVM.Tags = conatctTagVms; + + list.Add(contactVM); + } + _logger.LogInfo("{count} contacts are fetched by Employee with ID {LoggedInEmployeeId}", list.Count, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(list, System.String.Format("{0} contacts fetched successfully", list.Count), 200); + + } + public async Task> GetContactsListByBucketId(Guid id) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (id != Guid.Empty) + { + Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == id && b.TenantId == tenantId); + if (bucket == null) + { + _logger.LogInfo("Employee ID {EmployeeId} attempted access to bucket ID {BucketId}, but not found in database", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); + } + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(em => em.BucketId == id).ToListAsync(); + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + + EmployeeBucketMapping? employeeBucket = null; + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + employeeBucket = employeeBuckets.FirstOrDefault(); + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + employeeBucket = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == LoggedInEmployee.Id); + } + else + { + _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts with in bucket {BucketId}, but do not have permission", LoggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + } + + if (employeeBucket == null) + { + _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have access to this bucket.", "You do not have access to this bucket.", 401); + } + + List contactBucket = await _context.ContactBucketMappings.Where(cb => cb.BucketId == id).ToListAsync() ?? new List(); + List contactVMs = new List(); + if (contactBucket.Count > 0) + { + var contactIds = contactBucket.Select(cb => cb.ContactId).ToList(); + List contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); + List phones = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); + List emails = await _context.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); + + List? tags = await _context.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); + List? contactProjects = await _context.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + List? contactBuckets = await _context.ContactBucketMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + + List tagIds = new List(); + List tagMasters = new List(); + if (tags.Count > 0) + { + tagIds = tags.Select(ct => ct.ContactTagId).ToList(); + tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); + } + + if (contacts.Count > 0) + { + + + foreach (var contact in contacts) + { + List? emailVMs = new List(); + List? phoneVMs = new List(); + List? tagVMs = new List(); + + List contactPhones = phones.Where(p => p.ContactId == contact.Id).ToList(); + List contactEmails = emails.Where(e => e.ContactId == contact.Id).ToList(); + + List? contactTags = tags.Where(t => t.ContactId == contact.Id).ToList(); + List? projectMappings = contactProjects.Where(cp => cp.ContactId == contact.Id).ToList(); + List? bucketMappings = contactBuckets.Where(cb => cb.ContactId == contact.Id).ToList(); + + if (contactPhones.Count > 0) + { + foreach (var phone in contactPhones) + { + ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); + phoneVMs.Add(phoneVM); + } + } + if (contactEmails.Count > 0) + { + foreach (var email in contactEmails) + { + ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); + emailVMs.Add(emailVM); + } + } + if (contactTags.Count > 0) + { + foreach (var contactTag in contactTags) + { + ContactTagMaster? tagMaster = tagMasters.Find(t => t.Id == contactTag.ContactTagId); + if (tagMaster != null) + { + ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); + tagVMs.Add(tagVM); + } + } + } + ContactVM contactVM = contact.ToContactVMFromContact(); + contactVM.ContactEmails = emailVMs; + contactVM.ContactPhones = phoneVMs; + contactVM.Tags = tagVMs; + contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); + contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); + contactVMs.Add(contactVM); + } + } + + } + _logger.LogInfo("{count} contact from Bucket {BucketId} fetched by Employee {EmployeeId}", contactVMs.Count, id, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully", 200); + } + _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); + } + public async Task> GetContactProfile(Guid id) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (id != Guid.Empty) + { + Contact? contact = await _context.Contacts.Include(c => c.ContactCategory).Include(c => c.CreatedBy).FirstOrDefaultAsync(c => c.Id == id && c.IsActive); + if (contact == null) + { + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + ContactProfileVM contactVM = contact.ToContactProfileVMFromContact(); + DirectoryUpdateLog? updateLog = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => l.RefereanceId == contact.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefaultAsync(); + if (updateLog != null) + { + contactVM.UpdatedAt = updateLog.UpdateAt; + contactVM.UpdatedBy = updateLog.Employee != null ? updateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; + } + + List? phones = await _context.ContactsPhones.Where(p => p.ContactId == contact.Id).ToListAsync(); + if (phones.Any()) + { + List? phoneVMs = new List(); + foreach (var phone in phones) + { + ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); + phoneVMs.Add(phoneVM); + } + contactVM.ContactPhones = phoneVMs; + } + + List? emails = await _context.ContactsEmails.Where(e => e.ContactId == contact.Id).ToListAsync(); + if (emails.Any()) + { + List? emailVMs = new List(); + foreach (var email in emails) + { + ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); + emailVMs.Add(emailVM); + } + contactVM.ContactEmails = emailVMs; + } + + List? contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); + if (contactProjects.Any()) + { + List projectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); + List? projects = await _context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); + List? projectVMs = new List(); + foreach (var project in projects) + { + BasicProjectVM projectVM = new BasicProjectVM + { + Id = project.Id, + Name = project.Name + }; + projectVMs.Add(projectVM); + } + contactVM.Projects = projectVMs; + } + List? contactBuckets = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); + if (contactBuckets.Any() && employeeBuckets.Any()) + { + List contactBucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); + List employeeBucketIds = employeeBuckets.Select(eb => eb.BucketId).ToList(); + List? buckets = await _context.Buckets.Where(b => contactBucketIds.Contains(b.Id) && employeeBucketIds.Contains(b.Id)).ToListAsync(); + List? bucketVMs = new List(); + foreach (var bucket in buckets) + { + BucketVM bucketVM = bucket.ToBucketVMFromBucket(); + bucketVMs.Add(bucketVM); + } + contactVM.Buckets = bucketVMs; + } + List? contactTags = await _context.ContactTagMappings.Where(ct => ct.ContactId == contact.Id).ToListAsync(); + if (contactTags.Any()) + { + List tagIds = contactTags.Select(ct => ct.ContactTagId).ToList(); + List tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); + List tagVMs = new List(); + foreach (var tagMaster in tagMasters) + { + ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); + tagVMs.Add(tagVM); + } + contactVM.Tags = tagVMs; + } + List? notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive).ToListAsync(); + if (notes.Any()) + { + List? noteIds = notes.Select(n => n.Id).ToList(); + List? noteUpdateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).OrderByDescending(l => l.UpdateAt).ToListAsync(); + List? noteVMs = new List(); + foreach (var note in notes) + { + DirectoryUpdateLog? noteUpdateLog = noteUpdateLogs.Where(n => n.RefereanceId == note.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefault(); + ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); + if (noteUpdateLog != null) + { + noteVM.UpdatedAt = noteUpdateLog.UpdateAt; + noteVM.UpdatedBy = noteUpdateLog.Employee != null ? noteUpdateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; + } + noteVMs.Add(noteVM); + } + contactVM.Notes = noteVMs; + } + _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", LoggedInEmployee.Id, contact.Id); + return ApiResponse.SuccessResponse(contactVM, "Contact profile fetched successfully"); + + } + _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); + } + public async Task> GetOrganizationList() + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var organizationList = await _context.Contacts.Where(c => c.TenantId == tenantId).Select(c => c.Organization).Distinct().ToListAsync(); + _logger.LogInfo("Employee {EmployeeId} fetched list of organizations in a tenant {TenantId}", LoggedInEmployee.Id, tenantId); + return ApiResponse.SuccessResponse(organizationList, $"{organizationList.Count} records of organization names fetched from contacts", 200); + } + + #endregion + + #region =================================================================== Contact Post APIs =================================================================== + public async Task> CreateContact(CreateContactDto createContact) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (createContact != null) + { + List phones = new List(); + List emails = new List(); + List contactBucketMappings = new List(); + List contactTagMappings = new List(); + + Contact? contact = createContact.ToContactFromCreateContactDto(tenantId, LoggedInEmployee.Id); + + _context.Contacts.Add(contact); + await _context.SaveChangesAsync(); + _logger.LogInfo("Contact with ID {ContactId} created by Employee with ID {LoggedInEmployeeId}", contact.Id, LoggedInEmployee.Id); + + var tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); + var tagNames = tags.Select(t => t.Name.ToLower()).ToList(); + var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).Select(b => b.Id).ToListAsync(); + var projects = await _context.Projects.Where(p => p.TenantId == tenantId).Select(p => p.Id).ToListAsync(); + + if (createContact.ContactPhones != null) + { + + foreach (var contactPhone in createContact.ContactPhones) + { + ContactPhone phone = contactPhone.ToContactPhoneFromCreateContactPhoneDto(tenantId, contact.Id); + phones.Add(phone); + } + _context.ContactsPhones.AddRange(phones); + _logger.LogInfo("{count} phone number are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", phones.Count, contact.Id, LoggedInEmployee.Id); + } + if (createContact.ContactEmails != null) + { + + foreach (var contactEmail in createContact.ContactEmails) + { + ContactEmail email = contactEmail.ToContactEmailFromCreateContactEmailDto(tenantId, contact.Id); + emails.Add(email); + } + _context.ContactsEmails.AddRange(emails); + _logger.LogInfo("{count} email addresses are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", emails.Count, contact.Id, LoggedInEmployee.Id); + } + + if (createContact.BucketIds != null) + { + foreach (var bucket in createContact.BucketIds) + { + if (buckets.Contains(bucket)) + { + ContactBucketMapping bucketMapping = new ContactBucketMapping + { + BucketId = bucket, + ContactId = contact.Id + }; + contactBucketMappings.Add(bucketMapping); + } + } + _context.ContactBucketMappings.AddRange(contactBucketMappings); + _logger.LogInfo("Contact with ID {ContactId} added to {count} number of buckets by employee with ID {LoggedEmployeeId}", contact.Id, contactBucketMappings.Count, LoggedInEmployee.Id); + } + + if (createContact.ProjectIds != null) + { + List projectMappings = new List(); + foreach (var projectId in createContact.ProjectIds) + { + if (projects.Contains(projectId)) + { + ContactProjectMapping projectMapping = new ContactProjectMapping + { + ProjectId = projectId, + ContactId = contact.Id, + TenantId = tenantId + }; + projectMappings.Add(projectMapping); + } + } + _context.ContactProjectMappings.AddRange(projectMappings); + _logger.LogInfo("Contact with ID {ContactId} added to {count} number of project by employee with ID {LoggedEmployeeId}", contact.Id, projectMappings.Count, LoggedInEmployee.Id); + } + + if (createContact.Tags != null) + { + foreach (var tag in createContact.Tags) + { + if (tagNames.Contains(tag.Name.ToLower())) + { + ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); + _context.ContactTagMappings.Add(new ContactTagMapping + { + ContactId = contact.Id, + ContactTagId = tag.Id ?? existingTag.Id + }); + } + else if (tag.Id == null || tags.Where(t => t.Name == tag.Name) == null) + { + var newtag = new ContactTagMaster + { + Name = tag.Name, + TenantId = tenantId + }; + _context.ContactTagMasters.Add(newtag); + ContactTagMapping tagMapping = new ContactTagMapping + { + ContactTagId = newtag.Id, + ContactId = contact.Id + }; + contactTagMappings.Add(tagMapping); + } + } + + _context.ContactTagMappings.AddRange(contactTagMappings); + _logger.LogInfo("{count} number of tags added to Contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", contactTagMappings.Count, contact.Id, LoggedInEmployee.Id); + } + await _context.SaveChangesAsync(); + + ContactVM contactVM = new ContactVM(); + List phoneVMs = new List(); + + contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == contact.Id) ?? new Contact(); + var tagIds = contactTagMappings.Select(t => t.ContactTagId).ToList(); + tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId && tagIds.Contains(t.Id)).ToListAsync(); + List contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); + List bucketMappings = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); + foreach (var phone in phones) + { + ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); + phoneVMs.Add(phoneVM); + } + List emailVMs = new List(); + foreach (var email in emails) + { + ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); + emailVMs.Add(emailVM); + } + List tagVMs = new List(); + foreach (var contactTagMapping in contactTagMappings) + { + ContactTagVM tagVM = new ContactTagVM(); + var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); + tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); + tagVMs.Add(tagVM); + } + + + contactVM = contact.ToContactVMFromContact(); + contactVM.ContactPhones = phoneVMs; + contactVM.ContactEmails = emailVMs; + contactVM.Tags = tagVMs; + contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); + contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); + + return ApiResponse.SuccessResponse(contactVM, "Contact Created Successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + + #endregion + + #region =================================================================== Contact Put APIs =================================================================== + public async Task> UpdateContact(Guid id, UpdateContactDto updateContact) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (updateContact != null) + { + if (updateContact.Id != id) + { + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended different ID in payload and path parameter", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid data", "Invalid data", 400); + } + Contact? contact = await _context.Contacts.AsNoTracking().FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + if (contact == null) + { + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); + List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).ToListAsync(); + bucketIds = buckets.Select(b => b.Id).ToList(); + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + var buckets = await _context.Buckets.Where(b => b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); + var createdBucketIds = buckets.Select(b => b.Id).ToList(); + bucketIds.AddRange(createdBucketIds); + bucketIds = bucketIds.Distinct().ToList(); + } + else + { + _logger.LogWarning("Employee {EmployeeId} attemped to update a contact, but do not have permission", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + } + + List contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(m => m.ContactId == contact.Id && bucketIds.Contains(m.BucketId)).ToListAsync(); + bucketIds = contactBuckets.Select(b => b.BucketId).Distinct().ToList(); + + + + var newContact = updateContact.ToContactFromUpdateContactDto(tenantId, contact); + newContact.UpdatedById = LoggedInEmployee.Id; + newContact.UpdatedAt = DateTime.UtcNow; + _context.Contacts.Update(newContact); + await _context.SaveChangesAsync(); + + List phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + var phoneIds = phones.Select(p => p.Id).ToList(); + List emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + var emailIds = emails.Select(p => p.Id).ToList(); + + + + List contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); + var tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); + + + List contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); + var projectIds = contactProjects.Select(t => t.ProjectId).Distinct().ToList(); + + List tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); + List allTags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); + var tagNames = allTags.Select(t => t.Name.ToLower()).ToList(); + + if (updateContact.ContactPhones != null) + { + var updatedPhoneIds = updateContact.ContactPhones.Select(p => p.Id).Distinct().ToList(); + foreach (var phoneDto in updateContact.ContactPhones) + { + var phone = phoneDto.ToContactPhoneFromUpdateContactPhoneDto(tenantId, contact.Id); + if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && phoneIds.Contains(phone.Id)) + { + _context.ContactsPhones.Update(phone); + } + else + { + _context.ContactsPhones.Add(phone); + } + } + foreach (var phone in phones) + { + + if (!updatedPhoneIds.Contains(phone.Id)) + { + _context.ContactsPhones.Remove(phone); + } + } + } + else if (phones != null) + { + _context.ContactsPhones.RemoveRange(phones); + } + + if (updateContact.ContactEmails != null) + { + var updateEmailIds = updateContact.ContactEmails.Select(p => p.Id).Distinct().ToList(); + + foreach (var emailDto in updateContact.ContactEmails) + { + var email = emailDto.ToContactEmailFromUpdateContactEmailDto(tenantId, contact.Id); + if (emailDto.Id != null && emailDto.Id != Guid.Empty && emailIds.Contains(email.Id)) + { + _context.ContactsEmails.Update(email); + } + else + { + _context.ContactsEmails.Add(email); + } + } + foreach (var email in emails) + { + + if (!updateEmailIds.Contains(email.Id)) + { + _context.ContactsEmails.Remove(email); + } + } + } + else if (emails != null) + { + _context.ContactsEmails.RemoveRange(emails); + } + + if (updateContact.BucketIds != null) + { + foreach (var bucketId in updateContact.BucketIds) + { + if (!bucketIds.Contains(bucketId)) + { + _context.ContactBucketMappings.Add(new ContactBucketMapping + { + BucketId = bucketId, + ContactId = contact.Id + }); + } + } + foreach (var bucketMapping in contactBuckets) + { + if (!updateContact.BucketIds.Contains(bucketMapping.BucketId)) + { + _context.ContactBucketMappings.Remove(bucketMapping); + } + } + } + else if (contactBuckets != null) + { + _context.ContactBucketMappings.RemoveRange(contactBuckets); + } + + if (updateContact.ProjectIds != null) + { + foreach (var ProjectId in updateContact.ProjectIds) + { + if (!projectIds.Contains(ProjectId)) + { + _context.ContactProjectMappings.Add(new ContactProjectMapping + { + ProjectId = ProjectId, + ContactId = contact.Id, + TenantId = tenantId + }); + } + } + + foreach (var projectMapping in contactProjects) + { + if (!updateContact.ProjectIds.Contains(projectMapping.ProjectId)) + { + _context.ContactProjectMappings.Remove(projectMapping); + } + } + } + else if (contactProjects != null) + { + _context.ContactProjectMappings.RemoveRange(contactProjects); + } + + if (updateContact.Tags != null) + { + var updatedTagIds = updateContact.Tags.Select(t => t.Id).Distinct().ToList(); + foreach (var tag in updateContact.Tags) + { + var namecheck = tagNames.Contains(tag.Name.ToLower()); + var idCheck = (!tagIds.Contains(tag.Id ?? Guid.Empty)); + var test = namecheck && idCheck; + if (test) + { + ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); + _context.ContactTagMappings.Add(new ContactTagMapping + { + ContactId = contact.Id, + ContactTagId = tag.Id ?? existingTag.Id + }); + } + else if (tag.Id == null || tag.Id == Guid.Empty) + { + ContactTagMaster contactTag = new ContactTagMaster + { + Name = tag.Name, + Description = "", + TenantId = tenantId + }; + _context.ContactTagMasters.Add(contactTag); + + _context.ContactTagMappings.Add(new ContactTagMapping + { + ContactId = contact.Id, + ContactTagId = contactTag.Id + }); + } + } + foreach (var contactTag in contactTags) + { + if (!updatedTagIds.Contains(contactTag.ContactTagId)) + { + _context.ContactTagMappings.Remove(contactTag); + } + } + } + else if (contactTags != null) + { + _context.ContactTagMappings.RemoveRange(contactTags); + } + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contact.Id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + + contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); + phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); + contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == contact.Id).ToListAsync(); + contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == contact.Id).ToListAsync(); + tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); + tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); + + ContactVM contactVM = new ContactVM(); + List phoneVMs = new List(); + foreach (var phone in phones) + { + ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); + phoneVMs.Add(phoneVM); + } + List emailVMs = new List(); + foreach (var email in emails) + { + ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); + emailVMs.Add(emailVM); + } + List tagVMs = new List(); + foreach (var contactTagMapping in contactTags) + { + ContactTagVM tagVM = new ContactTagVM(); + var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); + tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); + tagVMs.Add(tagVM); + } + + + contactVM = contact.ToContactVMFromContact(); + contactVM.ContactPhones = phoneVMs; + contactVM.ContactEmails = emailVMs; + contactVM.Tags = tagVMs; + contactVM.BucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); + contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); + + _logger.LogInfo("Conatct {ContactId} has been updated by employee {EmployeeId}", contact.Id, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactVM, "Contact Updated Successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + #endregion + + #region =================================================================== Contact Delete APIs =================================================================== + public async Task> DeleteContact(Guid id, bool active) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (id != Guid.Empty) + { + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); + if (contact == null) + { + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to delete contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + contact.IsActive = active; + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contact.Id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + _logger.LogInfo("Contact {ContactId} has been deleted by Employee {Employee}", id, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(new { }, "Contact is deleted Successfully", 200); + } + _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); + } + #endregion + + #endregion + + #region =================================================================== Contact Notes APIs =================================================================== + + /// + /// Retrieves a paginated list of contact notes based on user permissions. + /// + /// The number of items per page. + /// The current page number. + /// An ApiResponse containing the paginated notes or an error message. + public async Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber) + { + _logger.LogInfo("Attempting to fetch list of all notes. PageSize: {PageSize}, PageNumber: {PageNumber}", pageSize, pageNumber); + + Guid tenantId = _userHelper.GetTenantId(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + List? projectContactIds = null; + + if (loggedInEmployee == null) + { + _logger.LogWarning("GetListOFAllNotes: LoggedInEmployee is null. Cannot proceed."); + return ApiResponse.ErrorResponse("Unauthorized", "Employee not found.", 401); + } + + // --- Permission Checks --- + var hasAdminPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); + var hasManagerPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); + var hasUserPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryUser, loggedInEmployee.Id); + + IQueryable notesQuery = _context.ContactNotes + .Include(cn => cn.UpdatedBy) + .Include(cn => cn.Createdby) // Assuming 'CreatedBy' (PascalCase) + .Include(cn => cn.Contact) + .Where(cn => cn.TenantId == tenantId) + .AsQueryable(); // Start building the query + + if (!hasAdminPermission && !(hasManagerPermission || hasUserPermission)) + { + _logger.LogWarning("GetListOFAllNotes: User {EmployeeId} does not have required permissions to access notes for TenantId: {TenantId}", loggedInEmployee.Id, tenantId); + return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); + } + if (projectId != null) + { + projectContactIds = await _context.ContactProjectMappings + .Where(pc => pc.ProjectId == projectId) + .Select(pc => pc.ContactId) + .ToListAsync(); + } + if (!hasAdminPermission) // If not an admin, apply additional filtering + { + _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} is not an admin. Applying manager/user specific filters.", loggedInEmployee.Id); + var assignedBucketIds = await _context.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToListAsync(); + + if (!assignedBucketIds.Any()) + { + _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} has no assigned buckets. Returning empty list.", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found based on assigned buckets.", 200); + } + + List? contactIds = null; + + if (projectContactIds == null) + { + contactIds = await _context.ContactBucketMappings + .Where(cb => assignedBucketIds.Contains(cb.BucketId)) + .Select(cb => cb.ContactId) + .ToListAsync(); + } + else + { + contactIds = await _context.ContactBucketMappings + .Where(cb => assignedBucketIds.Contains(cb.BucketId) && projectContactIds.Contains(cb.ContactId)) + .Select(cb => cb.ContactId) + .ToListAsync(); + } + + if (!contactIds.Any()) + { + _logger.LogInfo("GetListOFAllNotes: No contacts found for assigned buckets for user {EmployeeId}. Returning empty list.", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found for associated contacts.", 200); + } + + notesQuery = notesQuery.Where(cn => contactIds.Contains(cn.ContactId)); + } + else + { + if (projectContactIds != null) + { + notesQuery = notesQuery.Where(cn => projectContactIds.Contains(cn.ContactId)); + } + } + + // --- Pagination Logic --- + // Ensure pageSize and pageNumber are valid + pageSize = pageSize < 1 ? 25 : pageSize; // Default to 25 if less than 1 + pageNumber = pageNumber < 1 ? 1 : pageNumber; // Default to 1 if less than 1 + + // Get total count BEFORE applying Skip/Take for accurate pagination metadata + int totalRecords = await notesQuery.CountAsync(); + int totalPages = (int)Math.Ceiling((double)totalRecords / pageSize); + + int skip = (pageNumber - 1) * pageSize; + + // --- Apply Ordering and Pagination in the database --- + List notes = await notesQuery + .OrderByDescending(cn => (cn.UpdatedAt != null ? cn.UpdatedAt : cn.CreatedAt)) // Order by updated date or created date + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(); + + _logger.LogInfo("GetListOFAllNotes: Fetched {Count} notes for page {PageNumber} of {TotalPages} total pages. Total records: {TotalRecords}.", + notes.Count, pageNumber, totalPages, totalRecords); + + // --- Map to ViewModel (in-memory) --- + // This mapping is done in memory because ToBasicEmployeeVMFromEmployee() is likely a C# method + // that cannot be translated to SQL by Entity Framework. + + List noteVMS = notes + .Select(cn => cn.ToContactNoteVMFromContactNote()) + .ToList(); + + var response = new + { + CurrentPage = pageNumber, + PageSize = pageSize, // Include pageSize in response for client clarity + TotalPages = totalPages, + TotalRecords = totalRecords, // Add total records for client + Data = noteVMS + }; + + _logger.LogInfo("GetListOFAllNotes: Successfully retrieved notes and mapped to ViewModel for TenantId: {TenantId}.", tenantId); + return ApiResponse.SuccessResponse(response, $"{noteVMS.Count} notes fetched successfully.", 200); + } + public async Task> GetNoteListByContactId(Guid id, bool active) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + if (contact != null) + { + List notes = new List(); + if (active) + { + notes = await _context.ContactNotes + .Include(n => n.Createdby) + .Include(n => n.UpdatedBy) + .Where(n => n.ContactId == contact.Id && n.IsActive && n.TenantId == tenantId) + .ToListAsync(); + } + else + { + notes = await _context.ContactNotes + .Include(n => n.Createdby) + .Include(n => n.UpdatedBy) + .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId) + .ToListAsync(); + } + var noteIds = notes.Select(n => n.Id).ToList(); + List? updateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).ToListAsync(); + //List? noteVMs = new List(); + List? noteVMs = notes.Select(n => n.ToContactNoteVMFromContactNote()).ToList(); + + _logger.LogInfo("{count} contact-notes record from contact {ContactId} fetched by Employee {EmployeeId}", noteVMs.Count, id, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(noteVMs, $"{noteVMs.Count} contact-notes record fetched successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to fetch a list notes from contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + public async Task> CreateContactNote(CreateContactNoteDto noteDto) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (noteDto != null) + { + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.IsActive && c.TenantId == tenantId); + if (contact != null) + { + ContactNote note = noteDto.ToContactNoteFromCreateContactNoteDto(tenantId, LoggedInEmployee.Id); + _context.ContactNotes.Add(note); + await _context.SaveChangesAsync(); + ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); + _logger.LogInfo("Employee {EmployeeId} Added note at contact {ContactId}", LoggedInEmployee.Id, contact.Id); + return ApiResponse.SuccessResponse(noteVM, "Note added successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to add a note to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.ContactId); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (noteDto != null && id == noteDto.Id) + { + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.TenantId == tenantId); + if (contact != null) + { + ContactNote? contactNote = await _context.ContactNotes.Include(cn => cn.Createdby).Include(cn => cn.Contact).FirstOrDefaultAsync(n => n.Id == noteDto.Id && n.ContactId == contact.Id && n.IsActive); + if (contactNote != null) + { + contactNote.Note = noteDto.Note; + contactNote.UpdatedById = LoggedInEmployee.Id; + contactNote.UpdatedAt = DateTime.UtcNow; + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + ContactNoteVM noteVM = contactNote.ToContactNoteVMFromContactNote(); + noteVM.UpdatedAt = DateTime.UtcNow; + noteVM.UpdatedBy = LoggedInEmployee.ToBasicEmployeeVMFromEmployee(); + + _logger.LogInfo("Employee {EmployeeId} updated note {NoteId} at contact {ContactId}", LoggedInEmployee.Id, noteVM.Id, contact.Id); + return ApiResponse.SuccessResponse(noteVM, "Note updated successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the Note was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); + return ApiResponse.ErrorResponse("Note not found", "Note not found", 404); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> DeleteContactNote(Guid id, bool active) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + ContactNote? note = await _context.ContactNotes.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); + if (note != null) + { + note.IsActive = active; + note.UpdatedById = LoggedInEmployee.Id; + note.UpdatedAt = DateTime.UtcNow; + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + await _context.SaveChangesAsync(); + _logger.LogInfo("Employee {EmployeeId} deleted note {NoteId}", LoggedInEmployee.Id, id); + } + + _logger.LogWarning("Employee {EmployeeId} tries to delete contact note {NoteId} but not found in database", LoggedInEmployee.Id, id); + return ApiResponse.SuccessResponse(new { }, "Note deleted successfully", 200); + } + + #endregion + + #region =================================================================== Bucket APIs =================================================================== + + public async Task> GetBucketList() + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + + List employeeBuckets = await _context.EmployeeBucketMappings.Where(b => b.EmployeeId == LoggedInEmployee.Id).ToListAsync(); + var bucketIds = employeeBuckets.Select(b => b.BucketId).ToList(); + + List bucketList = new List(); + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => b.TenantId == tenantId).ToListAsync(); + bucketIds = bucketList.Select(b => b.Id).ToList(); + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => bucketIds.Contains(b.Id) || b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); + } + else + { + _logger.LogWarning("Employee {EmployeeId} attemped to access a buckets list, but do not have permission", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + } + + List employeeBucketVM = await _context.EmployeeBucketMappings.Where(b => bucketIds.Contains(b.BucketId)).ToListAsync(); + + List bucketVMs = new List(); + if (bucketList.Any()) + { + bucketIds = bucketList.Select(b => b.Id).ToList(); + List? contactBucketMappings = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); + foreach (var bucket in bucketList) + { + List employeeBucketMappings = employeeBucketVM.Where(eb => eb.BucketId == bucket.Id).ToList(); + var emplyeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); + List? contactBuckets = contactBucketMappings.Where(cb => cb.BucketId == bucket.Id).ToList(); + AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); + if (bucketVM.CreatedBy != null) + { + emplyeeIds.Add(bucketVM.CreatedBy.Id); + } + bucketVM.EmployeeIds = emplyeeIds.Distinct().ToList(); + bucketVM.NumberOfContacts = contactBuckets.Count; + bucketVMs.Add(bucketVM); + } + } + + _logger.LogInfo("{count} Buckets are fetched by Employee with ID {LoggedInEmployeeId}", bucketVMs.Count, LoggedInEmployee.Id); + return ApiResponse.SuccessResponse(bucketVMs, $"{bucketVMs.Count} buckets fetched successfully", 200); + } + public async Task> CreateBucket(CreateBucketDto bucketDto) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (bucketDto != null) + { + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + var demo = !permissionIds.Contains(PermissionsMaster.DirectoryUser); + if (!permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + _logger.LogWarning("Employee {EmployeeId} attemped to create a bucket, but do not have permission", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + } + + var existingBucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Name == bucketDto.Name); + if (existingBucket != null) + { + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing bucket.", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket already existed", "Bucket already existed", 409); + } + Bucket bucket = new Bucket + { + Name = bucketDto.Name, + Description = bucketDto.Description, + CreatedAt = DateTime.UtcNow, + CreatedByID = LoggedInEmployee.Id, + TenantId = tenantId + }; + _context.Buckets.Add(bucket); + + EmployeeBucketMapping employeeBucket = new EmployeeBucketMapping + { + EmployeeId = LoggedInEmployee.Id, + BucketId = bucket.Id + }; + + _context.EmployeeBucketMappings.Add(employeeBucket); + await _context.SaveChangesAsync(); + bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucket.Id) ?? new Bucket(); + BucketVM bucketVM = bucket.ToBucketVMFromBucket(); + _logger.LogInfo("Employee Id {LoggedInEmployeeId} creayted new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); + return ApiResponse.SuccessResponse(bucketVM, "Bucket Created SuccessFully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> UpdateBucket(Guid id, UpdateBucketDto bucketDto) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (bucketDto != null && id == bucketDto.Id) + { + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); + var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); + Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketDto.Id && b.TenantId == tenantId); + + if (bucket == null) + { + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); + } + + Bucket? accessableBucket = null; + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + if (bucket.CreatedByID == LoggedInEmployee.Id) + { + accessableBucket = bucket; + } + } + if (accessableBucket == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + } + + bucket.Name = bucketDto.Name ?? ""; + bucket.Description = bucketDto.Description ?? ""; + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = bucketDto.Id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + + AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); + List employeeBucketMappings = employeeBuckets.Where(eb => eb.BucketId == bucket.Id).ToList(); + List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); + var employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); + bucketVM.EmployeeIds = employeeIds; + bucketVM.NumberOfContacts = contactBuckets.Count; + + _logger.LogInfo("Employee Id {LoggedInEmployeeId} Updated new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); + return ApiResponse.SuccessResponse(bucketVM, "Bucket update successFully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> AssignBucket(Guid bucketId, List assignBuckets) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (assignBuckets != null && bucketId != Guid.Empty) + { + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + + Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + + if (bucket == null) + { + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); + } + var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucketId).ToListAsync(); + var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); + var employeeBucketIds = employeeBuckets.Select(eb => eb.EmployeeId).ToList(); + Bucket? accessableBucket = null; + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(bucketId)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + if (bucket.CreatedByID == LoggedInEmployee.Id) + { + accessableBucket = bucket; + } + } + if (accessableBucket == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + } + var employeeIds = await _context.Employees.Where(e => e.TenantId == tenantId && e.IsActive).Select(e => e.Id).ToListAsync(); + int assignedEmployee = 0; + int removededEmployee = 0; + foreach (var assignBucket in assignBuckets) + { + if (employeeIds.Contains(assignBucket.EmployeeId)) + { + if (assignBucket.IsActive && !employeeBucketIds.Contains(assignBucket.EmployeeId)) + { + EmployeeBucketMapping employeeBucketMapping = new EmployeeBucketMapping + { + EmployeeId = assignBucket.EmployeeId, + BucketId = bucketId + }; + _context.EmployeeBucketMappings.Add(employeeBucketMapping); + assignedEmployee += 1; + } + else if (!assignBucket.IsActive) + { + EmployeeBucketMapping? employeeBucketMapping = employeeBuckets.FirstOrDefault(eb => eb.BucketId == bucketId && eb.EmployeeId == assignBucket.EmployeeId); + if (employeeBucketMapping != null) + { + _context.EmployeeBucketMappings.Remove(employeeBucketMapping); + removededEmployee += 1; + } + } + } + } + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = bucketId, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + + AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); + List employeeBucketMappings = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); + List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); + employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); + bucketVM.EmployeeIds = employeeIds; + bucketVM.NumberOfContacts = contactBuckets.Count; + + if (assignedEmployee > 0) + { + _logger.LogInfo("Employee {EmployeeId} assigned bucket {BucketId} to {conut} number of employees", LoggedInEmployee.Id, bucketId, assignedEmployee); + } + if (removededEmployee > 0) + { + _logger.LogWarning("Employee {EmployeeId} removed {conut} number of employees from bucket {BucketId}", LoggedInEmployee.Id, removededEmployee, bucketId); + } + return ApiResponse.SuccessResponse(bucketVM, "Details updated successfully", 200); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> DeleteBucket(Guid id) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); + + if (bucket != null) + { + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); + List? contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); + + if (contactBuckets.Any()) + { + _logger.LogInfo("Employee {EmployeeId} attempted to deleted bucket {BucketId},but bucket have contacts in it.", LoggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("This bucket can not be deleted", "This bucket can not be deleted", 400); + } + + var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); + var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); + + Bucket? accessableBucket = null; + if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) + { + accessableBucket = bucket; + } + else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) + { + if (bucket.CreatedByID == LoggedInEmployee.Id) + { + accessableBucket = bucket; + } + } + if (accessableBucket == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + } + + _context.EmployeeBucketMappings.RemoveRange(employeeBuckets); + _context.Buckets.Remove(bucket); + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = LoggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + await _context.SaveChangesAsync(); + _logger.LogInfo("Employee {EmployeeId} deleted bucket {BucketId} and related entries", LoggedInEmployee.Id, id); + return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); + } + + _logger.LogWarning("Employee {EmployeeId} tries to delete bucket {BucketId} but not found in database", LoggedInEmployee.Id, id); + return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); + } + + #endregion + + #region =================================================================== Helper Functions =================================================================== + + private bool Compare(string sentence, string search) + { + sentence = sentence.Trim().ToLower(); + search = search.Trim().ToLower(); + + // Check for exact substring + bool result = sentence.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; + return result; + } + + private ContactFilterDto? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + ContactFilterDto? expenseFilter = null; + + try + { + // First, try to deserialize directly. This is the expected case (e.g., from a web client). + expenseFilter = JsonSerializer.Deserialize(filter, options); + } + catch (JsonException ex) + { + _logger.LogError(ex, "[{MethodName}] Failed to directly deserialize filter. Attempting to unescape and re-parse. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + + // If direct deserialization fails, it might be an escaped string (common with tools like Postman or some mobile clients). + try + { + // Unescape the string first, then deserialize the result. + string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; + if (!string.IsNullOrWhiteSpace(unescapedJsonString)) + { + expenseFilter = JsonSerializer.Deserialize(unescapedJsonString, options); + } + } + catch (JsonException ex1) + { + // If both attempts fail, log the final error and return null. + _logger.LogError(ex1, "[{MethodName}] All attempts to deserialize the filter failed. Filter will be ignored. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + return null; + } + } + return expenseFilter; + } + + private static object ExceptionMapper(Exception ex) + { + return new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + InnerException = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }; + } + + #endregion + } +} diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs new file mode 100644 index 0000000..1465e15 --- /dev/null +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -0,0 +1,28 @@ +using Marco.Pms.Model.Dtos.Directory; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Services.Service.ServiceInterfaces +{ + public interface IDirectoryService + { + Task> GetListOfContactsAsync(string? search, string? filter, Guid? projectId, bool active, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); + Task> GetListOfContactsOld(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId); + Task> GetContactsListByBucketId(Guid id); + Task> GetContactProfile(Guid id); + Task> GetOrganizationList(); + Task> CreateContact(CreateContactDto createContact); + Task> UpdateContact(Guid id, UpdateContactDto updateContact); + Task> DeleteContact(Guid id, bool active); + Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber); + Task> GetNoteListByContactId(Guid id, bool active); + Task> CreateContactNote(CreateContactNoteDto noteDto); + Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto); + Task> DeleteContactNote(Guid id, bool active); + Task> GetBucketList(); + Task> CreateBucket(CreateBucketDto bucketDto); + Task> UpdateBucket(Guid id, UpdateBucketDto bucketDto); + Task> AssignBucket(Guid bucketId, List assignBuckets); + Task> DeleteBucket(Guid id); + } +} -- 2.43.0 From 53a93542e918e6cbe093479e6bd7d29d366c4faf Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 28 Jul 2025 14:50:48 +0530 Subject: [PATCH 04/63] Optimized the Get contact details API --- .../ViewModels/Directory/ContactProfileVM.cs | 2 +- .../Controllers/DirectoryController.cs | 17 +- Marco.Pms.Services/Helpers/DirectoryHelper.cs | 38 +-- .../MappingProfiles/MappingProfile.cs | 4 + .../Service/DirectoryService.cs | 230 ++++++++++-------- .../ServiceInterfaces/IDirectoryService.cs | 2 +- 6 files changed, 151 insertions(+), 142 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs index 9e8f4cb..4969dfe 100644 --- a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs +++ b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs @@ -21,6 +21,6 @@ namespace Marco.Pms.Model.ViewModels.Directory public List Projects { get; set; } = new List(); public List Buckets { get; set; } = new List(); public List Tags { get; set; } = new List(); - public List Notes { get; set; } = new List(); + //public List Notes { get; set; } = new List(); } } diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 16da931..f63907b 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -41,6 +41,7 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet] public async Task GetContactList([FromQuery] string? search, [FromQuery] List? bucketIds, [FromQuery] List? categoryIds, [FromQuery] Guid? projectId, [FromQuery] bool active = true) { @@ -88,19 +89,9 @@ namespace Marco.Pms.Services.Controllers [HttpGet("profile/{id}")] public async Task GetContactProfile(Guid id) { - var response = await _directoryService.GetContactProfile(id); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetContactProfileAsync(id, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); } [HttpGet("organization")] diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs index 3dd578e..b2e9f73 100644 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ b/Marco.Pms.Services/Helpers/DirectoryHelper.cs @@ -825,25 +825,25 @@ namespace Marco.Pms.Services.Helpers } contactVM.Tags = tagVMs; } - List? notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive).ToListAsync(); - if (notes.Any()) - { - List? noteIds = notes.Select(n => n.Id).ToList(); - List? noteUpdateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).OrderByDescending(l => l.UpdateAt).ToListAsync(); - List? noteVMs = new List(); - foreach (var note in notes) - { - DirectoryUpdateLog? noteUpdateLog = noteUpdateLogs.Where(n => n.RefereanceId == note.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefault(); - ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - if (noteUpdateLog != null) - { - noteVM.UpdatedAt = noteUpdateLog.UpdateAt; - noteVM.UpdatedBy = noteUpdateLog.Employee != null ? noteUpdateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; - } - noteVMs.Add(noteVM); - } - contactVM.Notes = noteVMs; - } + //List? notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive).ToListAsync(); + //if (notes.Any()) + //{ + // List? noteIds = notes.Select(n => n.Id).ToList(); + // List? noteUpdateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).OrderByDescending(l => l.UpdateAt).ToListAsync(); + // List? noteVMs = new List(); + // foreach (var note in notes) + // { + // DirectoryUpdateLog? noteUpdateLog = noteUpdateLogs.Where(n => n.RefereanceId == note.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefault(); + // ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); + // if (noteUpdateLog != null) + // { + // noteVM.UpdatedAt = noteUpdateLog.UpdateAt; + // noteVM.UpdatedBy = noteUpdateLog.Employee != null ? noteUpdateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; + // } + // noteVMs.Add(noteVM); + // } + // contactVM.Notes = noteVMs; + //} _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", LoggedInEmployee.Id, contact.Id); return ApiResponse.SuccessResponse(contactVM, "Contact profile fetched successfully"); diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 46b119b..0fe8d22 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -5,6 +5,7 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Master; @@ -66,18 +67,21 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Employee ======================================================= CreateMap(); + CreateMap(); #endregion #region ======================================================= Directory ======================================================= CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); CreateMap(); + CreateMap(); #endregion diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 06883c6..ebcdbec 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -5,7 +5,6 @@ using Marco.Pms.Model.Dtos.Directory; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Mapper; -using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.Master; @@ -74,16 +73,7 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); // Step 1: Perform initial permission checks in parallel. - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - var hasAdminPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); - var hasManagerPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryManager, loggedInEmployee.Id); - var hasUserPermissionTask = permissionService.HasPermission(PermissionsMaster.DirectoryUser, loggedInEmployee.Id); - await Task.WhenAll(hasAdminPermissionTask, hasManagerPermissionTask, hasUserPermissionTask); - - var hasAdminPermission = hasAdminPermissionTask.Result; - var hasManagerPermission = hasManagerPermissionTask.Result; - var hasUserPermission = hasUserPermissionTask.Result; + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployeeId); // Step 2: Build the core IQueryable with all filtering logic applied on the server. // This is the most critical optimization. @@ -170,7 +160,7 @@ namespace Marco.Pms.Services.Service { await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); return await taskDbContext.ContactsPhones - .Where(p => finalContactIds.Contains(p.ContactId)) + .Where(p => finalContactIds.Contains(p.ContactId) && p.TenantId == tenantId) .ToListAsync(); }); @@ -178,7 +168,7 @@ namespace Marco.Pms.Services.Service { await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); return await taskDbContext.ContactsEmails - .Where(e => finalContactIds.Contains(e.ContactId)) + .Where(e => finalContactIds.Contains(e.ContactId) && e.TenantId == tenantId) .ToListAsync(); }); @@ -512,120 +502,129 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", LoggedInEmployee.Id); return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); } - public async Task> GetContactProfile(Guid id) + public async Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (id != Guid.Empty) + Guid loggedInEmployeeId = loggedInEmployee.Id; + if (id == Guid.Empty) { - Contact? contact = await _context.Contacts.Include(c => c.ContactCategory).Include(c => c.CreatedBy).FirstOrDefaultAsync(c => c.Id == id && c.IsActive); + _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", loggedInEmployeeId); + return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); + } + try + { + // Use a single DbContext for the entire operation to ensure consistency. + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + + // Step 1: Perform initial permission checks in parallel. + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployeeId); + + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get contact profile due to lack of permissions.", loggedInEmployeeId); + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to view contact.", 403); + } + + Contact? contact = await dbContext.Contacts + .AsNoTracking() // Use AsNoTracking for read-only operations to improve performance. + .Include(c => c.ContactCategory) + .Include(c => c.CreatedBy) + .Include(c => c.UpdatedBy) + .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); if (contact == null) { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", loggedInEmployeeId); return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); } - ContactProfileVM contactVM = contact.ToContactProfileVMFromContact(); - DirectoryUpdateLog? updateLog = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => l.RefereanceId == contact.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefaultAsync(); - if (updateLog != null) - { - contactVM.UpdatedAt = updateLog.UpdateAt; - contactVM.UpdatedBy = updateLog.Employee != null ? updateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; - } + ContactProfileVM contactVM = _mapper.Map(contact); - List? phones = await _context.ContactsPhones.Where(p => p.ContactId == contact.Id).ToListAsync(); - if (phones.Any()) + var phonesTask = Task.Run(async () => { - List? phoneVMs = new List(); - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - contactVM.ContactPhones = phoneVMs; - } + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactsPhones + .AsNoTracking() + .Where(p => p.ContactId == contact.Id && p.TenantId == tenantId) + .Select(p => _mapper.Map(p)) + .ToListAsync(); + }); - List? emails = await _context.ContactsEmails.Where(e => e.ContactId == contact.Id).ToListAsync(); - if (emails.Any()) + var emailsTask = Task.Run(async () => { - List? emailVMs = new List(); - foreach (var email in emails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - contactVM.ContactEmails = emailVMs; - } + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactsEmails + .AsNoTracking() + .Where(e => e.ContactId == contact.Id && e.TenantId == tenantId) + .Select(e => _mapper.Map(e)) + .ToListAsync(); + }); - List? contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); - if (contactProjects.Any()) + var contactProjectsTask = Task.Run(async () => { - List projectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - List? projects = await _context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); - List? projectVMs = new List(); - foreach (var project in projects) - { - BasicProjectVM projectVM = new BasicProjectVM + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactProjectMappings + .AsNoTracking() + .Include(cp => cp.Project) + .Where(cp => cp.ContactId == contact.Id && cp.Project != null && cp.Project.TenantId == tenantId) + .Select(cp => new BasicProjectVM { - Id = project.Id, - Name = project.Name - }; - projectVMs.Add(projectVM); - } - contactVM.Projects = projectVMs; - } - List? contactBuckets = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - if (contactBuckets.Any() && employeeBuckets.Any()) + Id = cp.Project!.Id, + Name = cp.Project.Name + }) + .ToListAsync(); + }); + + var contactBucketsTask = Task.Run(async () => { - List contactBucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); - List employeeBucketIds = employeeBuckets.Select(eb => eb.BucketId).ToList(); - List? buckets = await _context.Buckets.Where(b => contactBucketIds.Contains(b.Id) && employeeBucketIds.Contains(b.Id)).ToListAsync(); - List? bucketVMs = new List(); - foreach (var bucket in buckets) + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + var bucketQuery = taskDbContext.ContactBucketMappings + .AsNoTracking() + .Include(cb => cb.Bucket) + .ThenInclude(b => b!.CreatedBy) + .Where(cb => cb.ContactId == contact.Id && cb.Bucket != null && cb.Bucket.TenantId == tenantId); + + if (hasAdminPermission) { - BucketVM bucketVM = bucket.ToBucketVMFromBucket(); - bucketVMs.Add(bucketVM); + return await bucketQuery + .Select(cb => _mapper.Map(cb.Bucket)) + .ToListAsync(); } - contactVM.Buckets = bucketVMs; - } - List? contactTags = await _context.ContactTagMappings.Where(ct => ct.ContactId == contact.Id).ToListAsync(); - if (contactTags.Any()) + List employeeBucketIds = await taskDbContext.EmployeeBucketMappings + .AsNoTracking() + .Where(eb => eb.EmployeeId == loggedInEmployeeId) + .Select(eb => eb.BucketId) + .ToListAsync(); + + return await bucketQuery + .Where(cb => employeeBucketIds.Contains(cb.BucketId)) + .Select(cb => _mapper.Map(cb.Bucket)) + .ToListAsync(); + + }); + + var contactTagsTask = Task.Run(async () => { - List tagIds = contactTags.Select(ct => ct.ContactTagId).ToList(); - List tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - List tagVMs = new List(); - foreach (var tagMaster in tagMasters) - { - ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); - tagVMs.Add(tagVM); - } - contactVM.Tags = tagVMs; - } - List? notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive).ToListAsync(); - if (notes.Any()) - { - List? noteIds = notes.Select(n => n.Id).ToList(); - List? noteUpdateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).OrderByDescending(l => l.UpdateAt).ToListAsync(); - List? noteVMs = new List(); - foreach (var note in notes) - { - DirectoryUpdateLog? noteUpdateLog = noteUpdateLogs.Where(n => n.RefereanceId == note.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefault(); - ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - if (noteUpdateLog != null) - { - noteVM.UpdatedAt = noteUpdateLog.UpdateAt; - noteVM.UpdatedBy = noteUpdateLog.Employee != null ? noteUpdateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; - } - noteVMs.Add(noteVM); - } - contactVM.Notes = noteVMs; - } - _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", LoggedInEmployee.Id, contact.Id); + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactTagMappings + .AsNoTracking() + .Include(ct => ct.ContactTag) + .Where(ct => ct.ContactId == contact.Id && ct.ContactTag != null && ct.ContactTag.TenantId == tenantId) + .Select(ct => _mapper.Map(ct.ContactTag)) + .ToListAsync(); + }); + + await Task.WhenAll(phonesTask, emailsTask, contactProjectsTask, contactBucketsTask, contactTagsTask); + contactVM.ContactPhones = phonesTask.Result; + contactVM.ContactEmails = emailsTask.Result; + contactVM.Tags = contactTagsTask.Result; + contactVM.Buckets = contactBucketsTask.Result; + contactVM.Projects = contactProjectsTask.Result; + _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", loggedInEmployeeId, contact.Id); return ApiResponse.SuccessResponse(contactVM, "Contact profile fetched successfully"); - } - _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); + catch (Exception ex) + { + _logger.LogError(ex, "An unexpected error occurred while fetching contact list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, loggedInEmployeeId); + return ApiResponse.ErrorResponse("An internal error occurred.", ExceptionMapper(ex), 500); + } } public async Task> GetOrganizationList() { @@ -1708,6 +1707,21 @@ namespace Marco.Pms.Services.Service #region =================================================================== Helper Functions =================================================================== + private async Task<(bool hasAdmin, bool hasManager, bool hasUser)> CheckPermissionsAsync(Guid employeeId) + { + // Scoping the service provider ensures services are disposed of correctly. + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + + // Run all permission checks in parallel. + var hasAdminTask = permissionService.HasPermission(PermissionsMaster.DirectoryAdmin, employeeId); + var hasManagerTask = permissionService.HasPermission(PermissionsMaster.DirectoryManager, employeeId); + var hasUserTask = permissionService.HasPermission(PermissionsMaster.DirectoryUser, employeeId); + + await Task.WhenAll(hasAdminTask, hasManagerTask, hasUserTask); + + return (hasAdminTask.Result, hasManagerTask.Result, hasUserTask.Result); + } private bool Compare(string sentence, string search) { sentence = sentence.Trim().ToLower(); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index 1465e15..b9e1be2 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -9,7 +9,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetListOfContactsAsync(string? search, string? filter, Guid? projectId, bool active, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); Task> GetListOfContactsOld(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId); Task> GetContactsListByBucketId(Guid id); - Task> GetContactProfile(Guid id); + Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee); Task> GetOrganizationList(); Task> CreateContact(CreateContactDto createContact); Task> UpdateContact(Guid id, UpdateContactDto updateContact); -- 2.43.0 From 9e15cf04472bcbedc74d4427b6ddde0447b0354a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 29 Jul 2025 15:00:23 +0530 Subject: [PATCH 05/63] Optimized the Create contact API in directory module --- Marco.Pms.Model/Directory/ContactEmail.cs | 4 +- Marco.Pms.Model/Directory/ContactPhone.cs | 4 +- .../Dtos/Directory/CreateContactEmailDto.cs | 1 + .../Dtos/Directory/CreateContactPhoneDto.cs | 1 + .../ViewModels/Directory/ContactProfileVM.cs | 2 +- .../Controllers/DirectoryController.cs | 24 +- .../MappingProfiles/MappingProfile.cs | 18 + .../Service/DirectoryService.cs | 543 +++++++++++++----- .../ServiceInterfaces/IDirectoryService.cs | 4 +- 9 files changed, 425 insertions(+), 176 deletions(-) diff --git a/Marco.Pms.Model/Directory/ContactEmail.cs b/Marco.Pms.Model/Directory/ContactEmail.cs index 1eb1b34..a572be6 100644 --- a/Marco.Pms.Model/Directory/ContactEmail.cs +++ b/Marco.Pms.Model/Directory/ContactEmail.cs @@ -1,6 +1,6 @@ -using System.ComponentModel; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; namespace Marco.Pms.Model.Directory { diff --git a/Marco.Pms.Model/Directory/ContactPhone.cs b/Marco.Pms.Model/Directory/ContactPhone.cs index d10439b..f030bc7 100644 --- a/Marco.Pms.Model/Directory/ContactPhone.cs +++ b/Marco.Pms.Model/Directory/ContactPhone.cs @@ -1,6 +1,6 @@ -using System.ComponentModel; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel; using System.ComponentModel.DataAnnotations.Schema; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; namespace Marco.Pms.Model.Directory { diff --git a/Marco.Pms.Model/Dtos/Directory/CreateContactEmailDto.cs b/Marco.Pms.Model/Dtos/Directory/CreateContactEmailDto.cs index 654890a..0102c39 100644 --- a/Marco.Pms.Model/Dtos/Directory/CreateContactEmailDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/CreateContactEmailDto.cs @@ -4,6 +4,7 @@ { public string? Label { get; set; } public string? EmailAddress { get; set; } + public bool IsPrimary { get; set; } = false; } } diff --git a/Marco.Pms.Model/Dtos/Directory/CreateContactPhoneDto.cs b/Marco.Pms.Model/Dtos/Directory/CreateContactPhoneDto.cs index a72ac3d..84c10c5 100644 --- a/Marco.Pms.Model/Dtos/Directory/CreateContactPhoneDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/CreateContactPhoneDto.cs @@ -4,5 +4,6 @@ { public string? Label { get; set; } public string? PhoneNumber { get; set; } + public bool IsPrimary { get; set; } = false; } } diff --git a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs index 4969dfe..9e8f4cb 100644 --- a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs +++ b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs @@ -21,6 +21,6 @@ namespace Marco.Pms.Model.ViewModels.Directory public List Projects { get; set; } = new List(); public List Buckets { get; set; } = new List(); public List Tags { get; set; } = new List(); - //public List Notes { get; set; } = new List(); + public List Notes { get; set; } = new List(); } } diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index f63907b..037838a 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -97,7 +97,8 @@ namespace Marco.Pms.Services.Controllers [HttpGet("organization")] public async Task GetOrganizationList() { - var response = await _directoryService.GetOrganizationList(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetOrganizationListAsync(tenantId, loggedInEmployee); return Ok(response); } @@ -106,24 +107,9 @@ namespace Marco.Pms.Services.Controllers [HttpPost] public async Task CreateContact([FromBody] CreateContactDto createContact) { - if (!ModelState.IsValid) - { - var errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => e.ErrorMessage) - .ToList(); - _logger.LogWarning("User sent Invalid Date while marking attendance"); - return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); - } - var response = await _directoryService.CreateContact(createContact); - if (response.StatusCode == 200) - { - return Ok(response); - } - else - { - return BadRequest(response); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.CreateContactAsync(createContact, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); } [HttpPut("{id}")] diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 0fe8d22..b6f5b4c 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,5 +1,6 @@ using AutoMapper; using Marco.Pms.Model.Directory; +using Marco.Pms.Model.Dtos.Directory; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Master; @@ -74,15 +75,32 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Directory ======================================================= CreateMap(); + CreateMap(); CreateMap(); CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap() + .ForMember( + dest => dest.ContactName, + opt => opt.MapFrom(src => src.Contact != null ? src.Contact.Name : string.Empty) + ) + .ForMember( + dest => dest.OrganizationName, + opt => opt.MapFrom(src => src.Contact != null ? src.Contact.Organization : string.Empty) + ); + #endregion diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index ebcdbec..2ff97b5 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -12,6 +12,7 @@ using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; +using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using System.Text.Json; @@ -382,6 +383,129 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(list, System.String.Format("{0} contacts fetched successfully", list.Count), 200); } + public async Task> GetContactsListByBucketIdAsync(Guid bucketId, Guid tenantId, Employee loggedInEmployee) + { + if (bucketId == Guid.Empty) + { + _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); + } + + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + // Log the specific denial reason for security auditing. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get organization list for tenant {TenantId} due to lack of permissions.", loggedInEmployee.Id, tenantId); + // Return a strongly-typed error response. + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to perform this action.", 403); + } + + Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + if (bucket == null) + { + _logger.LogInfo("Employee ID {EmployeeId} attempted access to bucket ID {BucketId}, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); + } + List? employeeBuckets = await _context.EmployeeBucketMappings.Where(em => em.BucketId == bucketId).ToListAsync(); + + EmployeeBucketMapping? employeeBucket = null; + if (hasAdminPermission) + { + employeeBucket = employeeBuckets.FirstOrDefault(); + } + else if (hasManagerPermission || hasUserPermission) + { + employeeBucket = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == loggedInEmployee.Id); + } + + + if (employeeBucket == null) + { + _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have access to this bucket.", "You do not have access to this bucket.", 401); + } + + List contactBucket = await _context.ContactBucketMappings.Where(cb => cb.BucketId == bucketId).ToListAsync() ?? new List(); + List contactVMs = new List(); + if (contactBucket.Count > 0) + { + var contactIds = contactBucket.Select(cb => cb.ContactId).ToList(); + List contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); + List phones = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); + List emails = await _context.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); + + List? tags = await _context.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); + List? contactProjects = await _context.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + List? contactBuckets = await _context.ContactBucketMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + + List tagIds = new List(); + List tagMasters = new List(); + if (tags.Count > 0) + { + tagIds = tags.Select(ct => ct.ContactTagId).ToList(); + tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); + } + + if (contacts.Count > 0) + { + + + foreach (var contact in contacts) + { + List? emailVMs = new List(); + List? phoneVMs = new List(); + List? tagVMs = new List(); + + List contactPhones = phones.Where(p => p.ContactId == contact.Id).ToList(); + List contactEmails = emails.Where(e => e.ContactId == contact.Id).ToList(); + + List? contactTags = tags.Where(t => t.ContactId == contact.Id).ToList(); + List? projectMappings = contactProjects.Where(cp => cp.ContactId == contact.Id).ToList(); + List? bucketMappings = contactBuckets.Where(cb => cb.ContactId == contact.Id).ToList(); + + if (contactPhones.Count > 0) + { + foreach (var phone in contactPhones) + { + ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); + phoneVMs.Add(phoneVM); + } + } + if (contactEmails.Count > 0) + { + foreach (var email in contactEmails) + { + ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); + emailVMs.Add(emailVM); + } + } + if (contactTags.Count > 0) + { + foreach (var contactTag in contactTags) + { + ContactTagMaster? tagMaster = tagMasters.Find(t => t.Id == contactTag.ContactTagId); + if (tagMaster != null) + { + ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); + tagVMs.Add(tagVM); + } + } + } + ContactVM contactVM = contact.ToContactVMFromContact(); + contactVM.ContactEmails = emailVMs; + contactVM.ContactPhones = phoneVMs; + contactVM.Tags = tagVMs; + contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); + contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); + contactVMs.Add(contactVM); + } + } + + } + _logger.LogInfo("{count} contact from Bucket {BucketId} fetched by Employee {EmployeeId}", contactVMs.Count, bucketId, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully", 200); + } public async Task> GetContactsListByBucketId(Guid id) { Guid tenantId = _userHelper.GetTenantId(); @@ -611,192 +735,199 @@ namespace Marco.Pms.Services.Service .ToListAsync(); }); - await Task.WhenAll(phonesTask, emailsTask, contactProjectsTask, contactBucketsTask, contactTagsTask); + var contactNotesTask = Task.Run(async () => + { + await using var taskDbContext = await _dbContextFactory.CreateDbContextAsync(); + return await taskDbContext.ContactNotes + .AsNoTracking() + .Include(cn => cn.Createdby) + .Include(cn => cn.UpdatedBy) + .Include(cn => cn.Contact) + .Where(cn => cn.ContactId == contact.Id && cn.Createdby != null && cn.Createdby.TenantId == tenantId) + .Select(cn => _mapper.Map(cn)) + .ToListAsync(); + }); + + await Task.WhenAll(phonesTask, emailsTask, contactProjectsTask, contactBucketsTask, contactTagsTask, contactNotesTask); contactVM.ContactPhones = phonesTask.Result; contactVM.ContactEmails = emailsTask.Result; contactVM.Tags = contactTagsTask.Result; contactVM.Buckets = contactBucketsTask.Result; contactVM.Projects = contactProjectsTask.Result; - _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", loggedInEmployeeId, contact.Id); + contactVM.Notes = contactNotesTask.Result; + _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {ContactId}", loggedInEmployeeId, contact.Id); return ApiResponse.SuccessResponse(contactVM, "Contact profile fetched successfully"); } catch (Exception ex) { - _logger.LogError(ex, "An unexpected error occurred while fetching contact list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, loggedInEmployeeId); + _logger.LogError(ex, "An unexpected error occurred while fetching contact profile for Tenant {TenantId} by Employee {EmployeeId}", tenantId, loggedInEmployeeId); return ApiResponse.ErrorResponse("An internal error occurred.", ExceptionMapper(ex), 500); } } - public async Task> GetOrganizationList() - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var organizationList = await _context.Contacts.Where(c => c.TenantId == tenantId).Select(c => c.Organization).Distinct().ToListAsync(); - _logger.LogInfo("Employee {EmployeeId} fetched list of organizations in a tenant {TenantId}", LoggedInEmployee.Id, tenantId); - return ApiResponse.SuccessResponse(organizationList, $"{organizationList.Count} records of organization names fetched from contacts", 200); + /// + /// Asynchronously retrieves a distinct list of organization names for a given tenant. + /// + /// The unique identifier of the tenant. + /// The employee making the request, used for permission checks. + /// + /// An ApiResponse containing the list of organization names on success, + /// or an error response with appropriate status codes (403 for Forbidden, 500 for internal errors). + /// + public async Task> GetOrganizationListAsync(Guid tenantId, Employee loggedInEmployee) + { + // --- Parameter Validation --- + // Fail fast if essential parameters are not provided. + ArgumentNullException.ThrowIfNull(loggedInEmployee); + + var employeeId = loggedInEmployee.Id; + + try + { + // --- 1. Permission Check --- + // Verify that the employee has at least one of the required permissions to view this data. + // This prevents unauthorized data access early in the process. + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(employeeId); + + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + // Log the specific denial reason for security auditing. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get organization list for tenant {TenantId} due to lack of permissions.", employeeId, tenantId); + // Return a strongly-typed error response. + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to perform this action.", 403); + } + + // --- 2. Database Query --- + // Build and execute the database query efficiently. + _logger.LogDebug("Fetching organization list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, employeeId); + + var organizationList = await _context.Contacts + // Filter contacts by the specified tenant to ensure data isolation and Filter out contacts that do not have an organization name to ensure data quality. + .Where(c => c.TenantId == tenantId && !string.IsNullOrEmpty(c.Organization)) + + // Project only the 'Organization' column. This is a major performance optimization + // as it avoids loading entire 'Contact' entities into memory. + .Select(c => c.Organization) + // Let the database perform the distinct operation, which is highly efficient. + .Distinct() + // Execute the query asynchronously and materialize the results into a list. + .ToListAsync(); + + // --- 3. Success Response --- + // Log the successful operation with key details. + _logger.LogInfo("Successfully fetched {OrganizationCount} distinct organizations for Tenant {TenantId} for employee {EmployeeId}", organizationList.Count, tenantId, employeeId); + + // Return a strongly-typed success response with the data and a descriptive message. + return ApiResponse.SuccessResponse( + organizationList, + $"{organizationList.Count} unique organization(s) found.", + 200 + ); + } + catch (Exception ex) + { + // --- 4. Exception Handling --- + // Log the full exception details for effective debugging, including context. + _logger.LogError(ex, "An unexpected error occurred while fetching organization list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, employeeId); + + // Return a generic, strongly-typed error response to the client to avoid leaking implementation details. + return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); + } } #endregion #region =================================================================== Contact Post APIs =================================================================== - public async Task> CreateContact(CreateContactDto createContact) + + /// + /// Creates a new contact along with its associated details such as phone numbers, emails, tags, and project/bucket mappings. + /// This operation is performed within a single database transaction to ensure data integrity. + /// + /// The DTO containing the details for the new contact. + /// The ID of the tenant to which the contact belongs. + /// The employee performing the action. + /// An ApiResponse containing the newly created contact's view model or an error. + public async Task> CreateContactAsync(CreateContactDto createContact, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (createContact != null) + Guid loggedInEmployeeId = loggedInEmployee.Id; + + if (string.IsNullOrWhiteSpace(createContact.Name) || + string.IsNullOrWhiteSpace(createContact.Organization) || + !(createContact.BucketIds?.Any() ?? false)) { - List phones = new List(); - List emails = new List(); - List contactBucketMappings = new List(); - List contactTagMappings = new List(); + _logger.LogWarning("Validation failed for CreateContactAsync. Payload missing required fields. Triggered by Employee: {LoggedInEmployeeId}", loggedInEmployeeId); + return ApiResponse.ErrorResponse("Payload is missing required fields: Name, Organization, and at least one BucketId are required.", "Invalid Payload", 400); + } - Contact? contact = createContact.ToContactFromCreateContactDto(tenantId, LoggedInEmployee.Id); + using var transaction = await _context.Database.BeginTransactionAsync(); + _logger.LogInfo("Starting transaction to create contact for Tenant {TenantId} by Employee {EmployeeId}", tenantId, loggedInEmployeeId); + try + { + var contact = _mapper.Map(createContact); + contact.CreatedAt = DateTime.UtcNow; + contact.CreatedById = loggedInEmployeeId; + contact.TenantId = tenantId; _context.Contacts.Add(contact); - await _context.SaveChangesAsync(); - _logger.LogInfo("Contact with ID {ContactId} created by Employee with ID {LoggedInEmployeeId}", contact.Id, LoggedInEmployee.Id); - var tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); - var tagNames = tags.Select(t => t.Name.ToLower()).ToList(); - var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).Select(b => b.Id).ToListAsync(); - var projects = await _context.Projects.Where(p => p.TenantId == tenantId).Select(p => p.Id).ToListAsync(); + // --- Process Phones --- + var existingPhoneList = await _context.ContactsPhones + .Where(p => p.TenantId == tenantId && p.IsPrimary) + .Select(p => p.PhoneNumber) + .ToListAsync(); + var existingPhones = new HashSet(existingPhoneList); + var phoneVMs = ProcessContactPhones(createContact, contact, existingPhones); - if (createContact.ContactPhones != null) + // --- Process Emails --- + var existingEmailList = await _context.ContactsEmails + .Where(e => e.TenantId == tenantId && e.IsPrimary) + .Select(e => e.EmailAddress) + .ToListAsync(); + var existingEmails = new HashSet(existingEmailList, StringComparer.OrdinalIgnoreCase); + var emailVMs = ProcessContactEmails(createContact, contact, existingEmails); + + // --- Process Tags --- + var tenantTags = await _context.ContactTagMasters + .Where(t => t.TenantId == tenantId) + .ToDictionaryAsync(t => t.Name.ToLowerInvariant(), t => t); + var tagVMs = ProcessTags(createContact, contact, tenantTags); + + // --- Process Mappings --- + var contactBucketMappings = await ProcessBucketMappingsAsync(createContact, contact, tenantId); + var projectMappings = await ProcessProjectMappingsAsync(createContact, contact, tenantId); + + // --- Final Save and Commit --- + try { + var changesCount = await _context.SaveChangesAsync(); + await transaction.CommitAsync(); - foreach (var contactPhone in createContact.ContactPhones) - { - ContactPhone phone = contactPhone.ToContactPhoneFromCreateContactPhoneDto(tenantId, contact.Id); - phones.Add(phone); - } - _context.ContactsPhones.AddRange(phones); - _logger.LogInfo("{count} phone number are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", phones.Count, contact.Id, LoggedInEmployee.Id); + _logger.LogInfo( + "Successfully created Contact {ContactId} with {Count} related records for Tenant {TenantId} by Employee {EmployeeId}. Transaction committed.", + contact.Id, changesCount - 1, tenantId, loggedInEmployeeId); } - if (createContact.ContactEmails != null) + catch (DbUpdateException dbEx) { - - foreach (var contactEmail in createContact.ContactEmails) - { - ContactEmail email = contactEmail.ToContactEmailFromCreateContactEmailDto(tenantId, contact.Id); - emails.Add(email); - } - _context.ContactsEmails.AddRange(emails); - _logger.LogInfo("{count} email addresses are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", emails.Count, contact.Id, LoggedInEmployee.Id); + await transaction.RollbackAsync(); + _logger.LogError(dbEx, "Database exception during contact creation for Tenant {TenantId}. Transaction rolled back.", tenantId); + return ApiResponse.ErrorResponse("An internal database error occurred.", ExceptionMapper(dbEx), 500); } - if (createContact.BucketIds != null) - { - foreach (var bucket in createContact.BucketIds) - { - if (buckets.Contains(bucket)) - { - ContactBucketMapping bucketMapping = new ContactBucketMapping - { - BucketId = bucket, - ContactId = contact.Id - }; - contactBucketMappings.Add(bucketMapping); - } - } - _context.ContactBucketMappings.AddRange(contactBucketMappings); - _logger.LogInfo("Contact with ID {ContactId} added to {count} number of buckets by employee with ID {LoggedEmployeeId}", contact.Id, contactBucketMappings.Count, LoggedInEmployee.Id); - } - - if (createContact.ProjectIds != null) - { - List projectMappings = new List(); - foreach (var projectId in createContact.ProjectIds) - { - if (projects.Contains(projectId)) - { - ContactProjectMapping projectMapping = new ContactProjectMapping - { - ProjectId = projectId, - ContactId = contact.Id, - TenantId = tenantId - }; - projectMappings.Add(projectMapping); - } - } - _context.ContactProjectMappings.AddRange(projectMappings); - _logger.LogInfo("Contact with ID {ContactId} added to {count} number of project by employee with ID {LoggedEmployeeId}", contact.Id, projectMappings.Count, LoggedInEmployee.Id); - } - - if (createContact.Tags != null) - { - foreach (var tag in createContact.Tags) - { - if (tagNames.Contains(tag.Name.ToLower())) - { - ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = tag.Id ?? existingTag.Id - }); - } - else if (tag.Id == null || tags.Where(t => t.Name == tag.Name) == null) - { - var newtag = new ContactTagMaster - { - Name = tag.Name, - TenantId = tenantId - }; - _context.ContactTagMasters.Add(newtag); - ContactTagMapping tagMapping = new ContactTagMapping - { - ContactTagId = newtag.Id, - ContactId = contact.Id - }; - contactTagMappings.Add(tagMapping); - } - } - - _context.ContactTagMappings.AddRange(contactTagMappings); - _logger.LogInfo("{count} number of tags added to Contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", contactTagMappings.Count, contact.Id, LoggedInEmployee.Id); - } - await _context.SaveChangesAsync(); - - ContactVM contactVM = new ContactVM(); - List phoneVMs = new List(); - - contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == contact.Id) ?? new Contact(); - var tagIds = contactTagMappings.Select(t => t.ContactTagId).ToList(); - tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId && tagIds.Contains(t.Id)).ToListAsync(); - List contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); - List bucketMappings = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - List emailVMs = new List(); - foreach (var email in emails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - List tagVMs = new List(); - foreach (var contactTagMapping in contactTagMappings) - { - ContactTagVM tagVM = new ContactTagVM(); - var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); - tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - tagVMs.Add(tagVM); - } - - - contactVM = contact.ToContactVMFromContact(); + // --- Construct and Return Response --- + var contactVM = _mapper.Map(contact); contactVM.ContactPhones = phoneVMs; contactVM.ContactEmails = emailVMs; contactVM.Tags = tagVMs; - contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); + contactVM.BucketIds = contactBucketMappings.Select(cb => cb.BucketId).ToList(); + contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); - return ApiResponse.SuccessResponse(contactVM, "Contact Created Successfully", 200); + return ApiResponse.SuccessResponse(contactVM, "Contact created successfully.", 201); + } + catch (Exception ex) + { + _logger.LogError(ex, "An unexpected exception occurred during contact creation for Tenant {TenantId}. Transaction rolled back.", tenantId); + return ApiResponse.ErrorResponse("An unexpected internal error occurred.", ExceptionMapper(ex), 500); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); } #endregion @@ -1787,6 +1918,118 @@ namespace Marco.Pms.Services.Service }; } + // --- Helper Methods for Readability and Separation of Concerns --- + + private List ProcessContactPhones(CreateContactDto dto, Contact contact, ISet existingPhones) + { + if (!(dto.ContactPhones?.Any() ?? false)) return new List(); + + var newPhones = dto.ContactPhones + .Where(p => !string.IsNullOrWhiteSpace(p.PhoneNumber) && existingPhones.Add(p.PhoneNumber)) // .Add returns true if the item was added (i.e., not present) + .Select(pDto => + { + var phone = _mapper.Map(pDto); + phone.ContactId = contact.Id; + phone.TenantId = contact.TenantId; // Ensure tenant is set on child entities + return phone; + }).ToList(); + + _context.ContactsPhones.AddRange(newPhones); + _logger.LogInfo("Adding {Count} new phone numbers for Contact {ContactId}.", newPhones.Count, contact.Id); + + return newPhones.Select(p => _mapper.Map(p)).ToList(); + } + private List ProcessContactEmails(CreateContactDto dto, Contact contact, ISet existingEmails) + { + if (!(dto.ContactEmails?.Any() ?? false)) return new List(); + + var newEmails = dto.ContactEmails + .Where(e => !string.IsNullOrWhiteSpace(e.EmailAddress) && existingEmails.Add(e.EmailAddress)) // HashSet handles case-insensitivity set in constructor + .Select(eDto => + { + var email = _mapper.Map(eDto); + email.ContactId = contact.Id; + email.TenantId = contact.TenantId; + return email; + }).ToList(); + + _context.ContactsEmails.AddRange(newEmails); + _logger.LogInfo("Adding {Count} new email addresses for Contact {ContactId}.", newEmails.Count, contact.Id); + + return newEmails.Select(e => _mapper.Map(e)).ToList(); + } + private List ProcessTags(CreateContactDto dto, Contact contact, IDictionary tenantTags) + { + if (!(dto.Tags?.Any() ?? false)) return new List(); + + var tagVMs = new List(); + var newTagMappings = new List(); + + foreach (var tagName in dto.Tags.Select(t => t.Name).Distinct(StringComparer.OrdinalIgnoreCase)) + { + if (string.IsNullOrWhiteSpace(tagName)) continue; + + var normalizedTag = tagName.ToLowerInvariant(); + if (!tenantTags.TryGetValue(normalizedTag, out var tagMaster)) + { + // Tag does not exist, create it. + tagMaster = new ContactTagMaster { Name = tagName, Description = tagName, TenantId = contact.TenantId }; + _context.ContactTagMasters.Add(tagMaster); + tenantTags.Add(normalizedTag, tagMaster); // Add to dictionary to handle duplicates in the input list + _logger.LogDebug("Creating new tag '{TagName}' for Tenant {TenantId}.", tagName, contact.TenantId); + } + + newTagMappings.Add(new ContactTagMapping { ContactId = contact.Id, ContactTag = tagMaster }); + tagVMs.Add(_mapper.Map(tagMaster)); + } + + _context.ContactTagMappings.AddRange(newTagMappings); + _logger.LogInfo("Adding {Count} tag mappings for Contact {ContactId}.", newTagMappings.Count, contact.Id); + + return tagVMs; + } + private async Task> ProcessBucketMappingsAsync(CreateContactDto dto, Contact contact, Guid tenantId) + { + if (!(dto.BucketIds?.Any() ?? false)) return new List(); + + var validBucketIds = await _context.Buckets + .Where(b => dto.BucketIds.Contains(b.Id) && b.TenantId == tenantId) + .Select(b => b.Id) + .ToListAsync(); + + var mappings = validBucketIds.Select(bucketId => new ContactBucketMapping + { + BucketId = bucketId, + ContactId = contact.Id + }).ToList(); + + _context.ContactBucketMappings.AddRange(mappings); + _logger.LogInfo("Adding {Count} bucket mappings for Contact {ContactId}.", mappings.Count, contact.Id); + + return mappings; + } + private async Task> ProcessProjectMappingsAsync(CreateContactDto dto, Contact contact, Guid tenantId) + { + if (!(dto.ProjectIds?.Any() ?? false)) return new List(); + + var validProjectIds = await _context.Projects + .Where(p => dto.ProjectIds.Contains(p.Id) && p.TenantId == tenantId) + .Select(p => p.Id) + .ToListAsync(); + + var mappings = validProjectIds.Select(projectId => new ContactProjectMapping + { + ProjectId = projectId, + ContactId = contact.Id, + TenantId = tenantId + }).ToList(); + + _context.ContactProjectMappings.AddRange(mappings); + _logger.LogInfo("Adding {Count} project mappings for Contact {ContactId}.", mappings.Count, contact.Id); + + return mappings; + } + #endregion } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index b9e1be2..1204ce7 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -10,8 +10,8 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetListOfContactsOld(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId); Task> GetContactsListByBucketId(Guid id); Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee); - Task> GetOrganizationList(); - Task> CreateContact(CreateContactDto createContact); + Task> GetOrganizationListAsync(Guid tenantId, Employee loggedInEmployee); + Task> CreateContactAsync(CreateContactDto createContact, Guid tenantId, Employee loggedInEmployee); Task> UpdateContact(Guid id, UpdateContactDto updateContact); Task> DeleteContact(Guid id, bool active); Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber); -- 2.43.0 From 3980c14d72029bc8ba6a58d62756c7356a730749 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 7 Aug 2025 13:28:32 +0530 Subject: [PATCH 06/63] Optimized the contact update API, Delete API , Bucket list API, Create Bucket API, Update Bucket API without implementing cache --- .../Controllers/DirectoryController.cs | 194 +-- .../MappingProfiles/MappingProfile.cs | 1 + .../Service/DirectoryService.cs | 1313 +++++++++-------- .../ServiceInterfaces/IDirectoryService.cs | 16 +- 4 files changed, 777 insertions(+), 747 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 037838a..c496297 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -1,5 +1,4 @@ using Marco.Pms.Model.Dtos.Directory; -using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; @@ -18,14 +17,16 @@ namespace Marco.Pms.Services.Controllers private readonly IDirectoryService _directoryService; private readonly UserHelper _userHelper; private readonly ILoggingService _logger; + private readonly ISignalRService _signalR; private readonly Guid tenantId; - public DirectoryController(IDirectoryService directoryHelper, UserHelper userHelper, ILoggingService logger) + public DirectoryController(IDirectoryService directoryHelper, UserHelper userHelper, ILoggingService logger, ISignalRService signalR) { _directoryService = directoryHelper; _userHelper = userHelper; _logger = logger; tenantId = userHelper.GetTenantId(); + _signalR = signalR; } #region =================================================================== Contact APIs =================================================================== @@ -53,37 +54,16 @@ namespace Marco.Pms.Services.Controllers var response = await _directoryService.GetListOfContactsOld(search, active, filterDto, projectId); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); - } + return StatusCode(response.StatusCode, response); } [HttpGet("contact-bucket/{bucketId}")] public async Task GetContactsListByBucketId(Guid bucketId) { - var response = await _directoryService.GetContactsListByBucketId(bucketId); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetContactsListByBucketIdAsync(bucketId, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); } [HttpGet("profile/{id}")] @@ -109,51 +89,42 @@ namespace Marco.Pms.Services.Controllers { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _directoryService.CreateContactAsync(createContact, tenantId, loggedInEmployee); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } return StatusCode(response.StatusCode, response); } [HttpPut("{id}")] public async Task UpdateContact(Guid id, [FromBody] UpdateContactDto updateContact) { - var response = await _directoryService.UpdateContact(id, updateContact); - if (response.StatusCode == 200) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.UpdateContactAsync(id, updateContact, tenantId, loggedInEmployee); + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpDelete("{id}")] - public async Task DeleteContact(Guid id, [FromQuery] bool? active) + public async Task DeleteContact(Guid id, [FromQuery] bool active = false) { - var response = await _directoryService.DeleteContact(id, active ?? false); - if (response.StatusCode == 200) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.DeleteContactAsync(id, active, tenantId, loggedInEmployee); + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory", Response = id }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } #endregion - // -------------------------------- Contact Notes -------------------------------- + #region =================================================================== Contact Notes APIs =================================================================== [HttpGet("notes")] public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int? pageSize, [FromQuery] int pageNumber) @@ -224,122 +195,71 @@ namespace Marco.Pms.Services.Controllers return Ok(response); } - // -------------------------------- Bucket -------------------------------- + #endregion + + #region =================================================================== Bucket APIs =================================================================== [HttpGet("buckets")] public async Task GetBucketList() { - var response = await _directoryService.GetBucketList(); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetBucketListAsync(tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); } [HttpPost("bucket")] - public async Task CreateBucket(CreateBucketDto bucketDto) + public async Task CreateBucket([FromBody] CreateBucketDto bucketDto) { - if (!ModelState.IsValid) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.CreateBucketAsync(bucketDto, tenantId, loggedInEmployee); + if (response.Success) { - var errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => e.ErrorMessage) - .ToList(); - _logger.LogWarning("User sent Invalid Date while marking attendance"); - return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); - } - var response = await _directoryService.CreateBucket(bucketDto); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 409) - { - return Conflict(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpPut("bucket/{id}")] public async Task UpdateBucket(Guid id, [FromBody] UpdateBucketDto bucketDto) { - var response = await _directoryService.UpdateBucket(id, bucketDto); - if (response.StatusCode == 200) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.UpdateBucketAsync(id, bucketDto, tenantId, loggedInEmployee); + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpPost("assign-bucket/{bucketId}")] public async Task AssignBucket(Guid bucketId, [FromBody] List assignBuckets) { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _directoryService.AssignBucket(bucketId, assignBuckets); - if (response.StatusCode == 200) + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpDelete("bucket/{id}")] public async Task DeleteBucket(Guid id) { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _directoryService.DeleteBucket(id); - if (response.StatusCode == 200) + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = id }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } + + #endregion } } \ No newline at end of file diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index b6f5b4c..66e8a38 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -90,6 +90,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); + CreateMap(); CreateMap() .ForMember( diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 2ff97b5..5c85fe9 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -261,7 +261,7 @@ namespace Marco.Pms.Services.Service else { _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 403); } List filterbucketIds = bucketIds; @@ -385,246 +385,154 @@ namespace Marco.Pms.Services.Service } public async Task> GetContactsListByBucketIdAsync(Guid bucketId, Guid tenantId, Employee loggedInEmployee) { + // Validate incoming bucket ID if (bucketId == Guid.Empty) { - _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", loggedInEmployee.Id); + _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket ID.", loggedInEmployee.Id); return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); } + // Check permissions of logged-in employee var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); - if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) { - // Log the specific denial reason for security auditing. - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get organization list for tenant {TenantId} due to lack of permissions.", loggedInEmployee.Id, tenantId); - // Return a strongly-typed error response. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get contacts list for tenant {TenantId} due to insufficient permissions.", + loggedInEmployee.Id, tenantId); return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to perform this action.", 403); } - Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + // Use dbContextFactory to create new DbContext instances for parallel calls + using var context = _dbContextFactory.CreateDbContext(); + + // Confirm that the bucket exists and belongs to tenant + var bucket = await context.Buckets.FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); if (bucket == null) { - _logger.LogInfo("Employee ID {EmployeeId} attempted access to bucket ID {BucketId}, but not found in database", loggedInEmployee.Id); + _logger.LogInfo("Employee ID {EmployeeId} attempted to access non-existent bucket ID {BucketId}.", loggedInEmployee.Id, bucketId); return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); } - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(em => em.BucketId == bucketId).ToListAsync(); - EmployeeBucketMapping? employeeBucket = null; - if (hasAdminPermission) - { - employeeBucket = employeeBuckets.FirstOrDefault(); - } - else if (hasManagerPermission || hasUserPermission) - { - employeeBucket = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == loggedInEmployee.Id); - } + // Load employee-bucket mappings for this bucket to check access + var employeeBuckets = await context.EmployeeBucketMappings.Where(em => em.BucketId == bucketId).ToListAsync(); + EmployeeBucketMapping? employeeBucket = hasAdminPermission + ? employeeBuckets.FirstOrDefault() + : employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == loggedInEmployee.Id); if (employeeBucket == null) { - _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("You do not have access to this bucket.", "You do not have access to this bucket.", 401); + _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}.", loggedInEmployee.Id, bucketId); + return ApiResponse.ErrorResponse("You do not have access to this bucket.", "Unauthorized access to bucket.", 403); } - List contactBucket = await _context.ContactBucketMappings.Where(cb => cb.BucketId == bucketId).ToListAsync() ?? new List(); - List contactVMs = new List(); - if (contactBucket.Count > 0) + // Fetch all contact-bucket mappings for this bucket + var contactBucketMappings = await context.ContactBucketMappings.Where(cb => cb.BucketId == bucketId).ToListAsync(); + + if (contactBucketMappings.Count == 0) { - var contactIds = contactBucket.Select(cb => cb.ContactId).ToList(); - List contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); - List phones = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); - List emails = await _context.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); - - List? tags = await _context.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); - List? contactProjects = await _context.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); - List? contactBuckets = await _context.ContactBucketMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); - - List tagIds = new List(); - List tagMasters = new List(); - if (tags.Count > 0) - { - tagIds = tags.Select(ct => ct.ContactTagId).ToList(); - tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - } - - if (contacts.Count > 0) - { - - - foreach (var contact in contacts) - { - List? emailVMs = new List(); - List? phoneVMs = new List(); - List? tagVMs = new List(); - - List contactPhones = phones.Where(p => p.ContactId == contact.Id).ToList(); - List contactEmails = emails.Where(e => e.ContactId == contact.Id).ToList(); - - List? contactTags = tags.Where(t => t.ContactId == contact.Id).ToList(); - List? projectMappings = contactProjects.Where(cp => cp.ContactId == contact.Id).ToList(); - List? bucketMappings = contactBuckets.Where(cb => cb.ContactId == contact.Id).ToList(); - - if (contactPhones.Count > 0) - { - foreach (var phone in contactPhones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - } - if (contactEmails.Count > 0) - { - foreach (var email in contactEmails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - } - if (contactTags.Count > 0) - { - foreach (var contactTag in contactTags) - { - ContactTagMaster? tagMaster = tagMasters.Find(t => t.Id == contactTag.ContactTagId); - if (tagMaster != null) - { - ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); - tagVMs.Add(tagVM); - } - } - } - ContactVM contactVM = contact.ToContactVMFromContact(); - contactVM.ContactEmails = emailVMs; - contactVM.ContactPhones = phoneVMs; - contactVM.Tags = tagVMs; - contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); - contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); - contactVMs.Add(contactVM); - } - } - + _logger.LogInfo("No contacts found in bucket ID {BucketId} for employee {EmployeeId}.", bucketId, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new List(), "No contacts available in this bucket.", 200); } - _logger.LogInfo("{count} contact from Bucket {BucketId} fetched by Employee {EmployeeId}", contactVMs.Count, bucketId, loggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully", 200); - } - public async Task> GetContactsListByBucketId(Guid id) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (id != Guid.Empty) + + var contactIds = contactBucketMappings.Select(cb => cb.ContactId).Distinct().ToList(); + + // Parallel fetching of related data via independent contexts to improve performance + var contactTask = Task.Run(async () => { - Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == id && b.TenantId == tenantId); - if (bucket == null) - { - _logger.LogInfo("Employee ID {EmployeeId} attempted access to bucket ID {BucketId}, but not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); - } - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(em => em.BucketId == id).ToListAsync(); - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - EmployeeBucketMapping? employeeBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - employeeBucket = employeeBuckets.FirstOrDefault(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - employeeBucket = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == LoggedInEmployee.Id); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts with in bucket {BucketId}, but do not have permission", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } + return await _dbContext.Contacts.Include(c => c.ContactCategory) + .Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); + }); + var phoneTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - if (employeeBucket == null) - { - _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You do not have access to this bucket.", "You do not have access to this bucket.", 401); - } + return await _dbContext.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); + }); + var emailTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - List contactBucket = await _context.ContactBucketMappings.Where(cb => cb.BucketId == id).ToListAsync() ?? new List(); - List contactVMs = new List(); - if (contactBucket.Count > 0) - { - var contactIds = contactBucket.Select(cb => cb.ContactId).ToList(); - List contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); - List phones = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); - List emails = await _context.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); + return await _dbContext.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); + }); + var tagTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - List? tags = await _context.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); - List? contactProjects = await _context.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); - List? contactBuckets = await _context.ContactBucketMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + return await _dbContext.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); + }); + var contactProjectTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - List tagIds = new List(); - List tagMasters = new List(); - if (tags.Count > 0) - { - tagIds = tags.Select(ct => ct.ContactTagId).ToList(); - tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - } + return await _dbContext.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); + }); + var contactBucketTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - if (contacts.Count > 0) - { + return await _dbContext.ContactBucketMappings.Where(cb => contactIds.Contains(cb.ContactId)).ToListAsync(); + }); + await Task.WhenAll(contactTask); - foreach (var contact in contacts) - { - List? emailVMs = new List(); - List? phoneVMs = new List(); - List? tagVMs = new List(); + var contacts = contactTask.Result; + var phones = phoneTask.Result; + var emails = emailTask.Result; + var tags = tagTask.Result; + var contactProjects = contactProjectTask.Result; + var contactBuckets = contactBucketTask.Result; - List contactPhones = phones.Where(p => p.ContactId == contact.Id).ToList(); - List contactEmails = emails.Where(e => e.ContactId == contact.Id).ToList(); - - List? contactTags = tags.Where(t => t.ContactId == contact.Id).ToList(); - List? projectMappings = contactProjects.Where(cp => cp.ContactId == contact.Id).ToList(); - List? bucketMappings = contactBuckets.Where(cb => cb.ContactId == contact.Id).ToList(); - - if (contactPhones.Count > 0) - { - foreach (var phone in contactPhones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - } - if (contactEmails.Count > 0) - { - foreach (var email in contactEmails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - } - if (contactTags.Count > 0) - { - foreach (var contactTag in contactTags) - { - ContactTagMaster? tagMaster = tagMasters.Find(t => t.Id == contactTag.ContactTagId); - if (tagMaster != null) - { - ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); - tagVMs.Add(tagVM); - } - } - } - ContactVM contactVM = contact.ToContactVMFromContact(); - contactVM.ContactEmails = emailVMs; - contactVM.ContactPhones = phoneVMs; - contactVM.Tags = tagVMs; - contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); - contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); - contactVMs.Add(contactVM); - } - } - - } - _logger.LogInfo("{count} contact from Bucket {BucketId} fetched by Employee {EmployeeId}", contactVMs.Count, id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully", 200); + // Load tag metadata if tags found + List tagMasters = new List(); + if (tags.Count > 0) + { + var tagIds = tags.Select(t => t.ContactTagId).Distinct().ToList(); + tagMasters = await context.ContactTagMasters.Where(tm => tagIds.Contains(tm.Id)).ToListAsync(); } - _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); + + var contactVMs = new List(); + + // Build contact view models from data + foreach (var contact in contacts) + { + // Transform phones + var phoneVMs = phones.Where(p => p.ContactId == contact.Id).Select(p => _mapper.Map(p)).ToList(); + + // Transform emails + var emailVMs = emails.Where(e => e.ContactId == contact.Id).Select(e => _mapper.Map(e)).ToList(); + + // Transform tags + var contactTagMappings = tags.Where(t => t.ContactId == contact.Id); + var tagVMs = new List(); + foreach (var ct in contactTagMappings) + { + var tagMaster = tagMasters.Find(tm => tm.Id == ct.ContactTagId); + if (tagMaster != null) + { + tagVMs.Add(_mapper.Map(tagMaster)); + } + } + + // Get project and bucket mappings for the contact + var projectIds = contactProjects.Where(cp => cp.ContactId == contact.Id).Select(cp => cp.ProjectId).ToList(); + var bucketIds = contactBuckets.Where(cb => cb.ContactId == contact.Id).Select(cb => cb.BucketId).ToList(); + + // Create the contact VM + var contactVM = _mapper.Map(contact); + contactVM.ContactPhones = phoneVMs; + contactVM.ContactEmails = emailVMs; + contactVM.Tags = tagVMs; + contactVM.ProjectIds = projectIds; + contactVM.BucketIds = bucketIds; + + contactVMs.Add(contactVM); + } + + _logger.LogInfo("{Count} contacts from Bucket {BucketId} fetched successfully by Employee {EmployeeId}.", contactVMs.Count, bucketId, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully.", 200); } public async Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee) { @@ -933,319 +841,399 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Contact Put APIs =================================================================== - public async Task> UpdateContact(Guid id, UpdateContactDto updateContact) + + public async Task> UpdateContactAsync(Guid id, UpdateContactDto updateContact, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (updateContact != null) + if (updateContact == null) { - if (updateContact.Id != id) + _logger.LogWarning("Employee {EmployeeId} sent empty payload for updating contact.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Empty payload", "User sent empty payload", 400); + } + + // Ensure payload ID matches path ID + if (updateContact.Id != id) + { + _logger.LogWarning("Employee {EmployeeId} sent mismatched contact IDs. Path: {PathId}, Payload: {PayloadId}", + loggedInEmployee.Id, id, updateContact.Id); + return ApiResponse.ErrorResponse("Invalid data", "Payload ID does not match path parameter", 400); + } + + using var context = _dbContextFactory.CreateDbContext(); + + // Retrieve the contact with tracking disabled for initial existence and permission check + var contact = await context.Contacts + .AsNoTracking() + .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + + if (contact == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to update non-existing contact {ContactId}", + loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + + // Validate permissions + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + + // Determine accessible bucket IDs for this employee + List bucketIds; + if (hasAdminPermission) + { + bucketIds = await context.Buckets + .Where(b => b.TenantId == tenantId) + .Select(b => b.Id) + .ToListAsync(); + } + else if (hasManagerPermission || hasUserPermission) + { + var employeeBucketIds = await context.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToListAsync(); + + var createdBucketIds = await context.Buckets + .Where(b => b.CreatedByID == loggedInEmployee.Id) + .Select(b => b.Id) + .ToListAsync(); + + bucketIds = employeeBucketIds.Concat(createdBucketIds).Distinct().ToList(); + } + else + { + _logger.LogWarning("Employee {EmployeeId} does not have permission to update contact {ContactId}", + loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Unauthorized", "You do not have permission", 403); + } + + // Fetch contact bucket mappings accessible by the user + var contactBuckets = await context.ContactBucketMappings + .Where(cb => cb.ContactId == contact.Id && bucketIds.Contains(cb.BucketId)) + .ToListAsync(); + + // Refresh bucket IDs to only those relevant to this contact & permissions + var accessibleBucketIds = contactBuckets.Select(cb => cb.BucketId).Distinct().ToHashSet(); + + // Update the main contact object from DTO + var updatedContact = updateContact.ToContactFromUpdateContactDto(tenantId, contact); + updatedContact.UpdatedById = loggedInEmployee.Id; + updatedContact.UpdatedAt = DateTime.UtcNow; + + // Attach updated contact (tracked entity) + context.Contacts.Update(updatedContact); + + // Prepare parallel tasks for retrieving related collections in independent DbContext instances + var phonesTask = Task.Run(async () => + { + using var ctx = _dbContextFactory.CreateDbContext(); + return await ctx.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + }); + + var emailsTask = Task.Run(async () => + { + using var ctx = _dbContextFactory.CreateDbContext(); + return await ctx.ContactsEmails.AsNoTracking().Where(e => e.ContactId == contact.Id).ToListAsync(); + }); + + var tagsTask = Task.Run(async () => + { + using var ctx = _dbContextFactory.CreateDbContext(); + return await ctx.ContactTagMappings.AsNoTracking().Where(t => t.ContactId == contact.Id).ToListAsync(); + }); + + var projectsTask = Task.Run(async () => + { + using var ctx = _dbContextFactory.CreateDbContext(); + return await ctx.ContactProjectMappings.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); + }); + + // Await all tasks to complete + await Task.WhenAll(phonesTask, emailsTask, tagsTask, projectsTask); + + var phones = phonesTask.Result; + var emails = emailsTask.Result; + var contactTags = tagsTask.Result; + var contactProjects = projectsTask.Result; + + var phoneIds = phones.Select(p => p.Id).ToHashSet(); + var emailIds = emails.Select(e => e.Id).ToHashSet(); + var tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToHashSet(); + var projectIds = contactProjects.Select(p => p.ProjectId).Distinct().ToHashSet(); + + // Fetch all tags for this tenant for name checks + var allTags = await context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); + var tagNameLookup = allTags.ToDictionary(t => t.Name.ToLowerInvariant(), t => t); + + // ---------------------- Update Phones ----------------------- + if (updateContact.ContactPhones != null) + { + var updatedPhoneIds = updateContact.ContactPhones.Select(p => p.Id).Where(id => id != null && id != Guid.Empty).ToHashSet(); + + foreach (var phoneDto in updateContact.ContactPhones) { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended different ID in payload and path parameter", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Invalid data", "Invalid data", 400); - } - Contact? contact = await _context.Contacts.AsNoTracking().FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); - if (contact == null) - { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + var phoneEntity = phoneDto.ToContactPhoneFromUpdateContactPhoneDto(tenantId, contact.Id); + if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && phoneIds.Contains(phoneEntity.Id)) + context.ContactsPhones.Update(phoneEntity); + else + context.ContactsPhones.Add(phoneEntity); } - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).ToListAsync(); - bucketIds = buckets.Select(b => b.Id).ToList(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - var buckets = await _context.Buckets.Where(b => b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); - var createdBucketIds = buckets.Select(b => b.Id).ToList(); - bucketIds.AddRange(createdBucketIds); - bucketIds = bucketIds.Distinct().ToList(); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to update a contact, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - List contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(m => m.ContactId == contact.Id && bucketIds.Contains(m.BucketId)).ToListAsync(); - bucketIds = contactBuckets.Select(b => b.BucketId).Distinct().ToList(); - - - - var newContact = updateContact.ToContactFromUpdateContactDto(tenantId, contact); - newContact.UpdatedById = LoggedInEmployee.Id; - newContact.UpdatedAt = DateTime.UtcNow; - _context.Contacts.Update(newContact); - await _context.SaveChangesAsync(); - - List phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - var phoneIds = phones.Select(p => p.Id).ToList(); - List emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - var emailIds = emails.Select(p => p.Id).ToList(); - - - - List contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - var tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); - - - List contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - var projectIds = contactProjects.Select(t => t.ProjectId).Distinct().ToList(); - - List tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - List allTags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); - var tagNames = allTags.Select(t => t.Name.ToLower()).ToList(); - - if (updateContact.ContactPhones != null) - { - var updatedPhoneIds = updateContact.ContactPhones.Select(p => p.Id).Distinct().ToList(); - foreach (var phoneDto in updateContact.ContactPhones) - { - var phone = phoneDto.ToContactPhoneFromUpdateContactPhoneDto(tenantId, contact.Id); - if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && phoneIds.Contains(phone.Id)) - { - _context.ContactsPhones.Update(phone); - } - else - { - _context.ContactsPhones.Add(phone); - } - } - foreach (var phone in phones) - { - - if (!updatedPhoneIds.Contains(phone.Id)) - { - _context.ContactsPhones.Remove(phone); - } - } - } - else if (phones != null) - { - _context.ContactsPhones.RemoveRange(phones); - } - - if (updateContact.ContactEmails != null) - { - var updateEmailIds = updateContact.ContactEmails.Select(p => p.Id).Distinct().ToList(); - - foreach (var emailDto in updateContact.ContactEmails) - { - var email = emailDto.ToContactEmailFromUpdateContactEmailDto(tenantId, contact.Id); - if (emailDto.Id != null && emailDto.Id != Guid.Empty && emailIds.Contains(email.Id)) - { - _context.ContactsEmails.Update(email); - } - else - { - _context.ContactsEmails.Add(email); - } - } - foreach (var email in emails) - { - - if (!updateEmailIds.Contains(email.Id)) - { - _context.ContactsEmails.Remove(email); - } - } - } - else if (emails != null) - { - _context.ContactsEmails.RemoveRange(emails); - } - - if (updateContact.BucketIds != null) - { - foreach (var bucketId in updateContact.BucketIds) - { - if (!bucketIds.Contains(bucketId)) - { - _context.ContactBucketMappings.Add(new ContactBucketMapping - { - BucketId = bucketId, - ContactId = contact.Id - }); - } - } - foreach (var bucketMapping in contactBuckets) - { - if (!updateContact.BucketIds.Contains(bucketMapping.BucketId)) - { - _context.ContactBucketMappings.Remove(bucketMapping); - } - } - } - else if (contactBuckets != null) - { - _context.ContactBucketMappings.RemoveRange(contactBuckets); - } - - if (updateContact.ProjectIds != null) - { - foreach (var ProjectId in updateContact.ProjectIds) - { - if (!projectIds.Contains(ProjectId)) - { - _context.ContactProjectMappings.Add(new ContactProjectMapping - { - ProjectId = ProjectId, - ContactId = contact.Id, - TenantId = tenantId - }); - } - } - - foreach (var projectMapping in contactProjects) - { - if (!updateContact.ProjectIds.Contains(projectMapping.ProjectId)) - { - _context.ContactProjectMappings.Remove(projectMapping); - } - } - } - else if (contactProjects != null) - { - _context.ContactProjectMappings.RemoveRange(contactProjects); - } - - if (updateContact.Tags != null) - { - var updatedTagIds = updateContact.Tags.Select(t => t.Id).Distinct().ToList(); - foreach (var tag in updateContact.Tags) - { - var namecheck = tagNames.Contains(tag.Name.ToLower()); - var idCheck = (!tagIds.Contains(tag.Id ?? Guid.Empty)); - var test = namecheck && idCheck; - if (test) - { - ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = tag.Id ?? existingTag.Id - }); - } - else if (tag.Id == null || tag.Id == Guid.Empty) - { - ContactTagMaster contactTag = new ContactTagMaster - { - Name = tag.Name, - Description = "", - TenantId = tenantId - }; - _context.ContactTagMasters.Add(contactTag); - - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = contactTag.Id - }); - } - } - foreach (var contactTag in contactTags) - { - if (!updatedTagIds.Contains(contactTag.ContactTagId)) - { - _context.ContactTagMappings.Remove(contactTag); - } - } - } - else if (contactTags != null) - { - _context.ContactTagMappings.RemoveRange(contactTags); - } - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contact.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - - contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); - phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == contact.Id).ToListAsync(); - contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == contact.Id).ToListAsync(); - tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); - tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - - ContactVM contactVM = new ContactVM(); - List phoneVMs = new List(); + // Remove phones not updated in payload foreach (var phone in phones) { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); + if (!updatedPhoneIds.Contains(phone.Id)) + { + context.ContactsPhones.Remove(phone); + } } - List emailVMs = new List(); + } + else if (phones.Any()) + { + context.ContactsPhones.RemoveRange(phones); + } + + // ---------------------- Update Emails ----------------------- + if (updateContact.ContactEmails != null) + { + var updatedEmailIds = updateContact.ContactEmails.Select(e => e.Id).Where(id => id != null && id != Guid.Empty).ToHashSet(); + + foreach (var emailDto in updateContact.ContactEmails) + { + var emailEntity = emailDto.ToContactEmailFromUpdateContactEmailDto(tenantId, contact.Id); + if (emailDto.Id != null && emailDto.Id != Guid.Empty && emailIds.Contains(emailEntity.Id)) + context.ContactsEmails.Update(emailEntity); + else + context.ContactsEmails.Add(emailEntity); + } + + // Remove emails not updated in payload foreach (var email in emails) { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); + if (!updatedEmailIds.Contains(email.Id)) + { + context.ContactsEmails.Remove(email); + } } - List tagVMs = new List(); + } + else if (emails.Any()) + { + context.ContactsEmails.RemoveRange(emails); + } + + // ---------------------- Update Buckets ----------------------- + if (updateContact.BucketIds != null) + { + var incomingBucketIds = updateContact.BucketIds.ToHashSet(); + + // Add newly added bucket mappings if accessible by user + foreach (var bucketId in incomingBucketIds) + { + if (!accessibleBucketIds.Contains(bucketId) && bucketIds.Contains(bucketId)) + { + context.ContactBucketMappings.Add(new ContactBucketMapping + { + BucketId = bucketId, + ContactId = contact.Id + }); + } + } + + // Remove bucket mappings removed in payload + foreach (var contactBucket in contactBuckets) + { + if (!incomingBucketIds.Contains(contactBucket.BucketId)) + { + context.ContactBucketMappings.Remove(contactBucket); + } + } + } + else if (contactBuckets.Any()) + { + context.ContactBucketMappings.RemoveRange(contactBuckets); + } + + // ---------------------- Update Projects ----------------------- + if (updateContact.ProjectIds != null) + { + var incomingProjectIds = updateContact.ProjectIds.ToHashSet(); + + foreach (var projectId in incomingProjectIds) + { + if (!projectIds.Contains(projectId)) + { + context.ContactProjectMappings.Add(new ContactProjectMapping + { + ProjectId = projectId, + ContactId = contact.Id, + TenantId = tenantId + }); + } + } + + foreach (var projectMapping in contactProjects) + { + if (!incomingProjectIds.Contains(projectMapping.ProjectId)) + { + context.ContactProjectMappings.Remove(projectMapping); + } + } + } + else if (contactProjects.Any()) + { + context.ContactProjectMappings.RemoveRange(contactProjects); + } + + // ---------------------- Update Tags ----------------------- + if (updateContact.Tags != null) + { + var updatedTagIds = updateContact.Tags.Select(t => t.Id).Where(id => id != null && id != Guid.Empty).ToHashSet(); + + foreach (var tagDto in updateContact.Tags) + { + var lowerName = tagDto.Name.Trim().ToLowerInvariant(); + + bool existsByName = !string.IsNullOrWhiteSpace(lowerName) && tagNameLookup.ContainsKey(lowerName); + bool idNotExistsInMapping = !updatedTagIds.Contains(tagDto.Id ?? Guid.Empty); + + if (existsByName && idNotExistsInMapping) + { + // Use existing tag by name + var existingTag = tagNameLookup[lowerName]; + context.ContactTagMappings.Add(new ContactTagMapping + { + ContactId = contact.Id, + ContactTagId = tagDto.Id ?? existingTag.Id + }); + } + else if (tagDto.Id == null || tagDto.Id == Guid.Empty) + { + // Create new tag master and mapping + var newTagMaster = new ContactTagMaster + { + Name = tagDto.Name, + Description = tagDto.Name, + TenantId = tenantId + }; + context.ContactTagMasters.Add(newTagMaster); + + // Mapping will use newTagMaster.Id once saved (EF will fix after SaveChanges) + context.ContactTagMappings.Add(new ContactTagMapping + { + ContactId = contact.Id, + ContactTagId = newTagMaster.Id + }); + } + } + + // Remove tag mappings no longer present foreach (var contactTagMapping in contactTags) { - ContactTagVM tagVM = new ContactTagVM(); - var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); - tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - tagVMs.Add(tagVM); + if (!updatedTagIds.Contains(contactTagMapping.ContactTagId)) + { + context.ContactTagMappings.Remove(contactTagMapping); + } } - - - contactVM = contact.ToContactVMFromContact(); - contactVM.ContactPhones = phoneVMs; - contactVM.ContactEmails = emailVMs; - contactVM.Tags = tagVMs; - contactVM.BucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); - contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - - _logger.LogInfo("Conatct {ContactId} has been updated by employee {EmployeeId}", contact.Id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactVM, "Contact Updated Successfully", 200); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + else if (contactTags.Any()) + { + context.ContactTagMappings.RemoveRange(contactTags); + } + + // ---------------------- Add Update Log ----------------------- + context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contact.Id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + // Save all changes once here + try + { + await context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException ex) + { + _logger.LogError(ex, "Concurrency conflict while employee {EmployeeId} was updating contact {ContactId}", loggedInEmployee.Id, contact.Id); + return ApiResponse.ErrorResponse("Concurrency conflict", "This contact was updated by another user. Please reload and try again.", 409); + } + + // Reload updated contact and related data for response, using a fresh context + using var responseContext = _dbContextFactory.CreateDbContext(); + + var reloadedContact = await responseContext.Contacts + .Include(c => c.ContactCategory) + .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); + + var responsePhones = await responseContext.ContactsPhones.AsNoTracking().Where(p => p.ContactId == reloadedContact.Id).ToListAsync(); + var responseEmails = await responseContext.ContactsEmails.AsNoTracking().Where(e => e.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactTags = await responseContext.ContactTagMappings.AsNoTracking().Where(t => t.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactBuckets = await responseContext.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactProjects = await responseContext.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == reloadedContact.Id).ToListAsync(); + + var tagIdsForResponse = responseContactTags.Select(t => t.ContactTagId).Distinct().ToList(); + var tagsForResponse = await responseContext.ContactTagMasters.Where(t => tagIdsForResponse.Contains(t.Id)).ToListAsync(); + + // Map entities to view models + var contactVM = reloadedContact.ToContactVMFromContact(); + + contactVM.ContactPhones = responsePhones.Select(p => p.ToContactPhoneVMFromContactPhone()).ToList(); + contactVM.ContactEmails = responseEmails.Select(e => e.ToContactEmailVMFromContactEmail()).ToList(); + contactVM.Tags = responseContactTags.Select(ctm => + { + var tag = tagsForResponse.Find(t => t.Id == ctm.ContactTagId); + return tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); + }).ToList(); + + contactVM.BucketIds = responseContactBuckets.Select(cb => cb.BucketId).ToList(); + contactVM.ProjectIds = responseContactProjects.Select(cp => cp.ProjectId).ToList(); + + _logger.LogInfo("Contact {ContactId} successfully updated by employee {EmployeeId}.", contact.Id, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(contactVM, "Contact Updated Successfully", 200); } + #endregion #region =================================================================== Contact Delete APIs =================================================================== - public async Task> DeleteContact(Guid id, bool active) + + public async Task> DeleteContactAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (id != Guid.Empty) + // Validate the contact id + if (id == Guid.Empty) { - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); - if (contact == null) - { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to delete contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - contact.IsActive = active; - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contact.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - _logger.LogInfo("Contact {ContactId} has been deleted by Employee {Employee}", id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(new { }, "Contact is deleted Successfully", 200); + _logger.LogWarning("Employee ID {EmployeeId} attempted to delete with an empty contact ID.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); } - _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); + + // Try to find the contact for the given tenant + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); + + if (contact == null) + { + _logger.LogWarning("Employee ID {EmployeeId} attempted to delete contact ID {ContactId}, but it was not found.", loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + + // Update the contact's active status (soft delete or activate) + contact.IsActive = active; + + // Log the update in the directory update logs + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contact.Id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + // Save changes to the database + await _context.SaveChangesAsync(); + + _logger.LogInfo("Contact ID {ContactId} has been {(DeletedOrActivated)} by Employee ID {EmployeeId}.", id, active ? "activated" : "deleted", loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(new { }, active ? "Contact is activated successfully" : "Contact is deleted successfully", 200); } + + #endregion #endregion @@ -1269,7 +1257,7 @@ namespace Marco.Pms.Services.Service if (loggedInEmployee == null) { _logger.LogWarning("GetListOFAllNotes: LoggedInEmployee is null. Cannot proceed."); - return ApiResponse.ErrorResponse("Unauthorized", "Employee not found.", 401); + return ApiResponse.ErrorResponse("Unauthorized", "Employee not found.", 403); } // --- Permission Checks --- @@ -1510,171 +1498,288 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Bucket APIs =================================================================== - - public async Task> GetBucketList() + public async Task> GetBucketListAsync(Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + _logger.LogInfo("Started fetching bucket list for Employee {EmployeeId} in Tenant {TenantId}", loggedInEmployee.Id, tenantId); - List employeeBuckets = await _context.EmployeeBucketMappings.Where(b => b.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - var bucketIds = employeeBuckets.Select(b => b.BucketId).ToList(); + // Check permissions early + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); - List bucketList = new List(); - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) { - bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => b.TenantId == tenantId).ToListAsync(); - bucketIds = bucketList.Select(b => b.Id).ToList(); + _logger.LogWarning("Employee {EmployeeId} attempted to access buckets without permission", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 403); } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) + + List bucketList; + List bucketIds; + + if (hasAdminPermission) { - bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => bucketIds.Contains(b.Id) || b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); + // Admin gets all buckets for the tenant + bucketList = await _context.Buckets + .Include(b => b.CreatedBy) + .Where(b => b.TenantId == tenantId) + .ToListAsync(); + + bucketIds = bucketList.Select(b => b.Id).ToList(); } else { - _logger.LogWarning("Employee {EmployeeId} attemped to access a buckets list, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } + // Manager or user: fetch employee bucket mappings and buckets accordingly - List employeeBucketVM = await _context.EmployeeBucketMappings.Where(b => bucketIds.Contains(b.BucketId)).ToListAsync(); + var employeeBuckets = await _context.EmployeeBucketMappings + .Where(b => b.EmployeeId == loggedInEmployee.Id) + .ToListAsync(); + + bucketIds = employeeBuckets.Select(b => b.BucketId).ToList(); + + bucketList = await _context.Buckets + .Include(b => b.CreatedBy) + .Where(b => bucketIds.Contains(b.Id) || b.CreatedByID == loggedInEmployee.Id) + .ToListAsync(); - List bucketVMs = new List(); - if (bucketList.Any()) - { bucketIds = bucketList.Select(b => b.Id).ToList(); - List? contactBucketMappings = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); - foreach (var bucket in bucketList) - { - List employeeBucketMappings = employeeBucketVM.Where(eb => eb.BucketId == bucket.Id).ToList(); - var emplyeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - List? contactBuckets = contactBucketMappings.Where(cb => cb.BucketId == bucket.Id).ToList(); - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - if (bucketVM.CreatedBy != null) - { - emplyeeIds.Add(bucketVM.CreatedBy.Id); - } - bucketVM.EmployeeIds = emplyeeIds.Distinct().ToList(); - bucketVM.NumberOfContacts = contactBuckets.Count; - bucketVMs.Add(bucketVM); - } } - _logger.LogInfo("{count} Buckets are fetched by Employee with ID {LoggedInEmployeeId}", bucketVMs.Count, LoggedInEmployee.Id); + if (!bucketList.Any()) + { + _logger.LogInfo("No buckets found for Employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new List(), "No buckets found", 200); + } + + // Fetch related data in parallel using Task.Run with separate contexts to avoid concurrency issues + var employeeBucketMappingsTask = Task.Run(async () => + { + using var context = _dbContextFactory.CreateDbContext(); + return await context.EmployeeBucketMappings + .Where(b => bucketIds.Contains(b.BucketId)) + .ToListAsync(); + }); + + var contactBucketMappingsTask = Task.Run(async () => + { + using var context = _dbContextFactory.CreateDbContext(); + return await context.ContactBucketMappings + .Where(cb => bucketIds.Contains(cb.BucketId)) + .ToListAsync(); + }); + + await Task.WhenAll(employeeBucketMappingsTask, contactBucketMappingsTask); + + var employeeBucketMappings = employeeBucketMappingsTask.Result; + var contactBucketMappings = contactBucketMappingsTask.Result; + + var bucketVMs = new List(); + + // Prepare view models for each bucket + foreach (var bucket in bucketList) + { + var mappedEmployees = employeeBucketMappings + .Where(eb => eb.BucketId == bucket.Id) + .Select(eb => eb.EmployeeId) + .ToList(); + + if (bucket.CreatedBy != null) + { + mappedEmployees.Add(bucket.CreatedBy.Id); + } + + var contactCount = contactBucketMappings.Count(cb => cb.BucketId == bucket.Id); + + var bucketVM = bucket.ToAssignBucketVMFromBucket(); + bucketVM.EmployeeIds = mappedEmployees.Distinct().ToList(); + bucketVM.NumberOfContacts = contactCount; + + bucketVMs.Add(bucketVM); + } + + _logger.LogInfo("Fetched {BucketCount} buckets for Employee {EmployeeId} successfully", bucketVMs.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(bucketVMs, $"{bucketVMs.Count} buckets fetched successfully", 200); } - public async Task> CreateBucket(CreateBucketDto bucketDto) + public async Task> CreateBucketAsync(CreateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (bucketDto != null) + if (bucketDto == null) { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var demo = !permissionIds.Contains(PermissionsMaster.DirectoryUser); - if (!permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryUser)) + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sent empty payload", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User sent empty Payload", "User sent empty Payload", 400); + } + + try + { + // Check permissions for the logged-in employee in parallel + var permissionTask = CheckPermissionsAsync(loggedInEmployee.Id); + + // Check if a bucket with the same name already exists (case insensitive) + var existingBucketTask = _context.Buckets.FirstOrDefaultAsync(b => b.Name.ToLower() == bucketDto.Name.ToLower()); + + await Task.WhenAll(permissionTask, existingBucketTask); + + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = permissionTask.Result; + var existingBucket = existingBucketTask.Result; + + // If the user does not have any of the required permissions, deny access + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) { - _logger.LogWarning("Employee {EmployeeId} attemped to create a bucket, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); + _logger.LogWarning("Employee {EmployeeId} attempted to create bucket without permission", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 403); } - var existingBucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Name == bucketDto.Name); + // If bucket with the same name exists, return conflict response if (existingBucket != null) { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing bucket.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket already existed", "Bucket already existed", 409); + _logger.LogWarning("Employee {EmployeeId} attempted to create an existing bucket with name '{BucketName}'", loggedInEmployee.Id, bucketDto.Name); + return ApiResponse.ErrorResponse("Bucket already exists", "Bucket already exists", 409); } - Bucket bucket = new Bucket + + // Create new bucket entity + var newBucket = new Bucket { Name = bucketDto.Name, Description = bucketDto.Description, CreatedAt = DateTime.UtcNow, - CreatedByID = LoggedInEmployee.Id, + CreatedByID = loggedInEmployee.Id, TenantId = tenantId }; - _context.Buckets.Add(bucket); - EmployeeBucketMapping employeeBucket = new EmployeeBucketMapping + // Add bucket to context + _context.Buckets.Add(newBucket); + + // Create mapping between employee and bucket + var employeeBucketMapping = new EmployeeBucketMapping { - EmployeeId = LoggedInEmployee.Id, - BucketId = bucket.Id + EmployeeId = loggedInEmployee.Id, + BucketId = newBucket.Id }; - _context.EmployeeBucketMappings.Add(employeeBucket); - await _context.SaveChangesAsync(); - bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucket.Id) ?? new Bucket(); - BucketVM bucketVM = bucket.ToBucketVMFromBucket(); - _logger.LogInfo("Employee Id {LoggedInEmployeeId} creayted new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.SuccessResponse(bucketVM, "Bucket Created SuccessFully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateBucket(Guid id, UpdateBucketDto bucketDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (bucketDto != null && id == bucketDto.Id) - { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); - Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketDto.Id && b.TenantId == tenantId); + // Add employee-bucket mapping to context + _context.EmployeeBucketMappings.Add(employeeBucketMapping); + // Save changes to DB + await _context.SaveChangesAsync(); + + // Load the newly created bucket including creator info for response + var createdBucket = await _context.Buckets + .Include(b => b.CreatedBy) + .ThenInclude(e => e!.JobRole) + .FirstOrDefaultAsync(b => b.Id == newBucket.Id); + + var bucketVM = _mapper.Map(createdBucket); + + _logger.LogInfo("Employee {EmployeeId} successfully created bucket {BucketId}", loggedInEmployee.Id, newBucket.Id); + + return ApiResponse.SuccessResponse(bucketVM, "Bucket created successfully", 200); + } + catch (Exception ex) + { + // Log unexpected exceptions + _logger.LogError(ex, "Error occurred while employee {EmployeeId} was creating a bucket", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal server error", "Internal server error", 500); + } + } + public async Task> UpdateBucketAsync(Guid id, UpdateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee) + { + if (bucketDto == null || id != bucketDto.Id) + { + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sent invalid or empty payload for bucket update.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid or empty payload", "Invalid or empty payload", 400); + } + + try + { + // Check user permissions in parallel + var permissionTask = CheckPermissionsAsync(loggedInEmployee.Id); + + // Use IDbContextFactory to create separate contexts for parallel DB calls + using var employeeBucketContext = _dbContextFactory.CreateDbContext(); + using var bucketContext = _dbContextFactory.CreateDbContext(); + using var contactBucketContext = _dbContextFactory.CreateDbContext(); + + // Load employee buckets where BucketId == id in parallel + var employeeBucketsTask = employeeBucketContext.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .ToListAsync(); + + // Load the bucket with CreatedBy for given id and tenantId + var bucketTask = bucketContext.Buckets + .Include(b => b.CreatedBy) + .ThenInclude(e => e!.JobRole) + .FirstOrDefaultAsync(b => b.Id == bucketDto.Id && b.TenantId == tenantId); + + // Await all parallel tasks + await Task.WhenAll(permissionTask, employeeBucketsTask, bucketTask); + + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = permissionTask.Result; + var employeeBuckets = employeeBucketsTask.Result; + var bucket = bucketTask.Result; + + // Validate bucket exists if (bucket == null) { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update bucket {BucketId}, but it was not found in database.", loggedInEmployee.Id, bucketDto.Id); return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); } - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + // Determine if employee has access to update the bucket + var bucketIdsForEmployee = employeeBuckets.Select(eb => eb.BucketId).ToList(); + + bool hasAccess = false; + if (hasAdminPermission) { - accessableBucket = bucket; + hasAccess = true; } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) + else if (hasManagerPermission && bucketIdsForEmployee.Contains(id)) { - accessableBucket = bucket; + hasAccess = true; } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) + else if (hasUserPermission && bucket.CreatedByID == loggedInEmployee.Id) { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + hasAccess = true; } - bucket.Name = bucketDto.Name ?? ""; - bucket.Description = bucketDto.Description ?? ""; + if (!hasAccess) + { + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update bucket {BucketId} without sufficient permissions.", loggedInEmployee.Id, bucket.Id); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); + } + // Update bucket properties safely + bucket.Name = bucketDto.Name ?? string.Empty; + bucket.Description = bucketDto.Description ?? string.Empty; + + // Log the update attempt in directory update logs _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog { RefereanceId = bucketDto.Id, - UpdatedById = LoggedInEmployee.Id, + UpdatedById = loggedInEmployee.Id, UpdateAt = DateTime.UtcNow }); + // Save changes to bucket and logs await _context.SaveChangesAsync(); - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - List employeeBucketMappings = employeeBuckets.Where(eb => eb.BucketId == bucket.Id).ToList(); - List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - var employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - bucketVM.EmployeeIds = employeeIds; + // Now load contacts related to the bucket using a separate context for parallelism + var contactBuckets = await contactBucketContext.ContactBucketMappings + .Where(cb => cb.BucketId == bucket.Id) + .ToListAsync(); + + // Prepare view model to return + AssignBucketVM bucketVM = _mapper.Map(bucket); + bucketVM.EmployeeIds = employeeBuckets.Where(eb => eb.BucketId == bucket.Id).Select(eb => eb.EmployeeId).ToList(); bucketVM.NumberOfContacts = contactBuckets.Count; - _logger.LogInfo("Employee Id {LoggedInEmployeeId} Updated new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.SuccessResponse(bucketVM, "Bucket update successFully", 200); + _logger.LogInfo("Employee ID {LoggedInEmployeeId} successfully updated bucket ID {BucketId}.", loggedInEmployee.Id, bucket.Id); + + return ApiResponse.SuccessResponse(bucketVM, "Bucket updated successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred while employee ID {LoggedInEmployeeId} attempted to update bucket ID {BucketId}.", loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("An unexpected error occurred. Please try again later.", "Internal server error", 500); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); } + public async Task> AssignBucket(Guid bucketId, List assignBuckets) { Guid tenantId = _userHelper.GetTenantId(); @@ -1713,7 +1818,7 @@ namespace Marco.Pms.Services.Service if (accessableBucket == null) { _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); } var employeeIds = await _context.Employees.Where(e => e.TenantId == tenantId && e.IsActive).Select(e => e.Id).ToListAsync(); int assignedEmployee = 0; @@ -1814,7 +1919,7 @@ namespace Marco.Pms.Services.Service if (accessableBucket == null) { _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); } _context.EmployeeBucketMappings.RemoveRange(employeeBuckets); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index 1204ce7..ee12e23 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -8,20 +8,24 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { Task> GetListOfContactsAsync(string? search, string? filter, Guid? projectId, bool active, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); Task> GetListOfContactsOld(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId); - Task> GetContactsListByBucketId(Guid id); + Task> GetContactsListByBucketIdAsync(Guid bucketId, Guid tenantId, Employee loggedInEmployee); Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee); Task> GetOrganizationListAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateContactAsync(CreateContactDto createContact, Guid tenantId, Employee loggedInEmployee); - Task> UpdateContact(Guid id, UpdateContactDto updateContact); - Task> DeleteContact(Guid id, bool active); + Task> UpdateContactAsync(Guid id, UpdateContactDto updateContact, Guid tenantId, Employee loggedInEmployee); + Task> DeleteContactAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); + + Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber); Task> GetNoteListByContactId(Guid id, bool active); Task> CreateContactNote(CreateContactNoteDto noteDto); Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto); Task> DeleteContactNote(Guid id, bool active); - Task> GetBucketList(); - Task> CreateBucket(CreateBucketDto bucketDto); - Task> UpdateBucket(Guid id, UpdateBucketDto bucketDto); + + + Task> GetBucketListAsync(Guid tenantId, Employee loggedInEmployee); + Task> CreateBucketAsync(CreateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee); + Task> UpdateBucketAsync(Guid id, UpdateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee); Task> AssignBucket(Guid bucketId, List assignBuckets); Task> DeleteBucket(Guid id); } -- 2.43.0 From 830accbe986417e7151b251d0381b2554faa8f02 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 7 Aug 2025 15:16:15 +0530 Subject: [PATCH 07/63] Optimized the assign bucket API and delete bucket API in Directory module --- .../Controllers/DirectoryController.cs | 4 +- .../Service/DirectoryService.cs | 354 ++++++++++++------ .../ServiceInterfaces/IDirectoryService.cs | 4 +- 3 files changed, 234 insertions(+), 128 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index c496297..efa7490 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -238,7 +238,7 @@ namespace Marco.Pms.Services.Controllers public async Task AssignBucket(Guid bucketId, [FromBody] List assignBuckets) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _directoryService.AssignBucket(bucketId, assignBuckets); + var response = await _directoryService.AssignBucketAsync(bucketId, assignBuckets, tenantId, loggedInEmployee); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = response.Data }; @@ -251,7 +251,7 @@ namespace Marco.Pms.Services.Controllers public async Task DeleteBucket(Guid id) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _directoryService.DeleteBucket(id); + var response = await _directoryService.DeleteBucketAsync(id, tenantId, loggedInEmployee); if (response.Success) { var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Buckets", Response = id }; diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 5c85fe9..f6d7193 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -1780,163 +1780,269 @@ namespace Marco.Pms.Services.Service } } - public async Task> AssignBucket(Guid bucketId, List assignBuckets) + public async Task> AssignBucketAsync(Guid bucketId, List assignBuckets, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (assignBuckets != null && bucketId != Guid.Empty) + // Validate input payload + if (assignBuckets == null || bucketId == Guid.Empty) { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); + _logger.LogWarning("Employee with ID {EmployeeId} sent empty or invalid payload.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User sent empty or invalid payload", "User sent empty or invalid payload", 400); + } - Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + // Check permissions of the logged-in employee + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + + + // Load the bucket with related CreatedBy and validate tenant + var bucket = await _context.Buckets.Include(b => b.CreatedBy) + .FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + + if (bucket == null) + { + _logger.LogWarning("Employee ID {EmployeeId} attempted to update bucket {BucketId} but it was not found.", loggedInEmployee.Id, bucketId); + return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); + } + + // Load EmployeeBucketMappings related to the bucket + var employeeBuckets = await _context.EmployeeBucketMappings + .Where(eb => eb.BucketId == bucketId) + .ToListAsync(); + + var employeeBucketIds = employeeBuckets.Select(eb => eb.EmployeeId).ToHashSet(); + + // Check access permissions to the bucket + bool hasAccess = false; + if (hasAdminPermission) + { + hasAccess = true; + } + else if (hasManagerPermission && employeeBucketIds.Contains(loggedInEmployee.Id)) + { + hasAccess = true; + } + else if (hasUserPermission && bucket.CreatedByID == loggedInEmployee.Id) + { + hasAccess = true; + } + + if (!hasAccess) + { + _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without permission.", loggedInEmployee.Id, bucketId); + return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); + } + + // Load active employees tenant-wide + var activeEmployeeIds = await _context.Employees + .Where(e => e.TenantId == tenantId && e.IsActive) + .Select(e => e.Id) + .ToListAsync(); + + int assignedEmployeesCount = 0; + int removedEmployeesCount = 0; + + // Process each assignment request + foreach (var assignBucket in assignBuckets) + { + if (!activeEmployeeIds.Contains(assignBucket.EmployeeId)) + { + // Skip employee IDs that are not active or not in tenant + _logger.LogWarning("Skipping inactive or non-tenant employee ID {EmployeeId} in assignment.", assignBucket.EmployeeId); + continue; + } + + if (assignBucket.IsActive) + { + // Add mapping if not already exists + if (!employeeBucketIds.Contains(assignBucket.EmployeeId)) + { + var newMapping = new EmployeeBucketMapping + { + EmployeeId = assignBucket.EmployeeId, + BucketId = bucketId + }; + _context.EmployeeBucketMappings.Add(newMapping); + assignedEmployeesCount++; + } + } + else + { + // Remove mapping if it exists + var existingMapping = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == assignBucket.EmployeeId); + if (existingMapping != null && bucket.CreatedByID != assignBucket.EmployeeId) + { + _context.EmployeeBucketMappings.Remove(existingMapping); + removedEmployeesCount++; + } + } + } + + // Add directory update log + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = bucketId, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + // Save changes with error handling + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + _logger.LogError(ex, "Failed to save changes while assigning bucket {BucketId} by employee {EmployeeId}.", bucketId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Failed to update bucket assignments", "An error occurred while updating bucket assignments", 500); + } + + // Reload mappings and contacts for the updated bucket + var employeeBucketMappingTask = Task.Run(async () => + { + using (var context = _dbContextFactory.CreateDbContext()) + { + return await context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); + } + }); + var contactBucketMappingTask = Task.Run(async () => + { + using (var context = _dbContextFactory.CreateDbContext()) + { + return await context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); + } + }); + await Task.WhenAll(employeeBucketMappingTask, contactBucketMappingTask); + var employeeBucketMappings = employeeBucketMappingTask.Result; + var contactBucketMappings = contactBucketMappingTask.Result; + + // Prepare view model response + var bucketVm = _mapper.Map(bucket); + bucketVm.EmployeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); + bucketVm.NumberOfContacts = contactBucketMappings.Count; + + // Log assignment and removal actions + if (assignedEmployeesCount > 0) + { + _logger.LogInfo("Employee {EmployeeId} assigned bucket {BucketId} to {Count} employees.", loggedInEmployee.Id, bucketId, assignedEmployeesCount); + } + if (removedEmployeesCount > 0) + { + _logger.LogInfo("Employee {EmployeeId} removed {Count} employees from bucket {BucketId}.", loggedInEmployee.Id, removedEmployeesCount, bucketId); + } + + return ApiResponse.SuccessResponse(bucketVm, "Bucket details updated successfully", 200); + } + + public async Task> DeleteBucketAsync(Guid id, Guid tenantId, Employee loggedInEmployee) + { + try + { + // Fetch the bucket in the main context to verify existence and tenant scope + var bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == id && b.TenantId == tenantId); if (bucket == null) { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); - } - var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucketId).ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); - var employeeBucketIds = employeeBuckets.Select(eb => eb.EmployeeId).ToList(); - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(bucketId)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); - } - var employeeIds = await _context.Employees.Where(e => e.TenantId == tenantId && e.IsActive).Select(e => e.Id).ToListAsync(); - int assignedEmployee = 0; - int removededEmployee = 0; - foreach (var assignBucket in assignBuckets) - { - if (employeeIds.Contains(assignBucket.EmployeeId)) - { - if (assignBucket.IsActive && !employeeBucketIds.Contains(assignBucket.EmployeeId)) - { - EmployeeBucketMapping employeeBucketMapping = new EmployeeBucketMapping - { - EmployeeId = assignBucket.EmployeeId, - BucketId = bucketId - }; - _context.EmployeeBucketMappings.Add(employeeBucketMapping); - assignedEmployee += 1; - } - else if (!assignBucket.IsActive) - { - EmployeeBucketMapping? employeeBucketMapping = employeeBuckets.FirstOrDefault(eb => eb.BucketId == bucketId && eb.EmployeeId == assignBucket.EmployeeId); - if (employeeBucketMapping != null) - { - _context.EmployeeBucketMappings.Remove(employeeBucketMapping); - removededEmployee += 1; - } - } - } + _logger.LogWarning("Employee {EmployeeId} attempted to delete bucket {BucketId}, bucket not found for tenant {TenantId}.", + loggedInEmployee.Id, id, tenantId); + + // Returning success response to maintain idempotency + return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); } - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + // Run parallel tasks to fetch related mappings using separate DbContext instances + var employeeBucketMappingsTask = Task.Run(async () => { - RefereanceId = bucketId, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow + using var context = _dbContextFactory.CreateDbContext(); + return await context.EmployeeBucketMappings + .Where(eb => eb.BucketId == bucket.Id) + .ToListAsync(); }); - await _context.SaveChangesAsync(); - - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - List employeeBucketMappings = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - bucketVM.EmployeeIds = employeeIds; - bucketVM.NumberOfContacts = contactBuckets.Count; - - if (assignedEmployee > 0) + var contactBucketMappingsTask = Task.Run(async () => { - _logger.LogInfo("Employee {EmployeeId} assigned bucket {BucketId} to {conut} number of employees", LoggedInEmployee.Id, bucketId, assignedEmployee); - } - if (removededEmployee > 0) + using var context = _dbContextFactory.CreateDbContext(); + return await context.ContactBucketMappings + .Where(cb => cb.BucketId == bucket.Id) + .ToListAsync(); + }); + + // Await both tasks concurrently + await Task.WhenAll(employeeBucketMappingsTask, contactBucketMappingsTask); + + var employeeBucketMappings = employeeBucketMappingsTask.Result; + var contactBucketMappings = contactBucketMappingsTask.Result; + + // Check if bucket has any contacts mapped - cannot delete in this state + if (contactBucketMappings.Any()) { - _logger.LogWarning("Employee {EmployeeId} removed {conut} number of employees from bucket {BucketId}", LoggedInEmployee.Id, removededEmployee, bucketId); - } - return ApiResponse.SuccessResponse(bucketVM, "Details updated successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> DeleteBucket(Guid id) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + _logger.LogInfo("Employee {EmployeeId} attempted to delete bucket {BucketId} but bucket contains contacts, deletion blocked.", + loggedInEmployee.Id, bucket.Id); - Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); - - if (bucket != null) - { - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - List? contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - - if (contactBuckets.Any()) - { - _logger.LogInfo("Employee {EmployeeId} attempted to deleted bucket {BucketId},but bucket have contacts in it.", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("This bucket can not be deleted", "This bucket can not be deleted", 400); + return ApiResponse.ErrorResponse("This bucket cannot be deleted because it contains contacts.", + "This bucket cannot be deleted", 400); } - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); + // Check permissions of the logged-in employee + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) + var accessibleBucket = (Bucket?)null; + + // Get bucket IDs for which the employee has mapping association + var employeeBucketIds = employeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToList(); + + // Determine if employee has permission to delete this bucket + if (hasAdminPermission) { - accessableBucket = bucket; + accessibleBucket = bucket; } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) + else if (hasManagerPermission && employeeBucketIds.Contains(bucket.Id)) { - accessableBucket = bucket; + accessibleBucket = bucket; } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) + else if (hasUserPermission && bucket.CreatedByID == loggedInEmployee.Id) { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); + accessibleBucket = bucket; } - _context.EmployeeBucketMappings.RemoveRange(employeeBuckets); + if (accessibleBucket == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to delete bucket {BucketId} without sufficient permissions.", + loggedInEmployee.Id, bucket.Id); + + return ApiResponse.ErrorResponse("You don't have permission to access this bucket.", + "Permission denied", 403); + } + + // Remove related employee bucket mappings + _context.EmployeeBucketMappings.RemoveRange(employeeBucketMappings); + // Remove the bucket itself _context.Buckets.Remove(bucket); + // Log deletion action _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, + RefereanceId = bucket.Id, + UpdatedById = loggedInEmployee.Id, UpdateAt = DateTime.UtcNow }); + await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted bucket {BucketId} and related entries", LoggedInEmployee.Id, id); + + _logger.LogInfo("Employee {EmployeeId} deleted bucket {BucketId} along with related employee bucket mappings.", + loggedInEmployee.Id, bucket.Id); + return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); } + catch (Exception ex) + { + // Log the exception with error level + _logger.LogError(ex, "An error occurred while employee {EmployeeId} attempted to delete bucket {BucketId}.", + loggedInEmployee.Id, id); - _logger.LogWarning("Employee {EmployeeId} tries to delete bucket {BucketId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); + return ApiResponse.ErrorResponse("An unexpected error occurred while deleting the bucket.", + "Internal Server Error", 500); + } } #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index ee12e23..5884e42 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -26,7 +26,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetBucketListAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateBucketAsync(CreateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee); Task> UpdateBucketAsync(Guid id, UpdateBucketDto bucketDto, Guid tenantId, Employee loggedInEmployee); - Task> AssignBucket(Guid bucketId, List assignBuckets); - Task> DeleteBucket(Guid id); + Task> AssignBucketAsync(Guid bucketId, List assignBuckets, Guid tenantId, Employee loggedInEmployee); + Task> DeleteBucketAsync(Guid id, Guid tenantId, Employee loggedInEmployee); } } -- 2.43.0 From ef41990d7ff4f8cb421c649f7784d35b1d6a70f4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 8 Aug 2025 11:47:18 +0530 Subject: [PATCH 08/63] Optimized the get list Notes API --- .../Controllers/DirectoryController.cs | 12 +- .../Service/DirectoryService.cs | 344 ++++++++++-------- .../ServiceInterfaces/IDirectoryService.cs | 9 +- 3 files changed, 202 insertions(+), 163 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index efa7490..eac6929 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -127,17 +127,18 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Contact Notes APIs =================================================================== [HttpGet("notes")] - public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int? pageSize, [FromQuery] int pageNumber) + public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { - var response = await _directoryService.GetListOFAllNotes(projectId, pageSize ?? 25, pageNumber); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetListOFAllNotesAsync(projectId, pageSize, pageNumber, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } [HttpPost("note")] public async Task CreateContactNote([FromBody] CreateContactNoteDto noteDto) { - - var response = await _directoryService.CreateContactNote(noteDto); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.CreateContactNote(noteDto, tenantId, loggedInEmployee); ; if (response.StatusCode == 200) { return Ok(response); @@ -155,7 +156,8 @@ namespace Marco.Pms.Services.Controllers [HttpGet("notes/{ContactId}")] public async Task GetNoteListByContactId(Guid contactId, [FromQuery] bool active = true) { - var response = await _directoryService.GetNoteListByContactId(contactId, active); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetNoteListByContactId(contactId, active, tenantId, loggedInEmployee); if (response.StatusCode == 200) { return Ok(response); diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index f6d7193..0a119e3 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -560,7 +560,9 @@ namespace Marco.Pms.Services.Service .AsNoTracking() // Use AsNoTracking for read-only operations to improve performance. .Include(c => c.ContactCategory) .Include(c => c.CreatedBy) + .ThenInclude(e => e!.JobRole) .Include(c => c.UpdatedBy) + .ThenInclude(e => e!.JobRole) .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); if (contact == null) { @@ -611,6 +613,7 @@ namespace Marco.Pms.Services.Service .AsNoTracking() .Include(cb => cb.Bucket) .ThenInclude(b => b!.CreatedBy) + .ThenInclude(e => e!.JobRole) .Where(cb => cb.ContactId == contact.Id && cb.Bucket != null && cb.Bucket.TenantId == tenantId); if (hasAdminPermission) @@ -649,7 +652,9 @@ namespace Marco.Pms.Services.Service return await taskDbContext.ContactNotes .AsNoTracking() .Include(cn => cn.Createdby) + .ThenInclude(e => e!.JobRole) .Include(cn => cn.UpdatedBy) + .ThenInclude(e => e!.JobRole) .Include(cn => cn.Contact) .Where(cn => cn.ContactId == contact.Id && cn.Createdby != null && cn.Createdby.TenantId == tenantId) .Select(cn => _mapper.Map(cn)) @@ -1240,193 +1245,216 @@ namespace Marco.Pms.Services.Service #region =================================================================== Contact Notes APIs =================================================================== - /// - /// Retrieves a paginated list of contact notes based on user permissions. - /// - /// The number of items per page. - /// The current page number. - /// An ApiResponse containing the paginated notes or an error message. - public async Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber) + public async Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee) { - _logger.LogInfo("Attempting to fetch list of all notes. PageSize: {PageSize}, PageNumber: {PageNumber}", pageSize, pageNumber); + _logger.LogInfo("Initiating GetListOFAllNotesAsync. TenantId: {TenantId}, ProjectId: {ProjectId}, PageSize: {PageSize}, PageNumber: {PageNumber}, EmployeeId: {EmployeeId}", + tenantId, projectId ?? Guid.Empty, pageSize, pageNumber, loggedInEmployee.Id); - Guid tenantId = _userHelper.GetTenantId(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - List? projectContactIds = null; - - if (loggedInEmployee == null) + // Ensure user context is present + if (loggedInEmployee.Id == Guid.Empty || tenantId == Guid.Empty) { - _logger.LogWarning("GetListOFAllNotes: LoggedInEmployee is null. Cannot proceed."); + _logger.LogWarning("Unauthorized: LoggedInEmployee is null."); return ApiResponse.ErrorResponse("Unauthorized", "Employee not found.", 403); } - // --- Permission Checks --- - var hasAdminPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); - var hasManagerPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); - var hasUserPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryUser, loggedInEmployee.Id); - - IQueryable notesQuery = _context.ContactNotes - .Include(cn => cn.UpdatedBy) - .Include(cn => cn.Createdby) // Assuming 'CreatedBy' (PascalCase) - .Include(cn => cn.Contact) - .Where(cn => cn.TenantId == tenantId) - .AsQueryable(); // Start building the query - - if (!hasAdminPermission && !(hasManagerPermission || hasUserPermission)) + try { - _logger.LogWarning("GetListOFAllNotes: User {EmployeeId} does not have required permissions to access notes for TenantId: {TenantId}", loggedInEmployee.Id, tenantId); + // Use a context instance per method call for safety in parallel scenarios + await using var context = _dbContextFactory.CreateDbContext(); + + // Permission checks (parallel as they're independent) + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + + // Access control + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + _logger.LogWarning("Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId}", loggedInEmployee.Id, tenantId); + return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); + } + + // Build base query + IQueryable notesQuery = context.ContactNotes + .Include(cn => cn.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Include(cn => cn.Createdby) + .ThenInclude(e => e!.JobRole) + .Include(cn => cn.Contact) + .Where(cn => cn.TenantId == tenantId); + + // Fetch associated contact IDs for project (if filtering by project) + List? projectContactIds = null; + if (projectId.HasValue) + { + projectContactIds = await context.ContactProjectMappings + .Where(pc => pc.ProjectId == projectId.Value) + .Select(pc => pc.ContactId) + .ToListAsync(); + } + + if (!hasAdminPermission) // Manager/User filtering + { + _logger.LogInfo("Non-admin user. Applying bucket-based filtering. EmployeeId: {EmployeeId}", loggedInEmployee.Id); + // Get assigned bucket IDs + var assignedBucketIds = await context.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToListAsync(); + + if (!assignedBucketIds.Any()) + { + _logger.LogInfo("No assigned buckets for user: {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new + { + CurrentPage = pageNumber, + TotalPages = 0, + Data = new List() + }, "No notes found based on assigned buckets.", 200); + } + + // Contacts based on assigned buckets, further filtered by project (if provided) + var contactBucketQuery = context.ContactBucketMappings + .Where(cb => assignedBucketIds.Contains(cb.BucketId)); + + if (projectContactIds != null) + { + contactBucketQuery = contactBucketQuery.Where(cb => projectContactIds.Contains(cb.ContactId)); + } + + var contactIds = await contactBucketQuery.Select(cb => cb.ContactId).Distinct().ToListAsync(); + + if (!contactIds.Any()) + { + _logger.LogInfo("No contacts found for assigned buckets for user: {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new + { + CurrentPage = pageNumber, + TotalPages = 0, + Data = new List() + }, "No notes found for associated contacts.", 200); + } + + notesQuery = notesQuery.Where(cn => contactIds.Contains(cn.ContactId)); + } + else + { + // Admin: If project specified, filter notes further + if (projectContactIds != null) + notesQuery = notesQuery.Where(cn => projectContactIds.Contains(cn.ContactId)); + } + + // Pagination safeguard + pageSize = pageSize < 1 ? 25 : pageSize; + pageNumber = pageNumber < 1 ? 1 : pageNumber; + + // Accurate pagination metadata + int totalRecords = await notesQuery.CountAsync(); + int totalPages = (int)Math.Ceiling(totalRecords / (double)pageSize); + + // Fetch paginated, ordered results + List notes = await notesQuery + .OrderByDescending(cn => cn.UpdatedAt ?? cn.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(); + + _logger.LogInfo("Notes fetched: {Count}, Page: {PageNumber}/{TotalPages}, EmployeeId: {EmployeeId}, TenantId: {TenantId}", + notes.Count, pageNumber, totalPages, loggedInEmployee.Id, tenantId); + + // In-memory mapping to ViewModel + var noteVms = _mapper.Map>(notes); + + var response = new + { + CurrentPage = pageNumber, + PageSize = pageSize, + TotalPages = totalPages, + TotalRecords = totalRecords, + Data = noteVms + }; + + _logger.LogInfo("Notes mapped to ViewModel for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(response, $"{noteVms.Count} notes fetched successfully.", 200); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occurred in GetListOFAllNotesAsync. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while fetching notes. Please try again later.", 500); + } + } + public async Task> GetNoteListByContactId(Guid id, bool active, Guid tenantId, Employee loggedInEmployee) + { + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + _logger.LogWarning("Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId} Do not have permission", loggedInEmployee.Id, tenantId); return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); } - if (projectId != null) + + Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + if (contact == null) { - projectContactIds = await _context.ContactProjectMappings - .Where(pc => pc.ProjectId == projectId) - .Select(pc => pc.ContactId) - .ToListAsync(); + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to fetch a list notes from contact with ID {ContactId}, but the contact was not found in the database.", loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); } - if (!hasAdminPermission) // If not an admin, apply additional filtering + + if (!hasAdminPermission && (hasManagerPermission || hasUserPermission)) { - _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} is not an admin. Applying manager/user specific filters.", loggedInEmployee.Id); - var assignedBucketIds = await _context.EmployeeBucketMappings - .Where(eb => eb.EmployeeId == loggedInEmployee.Id) - .Select(eb => eb.BucketId) - .ToListAsync(); - - if (!assignedBucketIds.Any()) + var bucketIds = await _context.EmployeeBucketMappings.Where(em => em.EmployeeId == loggedInEmployee.Id).Select(em => em.BucketId).ToListAsync(); + var hasContactAccess = await _context.ContactBucketMappings.AnyAsync(cb => bucketIds.Contains(cb.BucketId) && cb.ContactId == contact.Id); + if (!hasContactAccess) { - _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} has no assigned buckets. Returning empty list.", loggedInEmployee.Id); - return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found based on assigned buckets.", 200); - } - - List? contactIds = null; - - if (projectContactIds == null) - { - contactIds = await _context.ContactBucketMappings - .Where(cb => assignedBucketIds.Contains(cb.BucketId)) - .Select(cb => cb.ContactId) - .ToListAsync(); - } - else - { - contactIds = await _context.ContactBucketMappings - .Where(cb => assignedBucketIds.Contains(cb.BucketId) && projectContactIds.Contains(cb.ContactId)) - .Select(cb => cb.ContactId) - .ToListAsync(); - } - - if (!contactIds.Any()) - { - _logger.LogInfo("GetListOFAllNotes: No contacts found for assigned buckets for user {EmployeeId}. Returning empty list.", loggedInEmployee.Id); - return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found for associated contacts.", 200); - } - - notesQuery = notesQuery.Where(cn => contactIds.Contains(cn.ContactId)); - } - else - { - if (projectContactIds != null) - { - notesQuery = notesQuery.Where(cn => projectContactIds.Contains(cn.ContactId)); + _logger.LogWarning("Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId} Do not have access of bucket", loggedInEmployee.Id, tenantId); + return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); } } - // --- Pagination Logic --- - // Ensure pageSize and pageNumber are valid - pageSize = pageSize < 1 ? 25 : pageSize; // Default to 25 if less than 1 - pageNumber = pageNumber < 1 ? 1 : pageNumber; // Default to 1 if less than 1 + var notesQuery = _context.ContactNotes + .Include(n => n.Createdby) + .ThenInclude(e => e!.JobRole) + .Include(n => n.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId); - // Get total count BEFORE applying Skip/Take for accurate pagination metadata - int totalRecords = await notesQuery.CountAsync(); - int totalPages = (int)Math.Ceiling((double)totalRecords / pageSize); + if (active) + { + notesQuery = notesQuery.Where(n => n.IsActive); + } - int skip = (pageNumber - 1) * pageSize; + List notes = await notesQuery.ToListAsync(); - // --- Apply Ordering and Pagination in the database --- - List notes = await notesQuery - .OrderByDescending(cn => (cn.UpdatedAt != null ? cn.UpdatedAt : cn.CreatedAt)) // Order by updated date or created date - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize) + var noteIds = notes.Select(n => n.Id).ToList(); + List? updateLogs = await _context.DirectoryUpdateLogs + .Include(l => l.Employee) + .ThenInclude(e => e!.JobRole) + .Where(l => noteIds.Contains(l.RefereanceId)) .ToListAsync(); - _logger.LogInfo("GetListOFAllNotes: Fetched {Count} notes for page {PageNumber} of {TotalPages} total pages. Total records: {TotalRecords}.", - notes.Count, pageNumber, totalPages, totalRecords); + List noteVMs = _mapper.Map>(notes); - // --- Map to ViewModel (in-memory) --- - // This mapping is done in memory because ToBasicEmployeeVMFromEmployee() is likely a C# method - // that cannot be translated to SQL by Entity Framework. - - List noteVMS = notes - .Select(cn => cn.ToContactNoteVMFromContactNote()) - .ToList(); - - var response = new - { - CurrentPage = pageNumber, - PageSize = pageSize, // Include pageSize in response for client clarity - TotalPages = totalPages, - TotalRecords = totalRecords, // Add total records for client - Data = noteVMS - }; - - _logger.LogInfo("GetListOFAllNotes: Successfully retrieved notes and mapped to ViewModel for TenantId: {TenantId}.", tenantId); - return ApiResponse.SuccessResponse(response, $"{noteVMS.Count} notes fetched successfully.", 200); + _logger.LogInfo("{count} contact-notes record from contact {ContactId} fetched by Employee {EmployeeId}", noteVMs.Count, id, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(noteVMs, $"{noteVMs.Count} contact-notes record fetched successfully", 200); } - public async Task> GetNoteListByContactId(Guid id, bool active) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); - if (contact != null) - { - List notes = new List(); - if (active) - { - notes = await _context.ContactNotes - .Include(n => n.Createdby) - .Include(n => n.UpdatedBy) - .Where(n => n.ContactId == contact.Id && n.IsActive && n.TenantId == tenantId) - .ToListAsync(); - } - else - { - notes = await _context.ContactNotes - .Include(n => n.Createdby) - .Include(n => n.UpdatedBy) - .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId) - .ToListAsync(); - } - var noteIds = notes.Select(n => n.Id).ToList(); - List? updateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).ToListAsync(); - //List? noteVMs = new List(); - List? noteVMs = notes.Select(n => n.ToContactNoteVMFromContactNote()).ToList(); - _logger.LogInfo("{count} contact-notes record from contact {ContactId} fetched by Employee {EmployeeId}", noteVMs.Count, id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(noteVMs, $"{noteVMs.Count} contact-notes record fetched successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to fetch a list notes from contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - public async Task> CreateContactNote(CreateContactNoteDto noteDto) + public async Task> CreateContactNote(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee) { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (noteDto != null) { Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.IsActive && c.TenantId == tenantId); if (contact != null) { - ContactNote note = noteDto.ToContactNoteFromCreateContactNoteDto(tenantId, LoggedInEmployee.Id); + ContactNote note = noteDto.ToContactNoteFromCreateContactNoteDto(tenantId, loggedInEmployee.Id); _context.ContactNotes.Add(note); await _context.SaveChangesAsync(); ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - _logger.LogInfo("Employee {EmployeeId} Added note at contact {ContactId}", LoggedInEmployee.Id, contact.Id); + _logger.LogInfo("Employee {EmployeeId} Added note at contact {ContactId}", loggedInEmployee.Id, contact.Id); return ApiResponse.SuccessResponse(noteVM, "Note added successfully", 200); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to add a note to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.ContactId); + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to add a note to contact with ID {ContactId}, but the contact was not found in the database.", loggedInEmployee.Id, noteDto.ContactId); return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); } public async Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto) @@ -1438,7 +1466,11 @@ namespace Marco.Pms.Services.Service Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.TenantId == tenantId); if (contact != null) { - ContactNote? contactNote = await _context.ContactNotes.Include(cn => cn.Createdby).Include(cn => cn.Contact).FirstOrDefaultAsync(n => n.Id == noteDto.Id && n.ContactId == contact.Id && n.IsActive); + ContactNote? contactNote = await _context.ContactNotes + .Include(cn => cn.Createdby) + .ThenInclude(e => e!.JobRole) + .Include(cn => cn.Contact) + .FirstOrDefaultAsync(n => n.Id == noteDto.Id && n.ContactId == contact.Id && n.IsActive); if (contactNote != null) { contactNote.Note = noteDto.Note; @@ -1519,6 +1551,7 @@ namespace Marco.Pms.Services.Service // Admin gets all buckets for the tenant bucketList = await _context.Buckets .Include(b => b.CreatedBy) + .ThenInclude(e => e!.JobRole) .Where(b => b.TenantId == tenantId) .ToListAsync(); @@ -1536,6 +1569,7 @@ namespace Marco.Pms.Services.Service bucketList = await _context.Buckets .Include(b => b.CreatedBy) + .ThenInclude(e => e!.JobRole) .Where(b => bucketIds.Contains(b.Id) || b.CreatedByID == loggedInEmployee.Id) .ToListAsync(); @@ -1779,7 +1813,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("An unexpected error occurred. Please try again later.", "Internal server error", 500); } } - public async Task> AssignBucketAsync(Guid bucketId, List assignBuckets, Guid tenantId, Employee loggedInEmployee) { // Validate input payload @@ -1794,8 +1827,10 @@ namespace Marco.Pms.Services.Service // Load the bucket with related CreatedBy and validate tenant - var bucket = await _context.Buckets.Include(b => b.CreatedBy) - .FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); + var bucket = await _context.Buckets + .Include(b => b.CreatedBy) + .ThenInclude(e => e!.JobRole) + .FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); if (bucket == null) { @@ -1931,7 +1966,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(bucketVm, "Bucket details updated successfully", 200); } - public async Task> DeleteBucketAsync(Guid id, Guid tenantId, Employee loggedInEmployee) { try diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index 5884e42..bd8468d 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -16,9 +16,12 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> DeleteContactAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); - Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber); - Task> GetNoteListByContactId(Guid id, bool active); - Task> CreateContactNote(CreateContactNoteDto noteDto); + + + + Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); + Task> GetNoteListByContactId(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); + Task> CreateContactNote(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto); Task> DeleteContactNote(Guid id, bool active); -- 2.43.0 From 6688b761453a00606fbada96776b8d1fd9d19a4b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 11 Aug 2025 14:29:07 +0530 Subject: [PATCH 09/63] Added updatelogs in update contact API --- .../Utility/UtilityMongoDBHelper.cs | 26 ++- .../Controllers/DirectoryController.cs | 7 + .../MappingProfiles/MappingProfile.cs | 2 + .../Service/DirectoryService.cs | 221 +++++++++++++++--- .../ServiceInterfaces/IDirectoryService.cs | 1 + 5 files changed, 221 insertions(+), 36 deletions(-) diff --git a/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs b/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs index 7159850..c6e93f3 100644 --- a/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs +++ b/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs @@ -25,8 +25,30 @@ namespace Marco.Pms.Helpers.Utility #region =================================================================== Update Log Helper Functions =================================================================== public async Task PushToUpdateLogsAsync(UpdateLogsObject oldObject, string collectionName) { - var collection = _mongoDatabase.GetCollection(collectionName); - await collection.InsertOneAsync(oldObject); + try + { + var collection = _mongoDatabase.GetCollection(collectionName); + await collection.InsertOneAsync(oldObject); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving object of update logs in collection: {Collection}", collectionName); + } + } + public async Task PushListToUpdateLogsAsync(List oldObjects, string collectionName) + { + try + { + var collection = _mongoDatabase.GetCollection(collectionName); + if (oldObjects.Any()) + { + await collection.InsertManyAsync(oldObjects); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving list of update logs in collection: {Collection}", collectionName); + } } public async Task> GetFromUpdateLogsByEntityIdAsync(Guid entityId, string collectionName) diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index c457065..bdc8598 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -80,6 +80,13 @@ namespace Marco.Pms.Services.Controllers var response = await _directoryService.GetOrganizationListAsync(tenantId, loggedInEmployee); return Ok(response); } + [HttpGet("designations")] + public async Task GetDesignationList() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetDesignationListAsync(tenantId, loggedInEmployee); + return Ok(response); + } #endregion diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 84c32a7..6eec11b 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -251,9 +251,11 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 0a119e3..3aa847b 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -1,10 +1,12 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Directory; using Marco.Pms.Model.Dtos.Directory; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Mapper; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.Master; @@ -26,7 +28,13 @@ namespace Marco.Pms.Services.Service private readonly ILoggingService _logger; private readonly UserHelper _userHelper; private readonly IMapper _mapper; - private readonly PermissionServices _permissionServices; + private readonly UtilityMongoDBHelper _updateLogsHelper; + + + private static readonly string contactCollection = "ContactModificationLog"; + private static readonly string contactPhoneCollection = "ContactPhoneModificationLog"; + private static readonly string contactEmailCollection = "ContactEmailModificationLog"; + public DirectoryService( IDbContextFactory dbContextFactory, @@ -34,8 +42,7 @@ namespace Marco.Pms.Services.Service ILoggingService logger, IServiceScopeFactory serviceScopeFactory, UserHelper userHelper, - IMapper mapper, - PermissionServices permissionServices) + IMapper mapper) { _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); _context = context ?? throw new ArgumentNullException(nameof(context)); @@ -43,7 +50,8 @@ namespace Marco.Pms.Services.Service _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); - _permissionServices = permissionServices ?? throw new ArgumentNullException(nameof(permissionServices)); + using var scope = serviceScopeFactory.CreateScope(); + _updateLogsHelper = scope.ServiceProvider.GetRequiredService(); } #region =================================================================== Contact APIs =================================================================== @@ -747,6 +755,66 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); } } + public async Task> GetDesignationListAsync(Guid tenantId, Employee loggedInEmployee) + { + // --- Parameter Validation --- + // Fail fast if essential parameters are not provided. + ArgumentNullException.ThrowIfNull(loggedInEmployee); + + var employeeId = loggedInEmployee.Id; + + try + { + // --- 1. Permission Check --- + // Verify that the employee has at least one of the required permissions to view this data. + // This prevents unauthorized data access early in the process. + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(employeeId); + + if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) + { + // Log the specific denial reason for security auditing. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get designations list for tenant {TenantId} due to lack of permissions.", employeeId, tenantId); + // Return a strongly-typed error response. + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to perform this action.", 403); + } + + // --- 2. Database Query --- + // Build and execute the database query efficiently. + _logger.LogDebug("Fetching designations list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, employeeId); + + var designationsList = await _context.Contacts + // Filter contacts by the specified tenant to ensure data isolation and Filter out contacts that do not have an designations name to ensure data quality. + .Where(c => c.TenantId == tenantId && !string.IsNullOrEmpty(c.Designation)) + + // Project only the 'Designation' column. This is a major performance optimization + // as it avoids loading entire 'Contact' entities into memory. + .Select(c => c.Designation) + // Let the database perform the distinct operation, which is highly efficient. + .Distinct() + // Execute the query asynchronously and materialize the results into a list. + .ToListAsync(); + + // --- 3. Success Response --- + // Log the successful operation with key details. + _logger.LogInfo("Successfully fetched {DesignationsCount} distinct designations for Tenant {TenantId} for employee {EmployeeId}", designationsList.Count, tenantId, employeeId); + + // Return a strongly-typed success response with the data and a descriptive message. + return ApiResponse.SuccessResponse( + designationsList, + $"{designationsList.Count} unique designation(s) found.", + 200 + ); + } + catch (Exception ex) + { + // --- 4. Exception Handling --- + // Log the full exception details for effective debugging, including context. + _logger.LogError(ex, "An unexpected error occurred while fetching designation list for Tenant {TenantId} by Employee {EmployeeId}", tenantId, employeeId); + + // Return a generic, strongly-typed error response to the client to avoid leaking implementation details. + return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); + } + } #endregion @@ -968,6 +1036,19 @@ namespace Marco.Pms.Services.Service var allTags = await context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); var tagNameLookup = allTags.ToDictionary(t => t.Name.ToLowerInvariant(), t => t); + var contactObject = _updateLogsHelper.EntityToBsonDocument(contact); + + var contactUpdateLog = new UpdateLogsObject + { + EntityId = contact.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = contactObject, + UpdatedAt = DateTime.UtcNow + }; + + List phoneUpdateLogs = new List(); + List emailUpdateLogs = new List(); + // ---------------------- Update Phones ----------------------- if (updateContact.ContactPhones != null) { @@ -975,11 +1056,26 @@ namespace Marco.Pms.Services.Service foreach (var phoneDto in updateContact.ContactPhones) { - var phoneEntity = phoneDto.ToContactPhoneFromUpdateContactPhoneDto(tenantId, contact.Id); - if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && phoneIds.Contains(phoneEntity.Id)) + var phoneEntity = _mapper.Map(phoneDto); + phoneEntity.TenantId = tenantId; + phoneEntity.ContactId = contact.Id; + var existingPhone = phones.FirstOrDefault(p => p.Id == phoneEntity.Id); + if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && existingPhone != null) + { + var phoneObject = _updateLogsHelper.EntityToBsonDocument(existingPhone); + phoneUpdateLogs.Add(new UpdateLogsObject + { + EntityId = existingPhone.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = phoneObject, + UpdatedAt = DateTime.UtcNow + }); context.ContactsPhones.Update(phoneEntity); + } else + { context.ContactsPhones.Add(phoneEntity); + } } // Remove phones not updated in payload @@ -987,6 +1083,14 @@ namespace Marco.Pms.Services.Service { if (!updatedPhoneIds.Contains(phone.Id)) { + var phoneObject = _updateLogsHelper.EntityToBsonDocument(phone); + phoneUpdateLogs.Add(new UpdateLogsObject + { + EntityId = phone.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = phoneObject, + UpdatedAt = DateTime.UtcNow + }); context.ContactsPhones.Remove(phone); } } @@ -1003,11 +1107,29 @@ namespace Marco.Pms.Services.Service foreach (var emailDto in updateContact.ContactEmails) { - var emailEntity = emailDto.ToContactEmailFromUpdateContactEmailDto(tenantId, contact.Id); - if (emailDto.Id != null && emailDto.Id != Guid.Empty && emailIds.Contains(emailEntity.Id)) + var emailEntity = _mapper.Map(emailDto); + emailEntity.TenantId = tenantId; + emailEntity.ContactId = contact.Id; + + var existingEmail = emails.FirstOrDefault(e => e.Id == emailEntity.Id); + + if (emailDto.Id != null && emailDto.Id != Guid.Empty && existingEmail != null) + { + var emailObject = _updateLogsHelper.EntityToBsonDocument(existingEmail); + emailUpdateLogs.Add(new UpdateLogsObject + { + EntityId = existingEmail.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = emailObject, + UpdatedAt = DateTime.UtcNow + }); + context.ContactsEmails.Update(emailEntity); + } else + { context.ContactsEmails.Add(emailEntity); + } } // Remove emails not updated in payload @@ -1015,6 +1137,14 @@ namespace Marco.Pms.Services.Service { if (!updatedEmailIds.Contains(email.Id)) { + var emailObject = _updateLogsHelper.EntityToBsonDocument(email); + phoneUpdateLogs.Add(new UpdateLogsObject + { + EntityId = email.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = emailObject, + UpdatedAt = DateTime.UtcNow + }); context.ContactsEmails.Remove(email); } } @@ -1047,6 +1177,7 @@ namespace Marco.Pms.Services.Service { if (!incomingBucketIds.Contains(contactBucket.BucketId)) { + context.ContactBucketMappings.Remove(contactBucket); } } @@ -1163,34 +1294,56 @@ namespace Marco.Pms.Services.Service } // Reload updated contact and related data for response, using a fresh context - using var responseContext = _dbContextFactory.CreateDbContext(); - - var reloadedContact = await responseContext.Contacts - .Include(c => c.ContactCategory) - .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); - - var responsePhones = await responseContext.ContactsPhones.AsNoTracking().Where(p => p.ContactId == reloadedContact.Id).ToListAsync(); - var responseEmails = await responseContext.ContactsEmails.AsNoTracking().Where(e => e.ContactId == reloadedContact.Id).ToListAsync(); - var responseContactTags = await responseContext.ContactTagMappings.AsNoTracking().Where(t => t.ContactId == reloadedContact.Id).ToListAsync(); - var responseContactBuckets = await responseContext.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == reloadedContact.Id).ToListAsync(); - var responseContactProjects = await responseContext.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == reloadedContact.Id).ToListAsync(); - - var tagIdsForResponse = responseContactTags.Select(t => t.ContactTagId).Distinct().ToList(); - var tagsForResponse = await responseContext.ContactTagMasters.Where(t => tagIdsForResponse.Contains(t.Id)).ToListAsync(); - - // Map entities to view models - var contactVM = reloadedContact.ToContactVMFromContact(); - - contactVM.ContactPhones = responsePhones.Select(p => p.ToContactPhoneVMFromContactPhone()).ToList(); - contactVM.ContactEmails = responseEmails.Select(e => e.ToContactEmailVMFromContactEmail()).ToList(); - contactVM.Tags = responseContactTags.Select(ctm => + var responseTask = Task.Run(async () => { - var tag = tagsForResponse.Find(t => t.Id == ctm.ContactTagId); - return tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - }).ToList(); + using var responseContext = _dbContextFactory.CreateDbContext(); - contactVM.BucketIds = responseContactBuckets.Select(cb => cb.BucketId).ToList(); - contactVM.ProjectIds = responseContactProjects.Select(cp => cp.ProjectId).ToList(); + var reloadedContact = await responseContext.Contacts + .Include(c => c.ContactCategory) + .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); + + var responsePhones = await responseContext.ContactsPhones.AsNoTracking().Where(p => p.ContactId == reloadedContact.Id).ToListAsync(); + var responseEmails = await responseContext.ContactsEmails.AsNoTracking().Where(e => e.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactTags = await responseContext.ContactTagMappings.AsNoTracking().Where(t => t.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactBuckets = await responseContext.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == reloadedContact.Id).ToListAsync(); + var responseContactProjects = await responseContext.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == reloadedContact.Id).ToListAsync(); + + var tagIdsForResponse = responseContactTags.Select(t => t.ContactTagId).Distinct().ToList(); + var tagsForResponse = await responseContext.ContactTagMasters.Where(t => tagIdsForResponse.Contains(t.Id)).ToListAsync(); + + // Map entities to view models + var response = reloadedContact.ToContactVMFromContact(); + + response.ContactPhones = responsePhones.Select(p => p.ToContactPhoneVMFromContactPhone()).ToList(); + response.ContactEmails = responseEmails.Select(e => e.ToContactEmailVMFromContactEmail()).ToList(); + response.Tags = responseContactTags.Select(ctm => + { + var tag = tagsForResponse.Find(t => t.Id == ctm.ContactTagId); + return tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); + }).ToList(); + + response.BucketIds = responseContactBuckets.Select(cb => cb.BucketId).ToList(); + response.ProjectIds = responseContactProjects.Select(cp => cp.ProjectId).ToList(); + return response; + }); + + var contactUpdateLogTask = Task.Run(async () => + { + await _updateLogsHelper.PushToUpdateLogsAsync(contactUpdateLog, contactCollection); + }); + var phoneUpdateLogTask = Task.Run(async () => + { + await _updateLogsHelper.PushListToUpdateLogsAsync(phoneUpdateLogs, contactPhoneCollection); + }); + var emailUpdateLogTask = Task.Run(async () => + { + await _updateLogsHelper.PushListToUpdateLogsAsync(emailUpdateLogs, contactEmailCollection); + }); + + + await Task.WhenAll(responseTask, contactUpdateLogTask, phoneUpdateLogTask, emailUpdateLogTask); + + var contactVM = responseTask.Result; _logger.LogInfo("Contact {ContactId} successfully updated by employee {EmployeeId}.", contact.Id, loggedInEmployee.Id); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index bd8468d..07369a8 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -11,6 +11,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetContactsListByBucketIdAsync(Guid bucketId, Guid tenantId, Employee loggedInEmployee); Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee); Task> GetOrganizationListAsync(Guid tenantId, Employee loggedInEmployee); + Task> GetDesignationListAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateContactAsync(CreateContactDto createContact, Guid tenantId, Employee loggedInEmployee); Task> UpdateContactAsync(Guid id, UpdateContactDto updateContact, Guid tenantId, Employee loggedInEmployee); Task> DeleteContactAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); -- 2.43.0 From e7302ecd6c50a9a5ba92a839e7c270d6edef9ea2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 11 Aug 2025 14:40:49 +0530 Subject: [PATCH 10/63] Added updatelogs in delete contact API --- .../MappingProfiles/MappingProfile.cs | 1 + Marco.Pms.Services/Service/DirectoryService.cs | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 6eec11b..a4d0c55 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -246,6 +246,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); + CreateMap(); CreateMap(); diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 3aa847b..c697fd2 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -34,6 +34,8 @@ namespace Marco.Pms.Services.Service private static readonly string contactCollection = "ContactModificationLog"; private static readonly string contactPhoneCollection = "ContactPhoneModificationLog"; private static readonly string contactEmailCollection = "ContactEmailModificationLog"; + private static readonly string bucketCollection = "BucketModificationLog"; + private static readonly string contactNoteCollection = "ContactNoteModificationLog"; public DirectoryService( @@ -987,7 +989,10 @@ namespace Marco.Pms.Services.Service var accessibleBucketIds = contactBuckets.Select(cb => cb.BucketId).Distinct().ToHashSet(); // Update the main contact object from DTO - var updatedContact = updateContact.ToContactFromUpdateContactDto(tenantId, contact); + var updatedContact = _mapper.Map(updateContact); + updatedContact.TenantId = tenantId; + updatedContact.CreatedAt = contact.CreatedAt; + updatedContact.CreatedById = contact.CreatedById; updatedContact.UpdatedById = loggedInEmployee.Id; updatedContact.UpdatedAt = DateTime.UtcNow; @@ -1372,6 +1377,8 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); } + var contactObject = _updateLogsHelper.EntityToBsonDocument(contact); + // Update the contact's active status (soft delete or activate) contact.IsActive = active; @@ -1382,10 +1389,17 @@ namespace Marco.Pms.Services.Service UpdatedById = loggedInEmployee.Id, UpdateAt = DateTime.UtcNow }); - // Save changes to the database await _context.SaveChangesAsync(); + await _updateLogsHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = contact.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = contactObject, + UpdatedAt = DateTime.UtcNow + }, contactCollection); + _logger.LogInfo("Contact ID {ContactId} has been {(DeletedOrActivated)} by Employee ID {EmployeeId}.", id, active ? "activated" : "deleted", loggedInEmployee.Id); return ApiResponse.SuccessResponse(new { }, active ? "Contact is activated successfully" : "Contact is deleted successfully", 200); -- 2.43.0 From 4a78bb8074128300aefad0e259c2cc07b416eb19 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 11 Aug 2025 16:37:41 +0530 Subject: [PATCH 11/63] Added updatelogs in update and delete bucket API --- .../Service/DirectoryService.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index c697fd2..bcf19cc 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -1945,6 +1945,8 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 403); } + var bucketObject = _updateLogsHelper.EntityToBsonDocument(bucket); + // Update bucket properties safely bucket.Name = bucketDto.Name ?? string.Empty; bucket.Description = bucketDto.Description ?? string.Empty; @@ -1970,6 +1972,14 @@ namespace Marco.Pms.Services.Service bucketVM.EmployeeIds = employeeBuckets.Where(eb => eb.BucketId == bucket.Id).Select(eb => eb.EmployeeId).ToList(); bucketVM.NumberOfContacts = contactBuckets.Count; + await _updateLogsHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = bucket.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = bucketObject, + UpdatedAt = DateTime.UtcNow + }, bucketCollection); + _logger.LogInfo("Employee ID {LoggedInEmployeeId} successfully updated bucket ID {BucketId}.", loggedInEmployee.Id, bucket.Id); return ApiResponse.SuccessResponse(bucketVM, "Bucket updated successfully", 200); @@ -2216,6 +2226,8 @@ namespace Marco.Pms.Services.Service "Permission denied", 403); } + var bucketObject = _updateLogsHelper.EntityToBsonDocument(bucket); + // Remove related employee bucket mappings _context.EmployeeBucketMappings.RemoveRange(employeeBucketMappings); // Remove the bucket itself @@ -2233,6 +2245,14 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Employee {EmployeeId} deleted bucket {BucketId} along with related employee bucket mappings.", loggedInEmployee.Id, bucket.Id); + await _updateLogsHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = bucket.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = bucketObject, + UpdatedAt = DateTime.UtcNow + }, bucketCollection); + return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); } catch (Exception ex) -- 2.43.0 From 4af68918217db7cd82c601b14510543707225d68 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 20 Aug 2025 10:55:16 +0530 Subject: [PATCH 12/63] Optimized the Directory notes API --- .../Controllers/DirectoryController.cs | 60 +-- .../MappingProfiles/MappingProfile.cs | 2 + .../Service/DirectoryService.cs | 432 +++++++++++++----- .../ServiceInterfaces/IDirectoryService.cs | 8 +- 4 files changed, 355 insertions(+), 147 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index bdc8598..5731065 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -144,63 +144,47 @@ namespace Marco.Pms.Services.Controllers public async Task CreateContactNote([FromBody] CreateContactNoteDto noteDto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _directoryService.CreateContactNote(noteDto, tenantId, loggedInEmployee); ; - if (response.StatusCode == 200) + var response = await _directoryService.CreateContactNoteAsync(noteDto, tenantId, loggedInEmployee); ; + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Notes", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpGet("notes/{ContactId}")] public async Task GetNoteListByContactId(Guid contactId, [FromQuery] bool active = true) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _directoryService.GetNoteListByContactId(contactId, active, tenantId, loggedInEmployee); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); - } + var response = await _directoryService.GetNoteListByContactIdAsync(contactId, active, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); } [HttpPut("note/{id}")] public async Task UpdateContactNote(Guid id, [FromBody] UpdateContactNoteDto noteDto) { - var response = await _directoryService.UpdateContactNote(id, noteDto); - if (response.StatusCode == 200) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.UpdateContactNoteAsync(id, noteDto, tenantId, loggedInEmployee); + if (response.Success) { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Notes", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } + return StatusCode(response.StatusCode, response); } [HttpDelete("note/{id}")] - public async Task DeleteContactNote(Guid id, [FromQuery] bool? active) + public async Task DeleteContactNote(Guid id, [FromQuery] bool active = false) { - var response = await _directoryService.DeleteContactNote(id, active ?? false); - return Ok(response); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.DeleteContactNoteAsync(id, active, tenantId, loggedInEmployee); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Directory_Notes", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } + return StatusCode(response.StatusCode, response); } #endregion diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index a4d0c55..21be173 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -274,6 +274,8 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.OrganizationName, opt => opt.MapFrom(src => src.Contact != null ? src.Contact.Organization : string.Empty) ); + CreateMap(); + CreateMap(); #endregion } diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index bcf19cc..83b4079 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -8,6 +8,7 @@ using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Mapper; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; @@ -1549,151 +1550,372 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while fetching notes. Please try again later.", 500); } } - public async Task> GetNoteListByContactId(Guid id, bool active, Guid tenantId, Employee loggedInEmployee) - { - var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + /// + /// Fetches all notes associated with a given contact, subject to permission checks and contact-bucket mappings. + /// + /// The contact ID. + /// The tenant ID of the current user. + /// Whether to filter for active notes only. + /// The currently logged in employee object. + /// Returns a list of contact notes wrapped in ApiResponse. + public async Task> GetNoteListByContactIdAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee) + { + // Step 1: Permission Validation + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); if (!hasAdminPermission && !hasManagerPermission && !hasUserPermission) { - _logger.LogWarning("Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId} Do not have permission", loggedInEmployee.Id, tenantId); - return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); + _logger.LogWarning( + "Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId}. No permissions granted.", + loggedInEmployee.Id, tenantId); + + return ApiResponse.ErrorResponse( + "Access Denied", + "You don't have access to view notes.", + StatusCodes.Status403Forbidden); } - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + // Step 2: Validate Contact Exists + Contact? contact = await _context.Contacts + .AsNoTracking() // optimization: no tracking needed + .FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); + if (contact == null) { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to fetch a list notes from contact with ID {ContactId}, but the contact was not found in the database.", loggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + _logger.LogWarning( + "Employee {EmployeeId} attempted to fetch notes for Contact {ContactId}, but the contact was not found. TenantId: {TenantId}", + loggedInEmployee.Id, id, tenantId); + + return ApiResponse.ErrorResponse( + "Contact not found", + "Contact not found", + StatusCodes.Status404NotFound); } - if (!hasAdminPermission && (hasManagerPermission || hasUserPermission)) + // Step 3: Bucket-level Security Checks (Non-admin users) + if (!hasAdminPermission) { - var bucketIds = await _context.EmployeeBucketMappings.Where(em => em.EmployeeId == loggedInEmployee.Id).Select(em => em.BucketId).ToListAsync(); - var hasContactAccess = await _context.ContactBucketMappings.AnyAsync(cb => bucketIds.Contains(cb.BucketId) && cb.ContactId == contact.Id); + var employeeBucketIds = await _context.EmployeeBucketMappings + .AsNoTracking() + .Where(em => em.EmployeeId == loggedInEmployee.Id) + .Select(em => em.BucketId) + .ToListAsync(); + + bool hasContactAccess = await _context.ContactBucketMappings + .AsNoTracking() + .AnyAsync(cb => employeeBucketIds.Contains(cb.BucketId) && cb.ContactId == contact.Id); + if (!hasContactAccess) { - _logger.LogWarning("Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId} Do not have access of bucket", loggedInEmployee.Id, tenantId); - return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); + _logger.LogWarning( + "Access Denied. EmployeeId: {EmployeeId}, TenantId: {TenantId}. No bucket access for ContactId {ContactId}", + loggedInEmployee.Id, tenantId, contact.Id); + + return ApiResponse.ErrorResponse( + "Access Denied", + "You don't have access to view notes.", + StatusCodes.Status403Forbidden); } } + // Step 4: Fetch Notes var notesQuery = _context.ContactNotes - .Include(n => n.Createdby) - .ThenInclude(e => e!.JobRole) - .Include(n => n.UpdatedBy) - .ThenInclude(e => e!.JobRole) - .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId); + .Include(n => n.Createdby) // Eager load creator + .ThenInclude(e => e!.JobRole) + .Include(n => n.UpdatedBy) // Eager load updater + .ThenInclude(e => e!.JobRole) + .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId); if (active) - { notesQuery = notesQuery.Where(n => n.IsActive); - } - List notes = await notesQuery.ToListAsync(); - - var noteIds = notes.Select(n => n.Id).ToList(); - List? updateLogs = await _context.DirectoryUpdateLogs - .Include(l => l.Employee) - .ThenInclude(e => e!.JobRole) - .Where(l => noteIds.Contains(l.RefereanceId)) + List notes = await notesQuery + .AsNoTracking() // reduce EF overhead .ToListAsync(); + // Step 5: Fetch Update Logs in one DB call + var noteIds = notes.Select(n => n.Id).ToList(); + List updateLogs = new(); + + if (noteIds.Count > 0) // only fetch logs if needed + { + updateLogs = await _context.DirectoryUpdateLogs + .Include(l => l.Employee) + .ThenInclude(e => e!.JobRole) + .AsNoTracking() + .Where(l => noteIds.Contains(l.RefereanceId)) + .ToListAsync(); + } + + // Step 6: Map Entities to ViewModels List noteVMs = _mapper.Map>(notes); - _logger.LogInfo("{count} contact-notes record from contact {ContactId} fetched by Employee {EmployeeId}", noteVMs.Count, id, loggedInEmployee.Id); - return ApiResponse.SuccessResponse(noteVMs, $"{noteVMs.Count} contact-notes record fetched successfully", 200); + // Step 7: Final Log + Response + _logger.LogInfo( + "Employee {EmployeeId} successfully fetched {Count} notes for Contact {ContactId} in Tenant {TenantId}", + loggedInEmployee.Id, noteVMs.Count, id, tenantId); + + return ApiResponse.SuccessResponse( + noteVMs, + $"{noteVMs.Count} contact-notes record(s) fetched successfully", + StatusCodes.Status200OK); } - public async Task> CreateContactNote(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee) + /// + /// Creates a note for a given contact under the specified tenant. + /// Ensures that the contact exists and belongs to the tenant before adding the note. + /// + /// The DTO containing the note details. + /// The tenant identifier to which the contact belongs. + /// The logged-in employee attempting the action. + /// ApiResponse containing the created note details or error information. + public async Task> CreateContactNoteAsync(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee) { - if (noteDto != null) + // Validate request payload + if (noteDto == null) { - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.IsActive && c.TenantId == tenantId); - if (contact != null) - { - ContactNote note = noteDto.ToContactNoteFromCreateContactNoteDto(tenantId, loggedInEmployee.Id); - _context.ContactNotes.Add(note); - await _context.SaveChangesAsync(); - ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - _logger.LogInfo("Employee {EmployeeId} Added note at contact {ContactId}", loggedInEmployee.Id, contact.Id); - return ApiResponse.SuccessResponse(noteVM, "Note added successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to add a note to contact with ID {ContactId}, but the contact was not found in the database.", loggedInEmployee.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + _logger.LogWarning( + "Employee {EmployeeId} attempted to create a note with an empty payload.", + loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Empty payload.", "Request body cannot be null.", 400); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (noteDto != null && id == noteDto.Id) + + try { - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.TenantId == tenantId); - if (contact != null) + // Check if the contact exists and is active for this tenant + Contact? contact = await _context.Contacts + .AsNoTracking() // optimization for read-only query + .FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.IsActive && c.TenantId == tenantId); + + if (contact == null) { - ContactNote? contactNote = await _context.ContactNotes - .Include(cn => cn.Createdby) - .ThenInclude(e => e!.JobRole) - .Include(cn => cn.Contact) - .FirstOrDefaultAsync(n => n.Id == noteDto.Id && n.ContactId == contact.Id && n.IsActive); - if (contactNote != null) - { - contactNote.Note = noteDto.Note; - contactNote.UpdatedById = LoggedInEmployee.Id; - contactNote.UpdatedAt = DateTime.UtcNow; + _logger.LogWarning( + "Employee {EmployeeId} attempted to add a note to Contact {ContactId}, but it was not found for tenant {TenantId}.", + loggedInEmployee.Id, noteDto.ContactId, tenantId); - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - ContactNoteVM noteVM = contactNote.ToContactNoteVMFromContactNote(); - noteVM.UpdatedAt = DateTime.UtcNow; - noteVM.UpdatedBy = LoggedInEmployee.ToBasicEmployeeVMFromEmployee(); - - _logger.LogInfo("Employee {EmployeeId} updated note {NoteId} at contact {ContactId}", LoggedInEmployee.Id, noteVM.Id, contact.Id); - return ApiResponse.SuccessResponse(noteVM, "Note updated successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the Note was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Note not found", "Note not found", 404); + return ApiResponse.ErrorResponse("Contact not found.", "The specified contact does not exist.", 404); } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> DeleteContactNote(Guid id, bool active) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - ContactNote? note = await _context.ContactNotes.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); - if (note != null) - { - note.IsActive = active; - note.UpdatedById = LoggedInEmployee.Id; - note.UpdatedAt = DateTime.UtcNow; + // Map DTO -> Entity using AutoMapper + ContactNote note = _mapper.Map(noteDto); + note.CreatedById = loggedInEmployee.Id; + note.TenantId = tenantId; - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); + // Save new note + await _context.ContactNotes.AddAsync(note); await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted note {NoteId}", LoggedInEmployee.Id, id); + + // Map Entity -> ViewModel + ContactNoteVM noteVM = _mapper.Map(note); + + _logger.LogInfo( + "Employee {EmployeeId} successfully added a note (NoteId: {NoteId}) to Contact {ContactId} for Tenant {TenantId}.", + loggedInEmployee.Id, note.Id, contact.Id, tenantId); + + return ApiResponse.SuccessResponse(noteVM, "Note added successfully.", 200); + } + catch (Exception ex) + { + // Log unexpected errors to troubleshoot + _logger.LogError( + ex, + "Unexpected error occurred while Employee {EmployeeId} attempted to add a note for Contact {ContactId} in Tenant {TenantId}.", + loggedInEmployee.Id, noteDto.ContactId, tenantId); + + return ApiResponse.ErrorResponse("An unexpected error occurred.", ex.Message, 500); + } + } + + /// + /// Updates an existing contact note and logs changes + /// both in relational DB (SQL) and update logs (possibly MongoDB). + /// + /// The note ID that needs to be updated. + /// DTO with updated note data. + /// Standardized ApiResponse with updated note or error details. + public async Task> UpdateContactNoteAsync(Guid id, UpdateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee) + { + // Validation: check null payload or mismatched ID + if (noteDto == null || id != noteDto.Id) + { + _logger.LogWarning("Employee {EmployeeId} sent invalid or null payload. RouteId: {RouteId}, PayloadId: {PayloadId}", + loggedInEmployee.Id, id, noteDto?.Id ?? Guid.Empty); + + return ApiResponse.ErrorResponse("Invalid or empty payload", "Invalid or empty payload", 400); } - _logger.LogWarning("Employee {EmployeeId} tries to delete contact note {NoteId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Note deleted successfully", 200); + // Check if the contact belongs to this tenant + Contact? contact = await _context.Contacts + .AsNoTracking() + .FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.TenantId == tenantId); + + if (contact == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to update note {NoteId} for Contact {ContactId}, but the contact was not found in Tenant {TenantId}.", + loggedInEmployee.Id, noteDto.Id, noteDto.ContactId, tenantId); + + return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); + } + + // Fetch the contact note to be updated + ContactNote? contactNote = await _context.ContactNotes + .Include(cn => cn.Createdby) + .ThenInclude(e => e!.JobRole) + .Include(cn => cn.Contact) + .FirstOrDefaultAsync(n => + n.Id == noteDto.Id && + n.ContactId == contact.Id && + n.IsActive); + + if (contactNote == null) + { + _logger.LogWarning("Employee {EmployeeId} attempted to update Note {NoteId} for Contact {ContactId}, but the note was not found or inactive.", + loggedInEmployee.Id, noteDto.Id, noteDto.ContactId); + + return ApiResponse.ErrorResponse("Note not found", "Note not found", 404); + } + + // Capture old state for change-log before updating + var oldObject = _updateLogsHelper.EntityToBsonDocument(contactNote); + + // Apply updates + contactNote.Note = noteDto.Note; + contactNote.UpdatedById = loggedInEmployee.Id; + contactNote.UpdatedAt = DateTime.UtcNow; + + // Save change log into relational logs + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + // Wrap in try-catch for robustness + try + { + await _context.SaveChangesAsync(); + + // Map to ViewModel for output + ContactNoteVM noteVM = _mapper.Map(contactNote); + noteVM.UpdatedAt = contactNote.UpdatedAt; + noteVM.UpdatedBy = _mapper.Map(loggedInEmployee); + + // Push audit log asynchronously (Mongo / NoSQL Logs) + await _updateLogsHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = contactNote.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = oldObject, + UpdatedAt = DateTime.UtcNow + }, contactNoteCollection); + + // Success log + _logger.LogInfo("Employee {EmployeeId} successfully updated Note {NoteId} for Contact {ContactId} at {UpdatedAt}", + loggedInEmployee.Id, noteVM.Id, contact.Id, noteVM.UpdatedAt); + + return ApiResponse.SuccessResponse(noteVM, "Note updated successfully", 200); + } + catch (DbUpdateException ex) + { + _logger.LogError(ex, "Database Exception occurred while updating Note {NoteId} for Contact {ContactId} by Employee {EmployeeId}", + noteDto.Id, noteDto.ContactId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Failed to update note", "An unexpected error occurred while saving note.", 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occurred while updating Note {NoteId} for Contact {ContactId} by Employee {EmployeeId}", + noteDto.Id, noteDto.ContactId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Failed to update note", "An unexpected error occurred while saving note.", 500); + } } + /// + /// Soft deletes (or restores) a contact note by updating its active status. + /// Also pushes an update log entry in SQL and Mongo (audit trail). + /// + /// ID of the contact note to delete/restore. + /// Flag to set note as active or inactive. + /// Tenant identifier of the logged-in user. + /// The employee performing this action. + /// ApiResponse with success or error details. + public async Task> DeleteContactNoteAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee) + { + // Lookup note within the tenant + ContactNote? note = await _context.ContactNotes + .FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); + + if (note == null) + { + // Log missing resource + _logger.LogWarning("Employee {EmployeeId} attempted to delete Note {NoteId}, but it was not found in Tenant {TenantId}", + loggedInEmployee.Id, id, tenantId); + + return ApiResponse.ErrorResponse("Note not found", "Note not found", 404); + } + + // Capture old state for audit logging + var oldObject = _updateLogsHelper.EntityToBsonDocument(note); + + // Update note metadata + var currentTime = DateTime.UtcNow; + note.IsActive = active; // soft delete (false) or restore (true) + note.UpdatedById = loggedInEmployee.Id; + note.UpdatedAt = currentTime; + + // Add relational update log entry + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = currentTime + }); + + try + { + // Save SQL changes + await _context.SaveChangesAsync(); + + // Push audit log (Mongo / NoSQL) + await _updateLogsHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = note.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = oldObject, + UpdatedAt = currentTime + }, contactNoteCollection); + + // Log success — distinguish delete vs restore + if (!active) + { + _logger.LogInfo("Employee {EmployeeId} soft deleted Note {NoteId} at {Timestamp}", + loggedInEmployee.Id, id, currentTime); + } + else + { + _logger.LogInfo("Employee {EmployeeId} restored Note {NoteId} at {Timestamp}", + loggedInEmployee.Id, id, currentTime); + } + + return ApiResponse.SuccessResponse(new { }, + active ? "Note restored successfully" : "Note deleted successfully", + 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error while updating Note {NoteId} (delete/restore) in Tenant {TenantId} by Employee {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Failed to delete note", + "An unexpected error occurred while deleting/restoring the note.", + 500); + } + } + + #endregion #region =================================================================== Bucket APIs =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index 07369a8..c7d7d45 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -21,10 +21,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); - Task> GetNoteListByContactId(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); - Task> CreateContactNote(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); - Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto); - Task> DeleteContactNote(Guid id, bool active); + Task> GetNoteListByContactIdAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); + Task> CreateContactNoteAsync(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); + Task> UpdateContactNoteAsync(Guid id, UpdateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); + Task> DeleteContactNoteAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); Task> GetBucketListAsync(Guid tenantId, Employee loggedInEmployee); -- 2.43.0 From 3dfdb2ab5d935899bd973b0bcaf9ab089e17f3b3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 11:22:31 +0530 Subject: [PATCH 13/63] Added the tables for document management --- .../Data/ApplicationDbContext.cs | 215 + ..._Added_Document_Manager_Tables.Designer.cs | 5484 +++++++++++++++++ ...828055003_Added_Document_Manager_Tables.cs | 488 ++ .../ApplicationDbContextModelSnapshot.cs | 683 ++ .../DocumentManager/AttachmentTagMapping.cs | 22 + .../AttachmentVersionMapping.cs | 22 + .../DocumentManager/DocumentAttachment.cs | 41 + .../DocumentAttachmentMapping.cs | 21 + .../DocumentManager/DocumentCategoryMaster.cs | 21 + .../DocumentManager/DocumentTagMaster.cs | 11 + .../DocumentManager/DocumentTypeMaster.cs | 26 + 11 files changed, 7034 insertions(+) create mode 100644 Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.cs create mode 100644 Marco.Pms.Model/DocumentManager/AttachmentTagMapping.cs create mode 100644 Marco.Pms.Model/DocumentManager/AttachmentVersionMapping.cs create mode 100644 Marco.Pms.Model/DocumentManager/DocumentAttachment.cs create mode 100644 Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs create mode 100644 Marco.Pms.Model/DocumentManager/DocumentCategoryMaster.cs create mode 100644 Marco.Pms.Model/DocumentManager/DocumentTagMaster.cs create mode 100644 Marco.Pms.Model/DocumentManager/DocumentTypeMaster.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 78e8bba..16fb7a0 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -108,6 +108,14 @@ namespace Marco.Pms.DataAccess.Data public DbSet StatusPermissionMapping { get; set; } public DbSet ExpensesStatusMapping { get; set; } + public DbSet EntityTypeMasters { get; set; } + public DbSet DocumentTypeMasters { get; set; } + public DbSet DocumentCategoryMasters { get; set; } + public DbSet DocumentTagMasters { get; set; } + public DbSet DocumentAttachments { get; set; } + public DbSet DocumentAttachmentMappings { get; set; } + public DbSet AttachmentVersionMappings { get; set; } + public DbSet AttachmentTagMappings { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -720,6 +728,205 @@ namespace Marco.Pms.DataAccess.Data } ); + modelBuilder.Entity().HasData( + new EntityTypeMaster + { + Id = Guid.Parse("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Entity", + Description = "Emtities related to project." + }, + new EntityTypeMaster + { + Id = Guid.Parse("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Entity", + Description = "Employee related entitie", + } + ); + + modelBuilder.Entity().HasData( + new DocumentCategoryMaster + { + Id = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + Name = "Project Documents", + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = Guid.Parse("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + CreatedAt = DateTime.UtcNow, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentCategoryMaster + { + Id = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + Name = "Employee Documents", + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = Guid.Parse("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + CreatedAt = DateTime.UtcNow, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); + + modelBuilder.Entity().HasData( + new DocumentTypeMaster + { + Id = Guid.Parse("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + AllowedContentType = "application/pdf", + MaxSizeAllowedInMB = 2, + IsValidationRequired = true, + IsMandatory = true, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("6344393b-9bb1-45f8-b620-9f6e279d012c"), + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + AllowedContentType = "application/pdf", + MaxSizeAllowedInMB = 2, + IsValidationRequired = true, + IsMandatory = true, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("2d1d7441-46a8-425e-9395-94d0956f8e91"), + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + AllowedContentType = "application/pdf", + MaxSizeAllowedInMB = 2, + IsValidationRequired = true, + IsMandatory = true, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("16c40b80-c207-4a0c-a4d3-381414afe35a"), + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + AllowedContentType = "application/pdf", + MaxSizeAllowedInMB = 2, + IsValidationRequired = true, + IsMandatory = true, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("f76d8215-d399-4f0e-b414-12e427f50be3"), + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + AllowedContentType = "application/pdf", + MaxSizeAllowedInMB = 2, + IsValidationRequired = true, + IsMandatory = true, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + + new DocumentTypeMaster + { + Id = Guid.Parse("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + Name = "Bill of Quantities (BOQ)", + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + MaxSizeAllowedInMB = 1, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + Name = "Work Order", + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + MaxSizeAllowedInMB = 1, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("07ca7182-9ac0-4407-b988-59901170cb86"), + Name = "Letter of Agreement", + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + MaxSizeAllowedInMB = 1, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("846e89a9-5735-45ec-a21d-c97f85a94ada"), + Name = "Health and Safety Document", + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + MaxSizeAllowedInMB = 1, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("7cc41c91-23cb-442b-badd-f932138d149f"), + Name = "Standard Operating Procedure (SOP)", + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + MaxSizeAllowedInMB = 1, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new DocumentTypeMaster + { + Id = Guid.Parse("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + Name = "Drawings", + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + MaxSizeAllowedInMB = 20, + IsValidationRequired = false, + IsMandatory = false, + CreatedAt = DateTime.UtcNow, + IsSystem = true, + IsActive = true, + DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); + modelBuilder.Entity().HasData( new SubscriptionStatus { @@ -777,6 +984,7 @@ namespace Marco.Pms.DataAccess.Data // Employee Module new Feature { Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), Description = "Manage Employee", Name = "Employee Management", ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), IsActive = true }, new Feature { Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), Description = "Attendance", Name = "Attendance Management", ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), IsActive = true }, + new Feature { Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), Description = "Manage Document", Name = "Document Management", ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), IsActive = true }, new Feature { Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), Description = "Global Masters", Name = "Masters", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true }, new Feature { Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), Description = "Managing all directory related rights", Name = "Directory Management", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true }, @@ -817,6 +1025,13 @@ namespace Marco.Pms.DataAccess.Data new FeaturePermission { Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), IsEnabled = true, Name = "View Masters", Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency" }, new FeaturePermission { Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), IsEnabled = true, Name = "Manage Masters", Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories" }, + //Document Management Feature + new FeaturePermission { Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "View Document", Description = "Grants a user the authority to view all documents related to employees and projects" }, + new FeaturePermission { Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Upload Document", Description = "Grants a user the authority to upload the document" }, + new FeaturePermission { Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Mofify Document", Description = "Grants a user the authority to modify document" }, + new FeaturePermission { Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Delete Document", Description = "Grants a user the authority to delete the document" }, + new FeaturePermission { Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Verify Document", Description = "Grants a user the authority to verify the document" }, + // Directory Management Feature new FeaturePermission { Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), IsEnabled = true, Name = "Directory Admin", Description = "Full control over all directories, including the ability to manage permissions for all directories in the system." }, new FeaturePermission { Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), IsEnabled = true, Name = "Directory Manager", Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories." }, diff --git a/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.Designer.cs new file mode 100644 index 0000000..afbe6b0 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.Designer.cs @@ -0,0 +1,5484 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250828055003_Added_Document_Manager_Tables")] + partial class Added_Document_Manager_Tables + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentAttachmentMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8150), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8157), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8204), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8209), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8212), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8216), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8219), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8222), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8226), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8229), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8232), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8235), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8238), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("Document"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.cs new file mode 100644 index 0000000..3774525 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828055003_Added_Document_Manager_Tables.cs @@ -0,0 +1,488 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_Document_Manager_Tables : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "DocumentTagMasters", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentTagMasters", x => x.Id); + table.ForeignKey( + name: "FK_DocumentTagMasters_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "EntityTypeMasters", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_EntityTypeMasters", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DocumentCategoryMasters", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + EntityTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentCategoryMasters", x => x.Id); + table.ForeignKey( + name: "FK_DocumentCategoryMasters_EntityTypeMasters_EntityTypeId", + column: x => x.EntityTypeId, + principalTable: "EntityTypeMasters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentCategoryMasters_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DocumentTypeMasters", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + RegexExpression = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + AllowedContentType = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + MaxSizeAllowedInMB = table.Column(type: "double", nullable: false), + IsValidationRequired = table.Column(type: "tinyint(1)", nullable: false), + IsMandatory = table.Column(type: "tinyint(1)", nullable: false), + IsSystem = table.Column(type: "tinyint(1)", nullable: false), + IsActive = table.Column(type: "tinyint(1)", nullable: false), + DocumentCategoryId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentTypeMasters", x => x.Id); + table.ForeignKey( + name: "FK_DocumentTypeMasters_DocumentCategoryMasters_DocumentCategory~", + column: x => x.DocumentCategoryId, + principalTable: "DocumentCategoryMasters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentTypeMasters_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DocumentAttachments", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DocumentId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + UploadedAt = table.Column(type: "datetime(6)", nullable: false), + UploadedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedAt = table.Column(type: "datetime(6)", nullable: false), + UpdatedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + VerifiedAt = table.Column(type: "datetime(6)", nullable: false), + IsVerified = table.Column(type: "tinyint(1)", nullable: true), + VerifiedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + EntityId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DocumentTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + IsActive = table.Column(type: "tinyint(1)", nullable: false), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentAttachments", x => x.Id); + table.ForeignKey( + name: "FK_DocumentAttachments_DocumentTypeMasters_DocumentTypeId", + column: x => x.DocumentTypeId, + principalTable: "DocumentTypeMasters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachments_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_DocumentAttachments_Employees_UploadedById", + column: x => x.UploadedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachments_Employees_VerifiedById", + column: x => x.VerifiedById, + principalTable: "Employees", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_DocumentAttachments_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AttachmentTagMappings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DocumentTagId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + AttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_AttachmentTagMappings", x => x.Id); + table.ForeignKey( + name: "FK_AttachmentTagMappings_DocumentAttachments_AttachmentId", + column: x => x.AttachmentId, + principalTable: "DocumentAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AttachmentTagMappings_DocumentTagMasters_DocumentTagId", + column: x => x.DocumentTagId, + principalTable: "DocumentTagMasters", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AttachmentTagMappings_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AttachmentVersionMappings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ParentAttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Version = table.Column(type: "int", nullable: false), + ChildAttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_AttachmentVersionMappings", x => x.Id); + table.ForeignKey( + name: "FK_AttachmentVersionMappings_DocumentAttachments_ChildAttachmen~", + column: x => x.ChildAttachmentId, + principalTable: "DocumentAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AttachmentVersionMappings_DocumentAttachments_ParentAttachme~", + column: x => x.ParentAttachmentId, + principalTable: "DocumentAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AttachmentVersionMappings_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DocumentAttachmentMappings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DocumentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + AttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentAttachmentMappings", x => x.Id); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_DocumentAttachments_AttachmentId", + column: x => x.AttachmentId, + principalTable: "DocumentAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_Documents_DocumentId", + column: x => x.DocumentId, + principalTable: "Documents", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "EntityTypeMasters", + columns: new[] { "Id", "Description", "Name" }, + values: new object[,] + { + { new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), "Emtities related to project.", "Project Entity" }, + { new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), "Employee related entitie", "Employee Entity" } + }); + + migrationBuilder.InsertData( + table: "Features", + columns: new[] { "Id", "Description", "IsActive", "ModuleId", "Name" }, + values: new object[] { new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), "Manage Document", true, new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), "Document Management" }); + + migrationBuilder.InsertData( + table: "DocumentCategoryMasters", + columns: new[] { "Id", "CreatedAt", "Description", "EntityTypeId", "Name", "TenantId" }, + values: new object[,] + { + { new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8157), "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), "Employee Documents", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8150), "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), "Project Documents", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.InsertData( + table: "FeaturePermissions", + columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, + values: new object[,] + { + { new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), "Grants a user the authority to verify the document", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "Verify Document" }, + { new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), "Grants a user the authority to upload the document", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "Upload Document" }, + { new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), "Grants a user the authority to delete the document", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "Delete Document" }, + { new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), "Grants a user the authority to view all documents related to employees and projects", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "View Document" }, + { new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), "Grants a user the authority to modify document", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "Mofify Document" } + }); + + migrationBuilder.InsertData( + table: "DocumentTypeMasters", + columns: new[] { "Id", "AllowedContentType", "CreatedAt", "DocumentCategoryId", "IsActive", "IsMandatory", "IsSystem", "IsValidationRequired", "MaxSizeAllowedInMB", "Name", "RegexExpression", "TenantId" }, + values: new object[,] + { + { new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8229), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 1.0, "Letter of Agreement", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8216), new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), true, true, true, true, 2.0, "Passport", "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8222), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 1.0, "Bill of Quantities (BOQ)", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8212), new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), true, true, true, true, 2.0, "Voter Card", "^[A-Z]{3}[0-9]{7}$", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8204), new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), true, true, true, true, 2.0, "Aadhaar card", "^[2-9][0-9]{11}$", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), "application/pdf,image/vnd.dwg,application/acad", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8238), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 20.0, "Drawings", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8209), new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), true, true, true, true, 2.0, "Pan Card", "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8235), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 1.0, "Standard Operating Procedure (SOP)", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8232), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 1.0, "Health and Safety Document", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8226), new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), true, false, true, false, 1.0, "Work Order", null, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8219), new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), true, true, true, true, 2.0, "Bank Passbook", "^\\d{9,18}$", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentTagMappings_AttachmentId", + table: "AttachmentTagMappings", + column: "AttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentTagMappings_DocumentTagId", + table: "AttachmentTagMappings", + column: "DocumentTagId"); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentTagMappings_TenantId", + table: "AttachmentTagMappings", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentVersionMappings_ChildAttachmentId", + table: "AttachmentVersionMappings", + column: "ChildAttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentVersionMappings_ParentAttachmentId", + table: "AttachmentVersionMappings", + column: "ParentAttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_AttachmentVersionMappings_TenantId", + table: "AttachmentVersionMappings", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_AttachmentId", + table: "DocumentAttachmentMappings", + column: "AttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_DocumentId", + table: "DocumentAttachmentMappings", + column: "DocumentId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_TenantId", + table: "DocumentAttachmentMappings", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_DocumentTypeId", + table: "DocumentAttachments", + column: "DocumentTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_TenantId", + table: "DocumentAttachments", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_UpdatedById", + table: "DocumentAttachments", + column: "UpdatedById"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_UploadedById", + table: "DocumentAttachments", + column: "UploadedById"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_VerifiedById", + table: "DocumentAttachments", + column: "VerifiedById"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentCategoryMasters_EntityTypeId", + table: "DocumentCategoryMasters", + column: "EntityTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentCategoryMasters_TenantId", + table: "DocumentCategoryMasters", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentTagMasters_TenantId", + table: "DocumentTagMasters", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentTypeMasters_DocumentCategoryId", + table: "DocumentTypeMasters", + column: "DocumentCategoryId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentTypeMasters_TenantId", + table: "DocumentTypeMasters", + column: "TenantId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AttachmentTagMappings"); + + migrationBuilder.DropTable( + name: "AttachmentVersionMappings"); + + migrationBuilder.DropTable( + name: "DocumentAttachmentMappings"); + + migrationBuilder.DropTable( + name: "DocumentTagMasters"); + + migrationBuilder.DropTable( + name: "DocumentAttachments"); + + migrationBuilder.DropTable( + name: "DocumentTypeMasters"); + + migrationBuilder.DropTable( + name: "DocumentCategoryMasters"); + + migrationBuilder.DropTable( + name: "EntityTypeMasters"); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("40863a13-5a66-469d-9b48-135bc5dbf486")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("71189504-f1c8-4ca5-8db6-810497be2854")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833")); + + migrationBuilder.DeleteData( + table: "Features", + keyColumn: "Id", + keyValue: new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462")); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index ac6dd3f..0283722 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -720,6 +720,61 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("EmployeeBucketMappings"); }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => { b.Property("Id") @@ -768,6 +823,384 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("Documents"); }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentAttachmentMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8150), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8157), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8204), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8209), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8212), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8216), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8219), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8222), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8226), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8229), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8232), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8235), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8238), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => { b.Property("Id") @@ -1139,6 +1572,46 @@ namespace Marco.Pms.DataAccess.Migrations Name = "Manage Masters" }, new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new { Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", @@ -1961,6 +2434,39 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => { b.Property("Id") @@ -2236,6 +2742,14 @@ namespace Marco.Pms.DataAccess.Migrations Name = "Attendance Management" }, new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new { Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), Description = "Global Masters", @@ -4007,6 +4521,60 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Employee"); }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => { b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") @@ -4024,6 +4592,121 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("UploadedBy"); }); + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("Document"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => { b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") diff --git a/Marco.Pms.Model/DocumentManager/AttachmentTagMapping.cs b/Marco.Pms.Model/DocumentManager/AttachmentTagMapping.cs new file mode 100644 index 0000000..615ea21 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/AttachmentTagMapping.cs @@ -0,0 +1,22 @@ +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class AttachmentTagMapping : TenantRelation + { + + public Guid Id { get; set; } + public Guid DocumentTagId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentTagId")] + public DocumentTagMaster? DocumentTag { get; set; } + public Guid AttachmentId { get; set; } + + [ValidateNever] + [ForeignKey("AttachmentId")] + public DocumentAttachment? Attachment { get; set; } + } +} diff --git a/Marco.Pms.Model/DocumentManager/AttachmentVersionMapping.cs b/Marco.Pms.Model/DocumentManager/AttachmentVersionMapping.cs new file mode 100644 index 0000000..7ea3bc0 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/AttachmentVersionMapping.cs @@ -0,0 +1,22 @@ +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class AttachmentVersionMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid ParentAttachmentId { get; set; } + + [ValidateNever] + [ForeignKey("ParentAttachmentId")] + public DocumentAttachment? ParentAttachment { get; set; } + public int Version { get; set; } = 1; + + public Guid ChildAttachmentId { get; set; } + [ValidateNever] + [ForeignKey("ChildAttachmentId")] + public DocumentAttachment? ChildAttachment { get; set; } + } +} diff --git a/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs new file mode 100644 index 0000000..fbe23a1 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs @@ -0,0 +1,41 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class DocumentAttachment : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string? DocumentId { get; set; } + public string Description { get; set; } = string.Empty; + public DateTime UploadedAt { get; set; } + public Guid UploadedById { get; set; } // References the employee who uploaded the document + + [ValidateNever] + [ForeignKey("UploadedById")] + public Employee? UploadedBy { get; set; } + public DateTime UpdatedAt { get; set; } + public Guid? UpdatedById { get; set; } // References the employee who updates the document + + [ValidateNever] + [ForeignKey("UpdatedById")] + public Employee? UpdatedBy { get; set; } + public DateTime VerifiedAt { get; set; } + public bool? IsVerified { get; set; } + public Guid? VerifiedById { get; set; } // Associates the document with a specific employee, if applicable + + [ValidateNever] + [ForeignKey("VerifiedById")] + public Employee? VerifiedBy { get; set; } + public Guid EntityId { get; set; } // Associates the document with a specific project, if applicable + public Guid DocumentTypeId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentTypeId")] + public DocumentTypeMaster? DocumentType { get; set; } + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs b/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs new file mode 100644 index 0000000..f568542 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs @@ -0,0 +1,21 @@ +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class DocumentAttachmentMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid DocumentId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentId")] + public Document? Document { get; set; } + public Guid AttachmentId { get; set; } + + [ValidateNever] + [ForeignKey("AttachmentId")] + public DocumentAttachment? Attachment { get; set; } + } +} diff --git a/Marco.Pms.Model/DocumentManager/DocumentCategoryMaster.cs b/Marco.Pms.Model/DocumentManager/DocumentCategoryMaster.cs new file mode 100644 index 0000000..9eeb467 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/DocumentCategoryMaster.cs @@ -0,0 +1,21 @@ +using Marco.Pms.Model.Master; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class DocumentCategoryMaster : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public Guid EntityTypeId { get; set; } + + [ValidateNever] + [ForeignKey("EntityTypeId")] + public EntityTypeMaster? EntityTypeMaster { get; set; } + + public DateTime CreatedAt { get; set; } + } +} diff --git a/Marco.Pms.Model/DocumentManager/DocumentTagMaster.cs b/Marco.Pms.Model/DocumentManager/DocumentTagMaster.cs new file mode 100644 index 0000000..7abee73 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/DocumentTagMaster.cs @@ -0,0 +1,11 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.DocumentManager +{ + public class DocumentTagMaster : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/DocumentManager/DocumentTypeMaster.cs b/Marco.Pms.Model/DocumentManager/DocumentTypeMaster.cs new file mode 100644 index 0000000..4b57834 --- /dev/null +++ b/Marco.Pms.Model/DocumentManager/DocumentTypeMaster.cs @@ -0,0 +1,26 @@ +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.DocumentManager +{ + public class DocumentTypeMaster : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string? RegexExpression { get; set; } + public string AllowedContentType { get; set; } = string.Empty; + public double MaxSizeAllowedInMB { get; set; } = 2; + public bool IsValidationRequired { get; set; } = true; + public bool IsMandatory { get; set; } = true; + public bool IsSystem { get; set; } = false; + public bool IsActive { get; set; } = true; + public Guid DocumentCategoryId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentCategoryId")] + public DocumentCategoryMaster? DocumentCategory { get; set; } + + public DateTime CreatedAt { get; set; } + } +} -- 2.43.0 From eac77e23d46a4abe4590ab5bc1527e84d8c51635 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 12:17:05 +0530 Subject: [PATCH 14/63] Added the Get Document Category list API --- .../DocumentManager/DocumentAttachmentDto.cs | 15 +++++ .../Dtos/DocumentManager/DocumentTagDto.cs | 8 +++ Marco.Pms.Model/Filters/DocumentFilter.cs | 13 +++++ .../{Utilities => Filters}/ExpensesFilter.cs | 0 .../{Utilities => Filters}/ImageFilter.cs | 2 +- .../{Utilities => Filters}/TenantFilter.cs | 2 +- Marco.Pms.Model/Master/EntityTypeMaster.cs | 9 +++ Marco.Pms.Model/Utilities/FileUploadModel.cs | 6 +- .../DocumentManager/DocumentCategoryVM.cs | 10 ++++ .../DocumentManager/DocumentListVM.cs | 17 ++++++ .../DocumentManager/DocumentTypeVM.cs | 16 ++++++ .../Controllers/ImageController.cs | 1 + .../Controllers/MasterController.cs | 12 ++++ .../Controllers/ReportController.cs | 28 --------- .../Controllers/TenantController.cs | 1 + .../MappingProfiles/MappingProfile.cs | 12 ++++ Marco.Pms.Services/Service/MasterService.cs | 57 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 8 +++ 18 files changed, 184 insertions(+), 33 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs create mode 100644 Marco.Pms.Model/Dtos/DocumentManager/DocumentTagDto.cs create mode 100644 Marco.Pms.Model/Filters/DocumentFilter.cs rename Marco.Pms.Model/{Utilities => Filters}/ExpensesFilter.cs (100%) rename Marco.Pms.Model/{Utilities => Filters}/ImageFilter.cs (92%) rename Marco.Pms.Model/{Utilities => Filters}/TenantFilter.cs (90%) create mode 100644 Marco.Pms.Model/Master/EntityTypeMaster.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/DocumentCategoryVM.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs diff --git a/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs new file mode 100644 index 0000000..acf2003 --- /dev/null +++ b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs @@ -0,0 +1,15 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Dtos.DocumentManager +{ + public class DocumentAttachmentDto + { + public required string Name { get; set; } + public string? DocumentId { get; set; } + public required string Description { get; set; } + public Guid EntityId { get; set; } + public required Guid DocumentTypeId { get; set; } // References the type of the document + public required FileUploadModel Attachment { get; set; } + public List? Tags { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/DocumentManager/DocumentTagDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/DocumentTagDto.cs new file mode 100644 index 0000000..24c1913 --- /dev/null +++ b/Marco.Pms.Model/Dtos/DocumentManager/DocumentTagDto.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Dtos.DocumentManager +{ + public class DocumentTagDto + { + public required string Name { get; set; } + public required bool IsActive { get; set; } + } +} diff --git a/Marco.Pms.Model/Filters/DocumentFilter.cs b/Marco.Pms.Model/Filters/DocumentFilter.cs new file mode 100644 index 0000000..4b5538e --- /dev/null +++ b/Marco.Pms.Model/Filters/DocumentFilter.cs @@ -0,0 +1,13 @@ +namespace Marco.Pms.Model.Filters +{ + public class DocumentFilter + { + public List? UploadedByIds { get; set; } + public List? DocumentTypeIds { get; set; } + public bool IsActive { get; set; } = true; + public bool IsUploadedAt { get; set; } = true; + public bool? IsVerified { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + } +} diff --git a/Marco.Pms.Model/Utilities/ExpensesFilter.cs b/Marco.Pms.Model/Filters/ExpensesFilter.cs similarity index 100% rename from Marco.Pms.Model/Utilities/ExpensesFilter.cs rename to Marco.Pms.Model/Filters/ExpensesFilter.cs diff --git a/Marco.Pms.Model/Utilities/ImageFilter.cs b/Marco.Pms.Model/Filters/ImageFilter.cs similarity index 92% rename from Marco.Pms.Model/Utilities/ImageFilter.cs rename to Marco.Pms.Model/Filters/ImageFilter.cs index a5cb7f7..d044a9b 100644 --- a/Marco.Pms.Model/Utilities/ImageFilter.cs +++ b/Marco.Pms.Model/Filters/ImageFilter.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.Utilities +namespace Marco.Pms.Model.Filters { public class ImageFilter { diff --git a/Marco.Pms.Model/Utilities/TenantFilter.cs b/Marco.Pms.Model/Filters/TenantFilter.cs similarity index 90% rename from Marco.Pms.Model/Utilities/TenantFilter.cs rename to Marco.Pms.Model/Filters/TenantFilter.cs index 2c0a477..1635643 100644 --- a/Marco.Pms.Model/Utilities/TenantFilter.cs +++ b/Marco.Pms.Model/Filters/TenantFilter.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.Utilities +namespace Marco.Pms.Model.Filters { public class TenantFilter { diff --git a/Marco.Pms.Model/Master/EntityTypeMaster.cs b/Marco.Pms.Model/Master/EntityTypeMaster.cs new file mode 100644 index 0000000..9def961 --- /dev/null +++ b/Marco.Pms.Model/Master/EntityTypeMaster.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Master +{ + public class EntityTypeMaster + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/Utilities/FileUploadModel.cs b/Marco.Pms.Model/Utilities/FileUploadModel.cs index 98a6a26..1552e5a 100644 --- a/Marco.Pms.Model/Utilities/FileUploadModel.cs +++ b/Marco.Pms.Model/Utilities/FileUploadModel.cs @@ -3,9 +3,9 @@ public class FileUploadModel { public Guid? DocumentId { get; set; } - public string? FileName { get; set; } // Name of the file (e.g., "image1.png") - public string? Base64Data { get; set; } // Base64-encoded string of the file - public string? ContentType { get; set; } // MIME type (e.g., "image/png", "application/pdf") + public required string FileName { get; set; } // Name of the file (e.g., "image1.png") + public required string Base64Data { get; set; } // Base64-encoded string of the file + public required string ContentType { get; set; } // MIME type (e.g., "image/png", "application/pdf") public long FileSize { get; set; } // File size in bytes public string? Description { get; set; } // Optional: Description or purpose of the file public bool IsActive { get; set; } = true; diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentCategoryVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentCategoryVM.cs new file mode 100644 index 0000000..6da8b02 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentCategoryVM.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class DocumentCategoryVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public Guid EntityTypeId { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs new file mode 100644 index 0000000..f900959 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs @@ -0,0 +1,17 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class DocumentListVM + { + public Guid Id { get; set; } + public string? Name { get; set; } + public string? DocumentId { get; set; } + public string? Description { get; set; } + public DateTime UploadedAt { get; set; } + public BasicEmployeeVM? UploadedBy { get; set; } + public DocumentTypeVM? DocumentType { get; set; } + public bool IsActive { get; set; } + public bool IsVerified { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs new file mode 100644 index 0000000..a7c3d0a --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs @@ -0,0 +1,16 @@ +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class DocumentTypeVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string? RegexExpression { get; set; } + public string AllowedContentType { get; set; } = string.Empty; + public int MaxFilesAllowed { get; set; } + public double MaxSizeAllowedInKB { get; set; } + public bool IsValidationRequired { get; set; } + public bool IsSystem { get; set; } + public bool IsActive { get; set; } + public DocumentCategoryVM? DocumentCategory { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/ImageController.cs b/Marco.Pms.Services/Controllers/ImageController.cs index cf046a8..c8724de 100644 --- a/Marco.Pms.Services/Controllers/ImageController.cs +++ b/Marco.Pms.Services/Controllers/ImageController.cs @@ -2,6 +2,7 @@ using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Filters; using Marco.Pms.Model.Mapper; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index bcc4264..0c374d6 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -949,5 +949,17 @@ namespace Marco.Pms.Services.Controllers } #endregion + + #region =================================================================== Document Category APIs =================================================================== + + [HttpGet("document-category/list")] + public async Task GetDocumentCategoryMasterList([FromQuery] Guid? entityTypeId) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetDocumentCategoryMasterListAsync(entityTypeId, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + #endregion } } diff --git a/Marco.Pms.Services/Controllers/ReportController.cs b/Marco.Pms.Services/Controllers/ReportController.cs index e71061c..872f128 100644 --- a/Marco.Pms.Services/Controllers/ReportController.cs +++ b/Marco.Pms.Services/Controllers/ReportController.cs @@ -154,34 +154,6 @@ namespace Marco.Pms.Services.Controllers } } - [HttpPost("mail-template1")] - public async Task AddMailTemplate1([FromBody] MailTemeplateDto mailTemeplateDto) - { - Guid tenantId = _userHelper.GetTenantId(); - if (string.IsNullOrWhiteSpace(mailTemeplateDto.Body) && string.IsNullOrWhiteSpace(mailTemeplateDto.Title)) - { - _logger.LogWarning("User tries to set email template but send invalid data"); - return BadRequest(ApiResponse.ErrorResponse("Provided Invalid data", "Provided Invalid data", 400)); - } - var existngTemalate = await _context.MailingList.FirstOrDefaultAsync(t => t.Title.ToLower() == mailTemeplateDto.Title.ToLower()); - if (existngTemalate != null) - { - _logger.LogWarning("User tries to set email template, but title already existed in database"); - return BadRequest(ApiResponse.ErrorResponse("Email title is already existed", "Email title is already existed", 400)); - } - MailingList mailingList = new MailingList - { - Title = mailTemeplateDto.Title, - Body = mailTemeplateDto.Body, - Subject = mailTemeplateDto.Subject, - Keywords = mailTemeplateDto.Keywords, - TenantId = tenantId - }; - _context.MailingList.Add(mailingList); - await _context.SaveChangesAsync(); - return Ok("Success"); - } - /// /// Adds a new mail template. /// diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 38f72df..be5b1ed 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -4,6 +4,7 @@ using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Filters; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 1c516e1..f283bd8 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,6 +1,8 @@ using AutoMapper; using Marco.Pms.Model.AppMenu; +using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.AppMenu; +using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Project; @@ -306,6 +308,16 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.DocumentId, opt => opt.MapFrom(src => Guid.Parse(src.DocumentId))); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + #endregion #region ======================================================= AppMenu ======================================================= diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 88467d1..11e64ba 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1,12 +1,14 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; +using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -487,6 +489,61 @@ namespace Marco.Pms.Services.Service } } + #endregion + + #region =================================================================== Document Category APIs =================================================================== + + /// + /// Fetches the list of Document Categories for a given tenant and optional entity type. + /// Ensures tenant validation, mapping, and proper logging. + /// + /// Optional entity type filter (e.g., EmployeeEntity, ProjectEntity). + /// Currently logged-in employee. + /// Tenant Id context. + /// ApiResponse containing the document categories or error details. + public async Task> GetDocumentCategoryMasterListAsync(Guid? entityTypeId, Employee loggedInEmployee, Guid tenantId) + { + try + { + // ✅ Tenant validation + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document categories for TenantId: {RequestedTenantId}", + loggedInEmployee.Id, loggedInEmployee.TenantId, tenantId); + + return ApiResponse.ErrorResponse("Access Denied", "You do not have access to this information", 403); + } + + // ✅ Build query + IQueryable documentCategoryQuery = _context.DocumentCategoryMasters + .AsNoTracking() // optimization: read-only + .Where(dc => dc.TenantId == tenantId); + + // ✅ Apply optional filter + if (entityTypeId.HasValue) + { + documentCategoryQuery = documentCategoryQuery.Where(dc => dc.EntityTypeId == entityTypeId.Value); + } + + // ✅ Fetch and map + var documentCategories = await documentCategoryQuery.ToListAsync(); + var response = _mapper.Map>(documentCategories); + + _logger.LogInfo("{Count} document categories fetched successfully for TenantId: {TenantId} by Employee {EmployeeId}", + response.Count, tenantId, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(response, $"{response.Count} document categories have been fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while fetching document categories for TenantId: {TenantId} by Employee {EmployeeId}", + tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Internal Server Error", "Server Error occured", 500); + } + } + + #endregion #region =================================================================== Helper Function =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 2cde277..23f3c51 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -26,5 +26,13 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion + + #region =================================================================== Payment mode APIs =================================================================== + Task> GetDocumentCategoryMasterListAsync(Guid? entityTypeId, Employee loggedInEmployee, Guid tenantId); + //Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); + //Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); + //Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); + + #endregion } } -- 2.43.0 From 4161506defc415f52083e73984d095c19d72e00c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 12:48:13 +0530 Subject: [PATCH 15/63] Added the get list of Document type API --- .../DocumentManager/DocumentTypeVM.cs | 1 + .../Controllers/MasterController.cs | 11 +++++ .../MappingProfiles/MappingProfile.cs | 3 +- Marco.Pms.Services/Service/MasterService.cs | 48 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 9 +++- 5 files changed, 70 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs index a7c3d0a..369e962 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs @@ -9,6 +9,7 @@ public int MaxFilesAllowed { get; set; } public double MaxSizeAllowedInKB { get; set; } public bool IsValidationRequired { get; set; } + public bool IsMandatory { get; set; } public bool IsSystem { get; set; } public bool IsActive { get; set; } public DocumentCategoryVM? DocumentCategory { get; set; } diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 0c374d6..bab2a5c 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -960,6 +960,17 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + #endregion + #region =================================================================== Document Type APIs =================================================================== + + [HttpGet("document-type/list")] + public async Task GetDocumentTypeMasterList([FromQuery] Guid? documentCategoryId) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetDocumentTypeMasterListAsync(documentCategoryId, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index f283bd8..fb55f03 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -315,7 +315,8 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); - CreateMap(); + + CreateMap(); CreateMap(); #endregion diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 11e64ba..290ec3d 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -544,6 +544,54 @@ namespace Marco.Pms.Services.Service } + #endregion + + #region =================================================================== Document Type APIs =================================================================== + + + public async Task> GetDocumentTypeMasterListAsync(Guid? documentCategoryId, Employee loggedInEmployee, Guid tenantId) + { + try + { + // ✅ Tenant validation + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document types for TenantId: {RequestedTenantId}", + loggedInEmployee.Id, loggedInEmployee.TenantId, tenantId); + + return ApiResponse.ErrorResponse("Access Denied", "You do not have access to this information", 403); + } + + // ✅ Build query + IQueryable documentTypeQuery = _context.DocumentTypeMasters + .AsNoTracking() // optimization: read-only + .Where(dc => dc.TenantId == tenantId); + + // ✅ Apply optional filter + if (documentCategoryId.HasValue) + { + documentTypeQuery = documentTypeQuery.Where(dc => dc.DocumentCategoryId == documentCategoryId.Value); + } + + // ✅ Fetch and map + var documentType = await documentTypeQuery.ToListAsync(); + var response = _mapper.Map>(documentType); + + _logger.LogInfo("{Count} document type fetched successfully for TenantId: {TenantId} by Employee {EmployeeId}", + response.Count, tenantId, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(response, $"{response.Count} document type have been fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while fetching document type for TenantId: {TenantId} by Employee {EmployeeId}", + tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Internal Server Error", "Server Error occured", 500); + } + } + + #endregion #region =================================================================== Helper Function =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 23f3c51..c85b183 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -27,12 +27,19 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion - #region =================================================================== Payment mode APIs =================================================================== + #region =================================================================== Document Category APIs =================================================================== Task> GetDocumentCategoryMasterListAsync(Guid? entityTypeId, Employee loggedInEmployee, Guid tenantId); //Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); //Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); //Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); + #endregion + #region =================================================================== Document Type APIs =================================================================== + Task> GetDocumentTypeMasterListAsync(Guid? documentCategoryId, Employee loggedInEmployee, Guid tenantId); + //Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); + //Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); + //Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); + #endregion } } -- 2.43.0 From 4c36cf266f5d024d4c5d6db4c2d5dca97a749f89 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 14:31:55 +0530 Subject: [PATCH 16/63] Added Document Category and Document Type in master menu list --- Marco.Pms.Services/Controllers/AppMenuController.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 13eaa2f..707ef45 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -558,7 +558,9 @@ namespace Marco.Pms.Services.Controllers EmployeeManagement, new List { new MasterMenuVM { Id = 1, Name = "Application Role" }, - new MasterMenuVM { Id = 2, Name = "Job Role" } + new MasterMenuVM { Id = 2, Name = "Job Role" }, + new MasterMenuVM { Id = 9, Name = "Document Category" }, + new MasterMenuVM { Id = 10, Name = "Document Type" } } }, { -- 2.43.0 From 75ae12a81eabbbb9025720741fe857ce471be5a7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 15:00:16 +0530 Subject: [PATCH 17/63] Added the upload document API --- .../Data/ApplicationDbContext.cs | 11 +- ...ntAttachmentyMapping_And_Added.Designer.cs | 5444 +++++++++++++++++ ...ed_DocumentAttachmentyMapping_And_Added.cs | 285 + .../ApplicationDbContextModelSnapshot.cs | 102 +- .../DocumentManager/DocumentAttachment.cs | 6 + .../DocumentAttachmentMapping.cs | 6 +- .../Entitlements/PermissionsMaster.cs | 6 + .../Controllers/DocumentController.cs | 557 ++ .../MappingProfiles/MappingProfile.cs | 2 +- 9 files changed, 6336 insertions(+), 83 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.cs create mode 100644 Marco.Pms.Services/Controllers/DocumentController.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 16fb7a0..d7484b3 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -113,7 +113,6 @@ namespace Marco.Pms.DataAccess.Data public DbSet DocumentCategoryMasters { get; set; } public DbSet DocumentTagMasters { get; set; } public DbSet DocumentAttachments { get; set; } - public DbSet DocumentAttachmentMappings { get; set; } public DbSet AttachmentVersionMappings { get; set; } public DbSet AttachmentTagMappings { get; set; } @@ -770,7 +769,7 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("336225ac-67f3-4e14-ba7a-8fad03cf2832"), Name = "Aadhaar card", RegexExpression = "^[2-9][0-9]{11}$", - AllowedContentType = "application/pdf", + AllowedContentType = "application/pdf,image/jpeg", MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, @@ -785,7 +784,7 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("6344393b-9bb1-45f8-b620-9f6e279d012c"), Name = "Pan Card", RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", - AllowedContentType = "application/pdf", + AllowedContentType = "application/pdf,image/jpeg", MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, @@ -800,7 +799,7 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("2d1d7441-46a8-425e-9395-94d0956f8e91"), Name = "Voter Card", RegexExpression = "^[A-Z]{3}[0-9]{7}$", - AllowedContentType = "application/pdf", + AllowedContentType = "application/pdf,image/jpeg", MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, @@ -815,7 +814,7 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("16c40b80-c207-4a0c-a4d3-381414afe35a"), Name = "Passport", RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", - AllowedContentType = "application/pdf", + AllowedContentType = "application/pdf,image/jpeg", MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, @@ -830,7 +829,7 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("f76d8215-d399-4f0e-b414-12e427f50be3"), Name = "Bank Passbook", RegexExpression = "^\\d{9,18}$", - AllowedContentType = "application/pdf", + AllowedContentType = "application/pdf,image/jpeg", MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, diff --git a/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.Designer.cs new file mode 100644 index 0000000..80f6227 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.Designer.cs @@ -0,0 +1,5444 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250828092249_Removed_DocumentAttachmentyMapping_And_Added")] + partial class Removed_DocumentAttachmentyMapping_And_Added + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7887), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7895), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7958), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7966), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7971), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7975), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7980), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7984), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7991), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7995), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8000), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8004), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8008), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.cs b/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.cs new file mode 100644 index 0000000..935094d --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828092249_Removed_DocumentAttachmentyMapping_And_Added.cs @@ -0,0 +1,285 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Removed_DocumentAttachmentyMapping_And_Added : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "DocumentAttachmentMappings"); + + migrationBuilder.AddColumn( + name: "DocumentDataId", + table: "DocumentAttachments", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7895)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7887)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7995)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf,image/jpeg", new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7975) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7984)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf,image/jpeg", new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7971) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf,image/jpeg", new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7958) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8008)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf,image/jpeg", new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7966) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8004)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8000)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7991)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf,image/jpeg", new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7980) }); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachments_DocumentDataId", + table: "DocumentAttachments", + column: "DocumentDataId"); + + migrationBuilder.AddForeignKey( + name: "FK_DocumentAttachments_Documents_DocumentDataId", + table: "DocumentAttachments", + column: "DocumentDataId", + principalTable: "Documents", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DocumentAttachments_Documents_DocumentDataId", + table: "DocumentAttachments"); + + migrationBuilder.DropIndex( + name: "IX_DocumentAttachments_DocumentDataId", + table: "DocumentAttachments"); + + migrationBuilder.DropColumn( + name: "DocumentDataId", + table: "DocumentAttachments"); + + migrationBuilder.CreateTable( + name: "DocumentAttachmentMappings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + AttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DocumentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_DocumentAttachmentMappings", x => x.Id); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_DocumentAttachments_AttachmentId", + column: x => x.AttachmentId, + principalTable: "DocumentAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_Documents_DocumentId", + column: x => x.DocumentId, + principalTable: "Documents", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DocumentAttachmentMappings_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8157)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8150)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8229)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8216) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8222)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8212) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8204) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8238)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8209) }); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8235)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8232)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8226)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + columns: new[] { "AllowedContentType", "CreatedAt" }, + values: new object[] { "application/pdf", new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8219) }); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_AttachmentId", + table: "DocumentAttachmentMappings", + column: "AttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_DocumentId", + table: "DocumentAttachmentMappings", + column: "DocumentId"); + + migrationBuilder.CreateIndex( + name: "IX_DocumentAttachmentMappings_TenantId", + table: "DocumentAttachmentMappings", + column: "TenantId"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 0283722..120c847 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -833,6 +833,9 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + b.Property("DocumentId") .HasColumnType("longtext"); @@ -875,6 +878,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasKey("Id"); + b.HasIndex("DocumentDataId"); + b.HasIndex("DocumentTypeId"); b.HasIndex("TenantId"); @@ -888,32 +893,6 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("DocumentAttachments"); }); - modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("AttachmentId") - .HasColumnType("char(36)"); - - b.Property("DocumentId") - .HasColumnType("char(36)"); - - b.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("AttachmentId"); - - b.HasIndex("DocumentId"); - - b.HasIndex("TenantId"); - - b.ToTable("DocumentAttachmentMappings"); - }); - modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => { b.Property("Id") @@ -949,7 +928,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8150), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7887), Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), Name = "Project Documents", @@ -958,7 +937,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8157), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7895), Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), Name = "Employee Documents", @@ -1043,8 +1022,8 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), - AllowedContentType = "application/pdf", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8204), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7958), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1058,8 +1037,8 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), - AllowedContentType = "application/pdf", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8209), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7966), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1073,8 +1052,8 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), - AllowedContentType = "application/pdf", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8212), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7971), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1088,8 +1067,8 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), - AllowedContentType = "application/pdf", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8216), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7975), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1103,8 +1082,8 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), - AllowedContentType = "application/pdf", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8219), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7980), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1119,7 +1098,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8222), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7984), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1133,7 +1112,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8226), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7991), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1147,7 +1126,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8229), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7995), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1161,7 +1140,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8232), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8000), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1175,7 +1154,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8235), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8004), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1189,7 +1168,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", - CreatedAt = new DateTime(2025, 8, 28, 5, 50, 2, 39, DateTimeKind.Utc).AddTicks(8238), + CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8008), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -4594,6 +4573,12 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") .WithMany() .HasForeignKey("DocumentTypeId") @@ -4620,6 +4605,8 @@ namespace Marco.Pms.DataAccess.Migrations .WithMany() .HasForeignKey("VerifiedById"); + b.Navigation("Document"); + b.Navigation("DocumentType"); b.Navigation("Tenant"); @@ -4631,33 +4618,6 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("VerifiedBy"); }); - modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachmentMapping", b => - { - b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") - .WithMany() - .HasForeignKey("AttachmentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") - .WithMany() - .HasForeignKey("DocumentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Attachment"); - - b.Navigation("Document"); - - b.Navigation("Tenant"); - }); - modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => { b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") diff --git a/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs index fbe23a1..8f11dd3 100644 --- a/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs +++ b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs @@ -36,6 +36,12 @@ namespace Marco.Pms.Model.DocumentManager [ValidateNever] [ForeignKey("DocumentTypeId")] public DocumentTypeMaster? DocumentType { get; set; } + + public Guid DocumentDataId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentDataId")] + public Document? Document { get; set; } public bool IsActive { get; set; } = true; } } diff --git a/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs b/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs index f568542..7a4ecc2 100644 --- a/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs +++ b/Marco.Pms.Model/DocumentManager/DocumentAttachmentMapping.cs @@ -7,11 +7,7 @@ namespace Marco.Pms.Model.DocumentManager public class DocumentAttachmentMapping : TenantRelation { public Guid Id { get; set; } - public Guid DocumentId { get; set; } - - [ValidateNever] - [ForeignKey("DocumentId")] - public Document? Document { get; set; } + public Guid AttachmentId { get; set; } [ValidateNever] diff --git a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs index 262d34b..08b5667 100644 --- a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs +++ b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs @@ -39,6 +39,12 @@ public static readonly Guid ExpenseApprove = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"); public static readonly Guid ExpenseProcess = Guid.Parse("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"); public static readonly Guid ExpenseManage = Guid.Parse("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"); + + public static readonly Guid ViewDocument = Guid.Parse("71189504-f1c8-4ca5-8db6-810497be2854"); + public static readonly Guid UploadDocument = Guid.Parse("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"); + public static readonly Guid MofifyDocument = Guid.Parse("c423fd81-6273-4b9d-bb5e-76a0fb343833"); + public static readonly Guid DeleteDocument = Guid.Parse("40863a13-5a66-469d-9b48-135bc5dbf486"); + public static readonly Guid VerifyDocument = Guid.Parse("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"); } } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs new file mode 100644 index 0000000..15cf745 --- /dev/null +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -0,0 +1,557 @@ +using AutoMapper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Model.Dtos.DocumentManager; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Filters; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.DocumentManager; +using Marco.Pms.Services.Service; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.CodeAnalysis; +using Microsoft.EntityFrameworkCore; +using System.Text.Json; +using System.Text.RegularExpressions; +using Document = Marco.Pms.Model.DocumentManager.Document; + +namespace Marco.Pms.Services.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class DocumentController : ControllerBase + { + private readonly IDbContextFactory _dbContextFactory; + private readonly IServiceScopeFactory _serviceScope; + private readonly UserHelper _userHelper; + private readonly ILoggingService _logger; + private readonly IMapper _mapper; + private readonly Guid tenantId; + + private static readonly Guid ProjectEntity = Guid.Parse("c8fe7115-aa27-43bc-99f4-7b05fabe436e"); + private static readonly Guid EmployeeEntity = Guid.Parse("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"); + + public DocumentController(IDbContextFactory dbContextFactory, + IServiceScopeFactory serviceScope, + UserHelper userHelper, + ILoggingService logger, + IMapper mapper) + { + _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); + _serviceScope = serviceScope ?? throw new ArgumentNullException(nameof(serviceScope)); + _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + tenantId = userHelper.GetTenantId(); + } + // GET: api/ + [HttpGet("list/{entityTypeId}")] + public async Task Get(Guid entityTypeId, [FromQuery] Guid entityId, [FromQuery] string filter, + [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) + { + using var scope = _serviceScope.CreateScope(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var _permission = scope.ServiceProvider.GetRequiredService(); + var isViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + + if (!isViewPermission) + { + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document", 403)); + } + if (ProjectEntity != entityTypeId && EmployeeEntity != entityTypeId) + { + return NotFound(ApiResponse.ErrorResponse("Entity type not found", "Entity Type not found in database", 404)); + } + if (ProjectEntity == entityTypeId) + { + var isHasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, entityId); + if (!isHasProjectPermission) + { + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document to this project", 403)); + } + } + else if (EmployeeEntity == entityTypeId) + { + var isEmployeeExists = await _context.Employees.AnyAsync(e => e.Id == entityId && e.TenantId == tenantId); + if (!isEmployeeExists) + { + return NotFound(ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404)); + } + } + + var documentQuery = _context.DocumentAttachments + .Include(da => da.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) + .Where(da => da.DocumentType != null && + da.DocumentType.DocumentCategory != null && + da.DocumentType.DocumentCategory.EntityTypeId == entityTypeId); + + var documents = await documentQuery + .OrderByDescending(t => t.UploadedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(); + + return Ok(ApiResponse.SuccessResponse(documents, "Document list fetched successfully", 200)); + } + + // GET api//5 + [HttpGet("{id}")] + public async Task Get(int id) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + //string preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); + } + + // POST api/ + [HttpPost] + public async Task Post([FromBody] DocumentAttachmentDto model) + { + using var scope = _serviceScope.CreateScope(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var _permission = scope.ServiceProvider.GetRequiredService(); + var isUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); + + if (!isUploadPermission || loggedInEmployee.Id != model.EntityId) + { + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document", 403)); + } + + var documentType = await _context.DocumentTypeMasters + .Include(dt => dt.DocumentCategory) + .FirstOrDefaultAsync(dt => dt.Id == model.DocumentTypeId && dt.TenantId == tenantId && dt.DocumentCategory != null); + + if (documentType == null) + { + return NotFound(ApiResponse.ErrorResponse("Document Type not found in database", "Document Type not found in database", 404)); + } + if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) + { + return BadRequest(ApiResponse.ErrorResponse("Document ID is missing", "User must provide the document ID fro this document", 400)); + } + if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId)) + { + bool isValid = Regex.IsMatch(model.DocumentId, documentType.RegexExpression ?? ""); + if (!isValid) + { + return BadRequest(ApiResponse.ErrorResponse("Invaid Document ID", "Provided document ID is not valid", 400)); + } + } + + var employeeExistTask = Task.Run(async () => + { + if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity) + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.Employees.AnyAsync(e => e.Id == model.EntityId && e.TenantId == tenantId); + } + return false; + }); + var projectExistTask = Task.Run(async () => + { + if (documentType.DocumentCategory!.EntityTypeId == ProjectEntity) + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.Projects.AnyAsync(p => p.Id == model.EntityId && p.TenantId == tenantId); + } + return false; + }); + + await Task.WhenAll(employeeExistTask, projectExistTask); + + var employeeExist = employeeExistTask.Result; + var projectExist = projectExistTask.Result; + if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity && !employeeExist) + { + return NotFound(ApiResponse.ErrorResponse("Employee Not Found", "Employee not found in database", 404)); + } + if (documentType.DocumentCategory.EntityTypeId == ProjectEntity && !projectExist) + { + return NotFound(ApiResponse.ErrorResponse("Project Not Found", "Project not found in database", 404)); + } + + var documentDetails = _mapper.Map(model); + documentDetails.UploadedAt = DateTime.UtcNow; + documentDetails.UploadedById = loggedInEmployee.Id; + documentDetails.TenantId = tenantId; + + var _s3Service = scope.ServiceProvider.GetRequiredService(); + var batchId = Guid.NewGuid(); + List documents = new List(); + if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) + { + return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", + $"File size exceeded. Maximum allowed is {documentType.MaxSizeAllowedInMB} MB.", 400)); + } + + + string base64 = model.Attachment.Base64Data?.Split(',').LastOrDefault() ?? ""; + if (string.IsNullOrWhiteSpace(base64)) + return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Image data missing", 400)); + + var fileType = _s3Service.GetContentTypeFromBase64(base64); + + var validContentType = documentType.AllowedContentType.Split(',').ToList(); + if (!validContentType.Contains(fileType)) + { + return BadRequest(ApiResponse.ErrorResponse("Unsupported file type.", + $"Unsupported file type. {fileType}", 400)); + } + + string? fileName = null; + string? objectKey = null; + if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity) + { + fileName = _s3Service.GenerateFileName(fileType, tenantId, "EmployeeDocuments"); + objectKey = $"tenant-{tenantId}/Employee/{model.EntityId}/EmployeeDocuments/{fileName}"; + } + else if (documentType.DocumentCategory!.EntityTypeId == ProjectEntity) + { + fileName = _s3Service.GenerateFileName(fileType, tenantId, "ProjectDocuments"); + objectKey = $"tenant-{tenantId}/project-{model.EntityId}/ProjectDocuments/{fileName}"; + } + if (!string.IsNullOrWhiteSpace(objectKey) && !string.IsNullOrWhiteSpace(fileName)) + { + + _ = Task.Run(async () => + { + var _s3UploadService = scope.ServiceProvider.GetRequiredService(); + var _threadLogger = scope.ServiceProvider.GetRequiredService(); + + await _s3UploadService.UploadFileAsync(base64, fileType, objectKey!); + + _threadLogger.LogInfo("File stored successfully {ObjectKey}", objectKey!); + }); + + Document document = new Document + { + BatchId = batchId, + UploadedById = loggedInEmployee.Id, + FileName = model.Attachment.FileName ?? fileName, + ContentType = model.Attachment.ContentType, + S3Key = objectKey, + FileSize = model.Attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + _context.Documents.Add(document); + + documentDetails.DocumentDataId = document.Id; + } + + + + _context.DocumentAttachments.Add(documentDetails); + + if (model.Tags != null && model.Tags.Any()) + { + var names = model.Tags.Select(t => t.Name).ToList(); + var existingTags = await _context.DocumentTagMasters.Where(t => names.Contains(t.Name) && t.TenantId == tenantId).ToListAsync(); + List attachmentTagMappings = new List(); + foreach (var tag in model.Tags) + { + var existingTag = existingTags.FirstOrDefault(t => t.Name == tag.Name); + if (existingTag != null && tag.IsActive) + { + AttachmentTagMapping attachmentTagMapping = new AttachmentTagMapping + { + DocumentTagId = existingTag.Id, + AttachmentId = documentDetails.Id, + TenantId = tenantId + }; + attachmentTagMappings.Add(attachmentTagMapping); + } + else if (existingTag == null && tag.IsActive) + { + var newTag = new DocumentTagMaster + { + Id = Guid.NewGuid(), + Name = tag.Name, + Description = tag.Name, + TenantId = tenantId + }; + _context.DocumentTagMasters.Add(newTag); + AttachmentTagMapping attachmentTagMapping = new AttachmentTagMapping + { + DocumentTagId = newTag.Id, + AttachmentId = documentDetails.Id, + TenantId = tenantId + }; + attachmentTagMappings.Add(attachmentTagMapping); + } + } + _context.AttachmentTagMappings.AddRange(attachmentTagMappings); + } + + await _context.SaveChangesAsync(); + var response = _mapper.Map(documentDetails); + return Ok(ApiResponse.SuccessResponse(response, "Document Added Successfully", 200)); + } + + /// + /// Uploads a document attachment for an Employee or Project. + /// Validates permissions, document type, entity existence, tags, and uploads to S3. + /// + [HttpPost("upload")] + public async Task UploadDocument([FromBody] DocumentAttachmentDto model) + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + + var logger = scope.ServiceProvider.GetRequiredService(); + logger.LogInfo("Document upload initiated for EntityId: {EntityId}, DocumentTypeId: {DocumentTypeId}", model.EntityId, model.DocumentTypeId); + + try + { + // Get logged in user + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Permission check + var permissionService = scope.ServiceProvider.GetRequiredService(); + var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); + + if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId) + { + logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); + } + + // Validate Document Type + var documentType = await dbContext.DocumentTypeMasters + .Include(dt => dt.DocumentCategory) + .FirstOrDefaultAsync(dt => dt.Id == model.DocumentTypeId && dt.TenantId == tenantId && dt.DocumentCategory != null); + + if (documentType == null) + { + logger.LogWarning("DocumentTypeId {DocumentTypeId} not found for Tenant {TenantId}", model.DocumentTypeId, tenantId); + return NotFound(ApiResponse.ErrorResponse("Document Type not found", "Document Type not found in database", 404)); + } + + // Document ID validation + if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) + { + logger.LogWarning("Mandatory DocumentId missing for DocumentTypeId: {DocumentTypeId}", documentType.Id); + return BadRequest(ApiResponse.ErrorResponse("Document ID missing", "User must provide the document ID for this document", 400)); + } + + if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId)) + { + if (!Regex.IsMatch(model.DocumentId, documentType.RegexExpression ?? "")) + { + logger.LogWarning("Invalid DocumentId format for DocumentTypeId: {DocumentTypeId}, Provided: {DocumentId}", documentType.Id, model.DocumentId); + return BadRequest(ApiResponse.ErrorResponse("Invalid Document ID", "Provided document ID is not valid", 400)); + } + } + + // Verify if Employee/Project exists + var entityType = documentType.DocumentCategory!.EntityTypeId; + + bool entityExists = false; + if (entityType.Equals(EmployeeEntity)) + { + entityExists = await dbContext.Employees.AnyAsync(e => e.Id == model.EntityId && e.TenantId == tenantId); + } + else if (entityType.Equals(ProjectEntity)) + { + entityExists = await dbContext.Projects.AnyAsync(p => p.Id == model.EntityId && p.TenantId == tenantId); + } + + if (!entityExists) + { + logger.LogWarning("Entity not found. EntityType: {EntityType}, EntityId: {EntityId}", entityType, model.EntityId); + return NotFound(ApiResponse.ErrorResponse($"{(entityType == EmployeeEntity ? "Employee" : "Project")} Not Found", "Entity not found in database", 404)); + } + + // Map DTO to DB entity + var attachment = _mapper.Map(model); + attachment.UploadedAt = DateTime.UtcNow; + attachment.UploadedById = loggedInEmployee.Id; + attachment.TenantId = tenantId; + + // Validate Attachment + if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) + { + logger.LogWarning("File size {FileSize} exceeded max allowed {MaxSize}MB", model.Attachment.FileSize, documentType.MaxSizeAllowedInMB); + return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", $"Max allowed {documentType.MaxSizeAllowedInMB} MB.", 400)); + } + + string base64 = model.Attachment.Base64Data?.Split(',').LastOrDefault() ?? ""; + if (string.IsNullOrWhiteSpace(base64)) + { + logger.LogWarning("Missing Base64 data for attachment."); + return BadRequest(ApiResponse.ErrorResponse("Base64 data missing", "File data required", 400)); + } + + var s3Service = scope.ServiceProvider.GetRequiredService(); + var fileType = s3Service.GetContentTypeFromBase64(base64); + + var validContentTypes = documentType.AllowedContentType.Split(',').ToList(); + if (!validContentTypes.Contains(fileType)) + { + logger.LogWarning("Unsupported file type {FileType} for DocumentType {DocumentTypeId}", fileType, documentType.Id); + return BadRequest(ApiResponse.ErrorResponse("Unsupported file type", $"Unsupported file type: {fileType}", 400)); + } + + // Generate S3 ObjectKey/FileName + string folderName = entityType == EmployeeEntity ? "EmployeeDocuments" : "ProjectDocuments"; + string fileName = s3Service.GenerateFileName(fileType, tenantId, folderName); + string objectKey = entityType == EmployeeEntity + ? $"tenant-{tenantId}/Employee/{model.EntityId}/{folderName}/{fileName}" + : $"tenant-{tenantId}/project-{model.EntityId}/{folderName}/{fileName}"; + + // Fire-and-forget upload + _ = Task.Run(async () => + { + try + { + await s3Service.UploadFileAsync(base64, fileType, objectKey); + logger.LogInfo("File uploaded successfully to S3: {ObjectKey}", objectKey); + } + catch (Exception ex) + { + logger.LogError(ex, "S3 upload failed for {ObjectKey}.", objectKey); + } + }); + + // Create Document record + var document = new Document + { + BatchId = Guid.NewGuid(), + UploadedById = loggedInEmployee.Id, + FileName = model.Attachment.FileName ?? fileName, + ContentType = model.Attachment.ContentType ?? fileType, + S3Key = objectKey, + FileSize = model.Attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + + dbContext.Documents.Add(document); + + attachment.DocumentDataId = document.Id; + + dbContext.DocumentAttachments.Add(attachment); + + // Process Tags + if (model.Tags?.Any() == true) + { + var names = model.Tags.Select(t => t.Name).ToList(); + var existingTags = await dbContext.DocumentTagMasters + .Where(t => names.Contains(t.Name) && t.TenantId == tenantId) + .ToListAsync(); + + var attachmentTagMappings = new List(); + + foreach (var tag in model.Tags.Where(t => t.IsActive)) + { + var existingTag = existingTags.FirstOrDefault(t => t.Name == tag.Name); + var tagEntity = existingTag ?? new DocumentTagMaster + { + Id = Guid.NewGuid(), + Name = tag.Name, + Description = tag.Name, + TenantId = tenantId + }; + + if (existingTag == null) + { + dbContext.DocumentTagMasters.Add(tagEntity); + } + + attachmentTagMappings.Add(new AttachmentTagMapping + { + DocumentTagId = tagEntity.Id, + AttachmentId = attachment.Id, + TenantId = tenantId + }); + } + + dbContext.AttachmentTagMappings.AddRange(attachmentTagMappings); + } + + + await dbContext.SaveChangesAsync(); + + logger.LogInfo("Document uploaded successfully. AttachmentId: {AttachmentId}, DocumentId: {DocumentId}", attachment.Id, document.Id); + + var response = _mapper.Map(attachment); + return Ok(ApiResponse.SuccessResponse(response, "Document added successfully", 200)); + } + catch (Exception ex) + { + logger.LogError(ex, "Unexpected error during document upload."); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while uploading the document", 500)); + } + } + + + // PUT api//5 + [HttpPut("{id}")] + public async Task Put(int id, [FromBody] string value) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + } + + // DELETE api//5 + [HttpDelete("{id}")] + public async Task Delete(int id) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + } + + /// + /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). + /// + /// The JSON filter string from the request. + /// An object or null if deserialization fails. + + private DocumentFilter? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + DocumentFilter? documentFilter = null; + + try + { + // First, try to deserialize directly. This is the expected case (e.g., from a web client). + documentFilter = JsonSerializer.Deserialize(filter, options); + } + catch (JsonException ex) + { + _logger.LogError(ex, "[{MethodName}] Failed to directly deserialize filter. Attempting to unescape and re-parse. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + + // If direct deserialization fails, it might be an escaped string (common with tools like Postman or some mobile clients). + try + { + // Unescape the string first, then deserialize the result. + string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; + if (!string.IsNullOrWhiteSpace(unescapedJsonString)) + { + documentFilter = JsonSerializer.Deserialize(unescapedJsonString, options); + } + } + catch (JsonException ex1) + { + // If both attempts fail, log the final error and return null. + _logger.LogError(ex1, "[{MethodName}] All attempts to deserialize the filter failed. Filter will be ignored. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + return null; + } + } + return documentFilter; + } + } +} diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index fb55f03..4b05f39 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -309,7 +309,7 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => Guid.Parse(src.DocumentId))); CreateMap(); - CreateMap(); + CreateMap(); CreateMap(); CreateMap(); -- 2.43.0 From 08232ee34f16fcdcf523eb8cf0352ccb32c2a95c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 15:13:44 +0530 Subject: [PATCH 18/63] Added uploaded by in response of upload document API --- Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs | 3 +-- Marco.Pms.Services/Controllers/DocumentController.cs | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs index 369e962..1486428 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentTypeVM.cs @@ -6,8 +6,7 @@ public string Name { get; set; } = string.Empty; public string? RegexExpression { get; set; } public string AllowedContentType { get; set; } = string.Empty; - public int MaxFilesAllowed { get; set; } - public double MaxSizeAllowedInKB { get; set; } + public double MaxSizeAllowedInMB { get; set; } public bool IsValidationRequired { get; set; } public bool IsMandatory { get; set; } public bool IsSystem { get; set; } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 15cf745..57604f9 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -5,6 +5,7 @@ using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Filters; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; @@ -485,6 +486,7 @@ namespace Marco.Pms.Services.Controllers logger.LogInfo("Document uploaded successfully. AttachmentId: {AttachmentId}, DocumentId: {DocumentId}", attachment.Id, document.Id); var response = _mapper.Map(attachment); + response.UploadedBy = _mapper.Map(loggedInEmployee); return Ok(ApiResponse.SuccessResponse(response, "Document added successfully", 200)); } catch (Exception ex) -- 2.43.0 From cf2b07ee77583d800df8b38794b90c3def9857d2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 28 Aug 2025 17:20:09 +0530 Subject: [PATCH 19/63] Added the list document API --- ...n_Field_In_Document_Attachment.Designer.cs | 5447 +++++++++++++++++ ...entVersion_Field_In_Document_Attachment.cs | 212 + ...dAt_And_VerifiedAt_To_Nullable.Designer.cs | 5447 +++++++++++++++++ ...ed_UpdatedAt_And_VerifiedAt_To_Nullable.cs | 237 + .../ApplicationDbContextModelSnapshot.cs | 33 +- .../DocumentManager/DocumentAttachment.cs | 5 +- .../DocumentManager/DocumentAttachmentDto.cs | 2 +- Marco.Pms.Model/Filters/DocumentFilter.cs | 3 +- .../DocumentManager/DocumentListVM.cs | 6 +- .../Controllers/DocumentController.cs | 407 +- 10 files changed, 11548 insertions(+), 251 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.Designer.cs new file mode 100644 index 0000000..196d46b --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.Designer.cs @@ -0,0 +1,5447 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment")] + partial class Added_IsCurrentVersion_Field_In_Document_Attachment + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1217), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1227), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1275), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1284), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1289), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1293), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1297), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1300), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1305), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1308), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1384), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1388), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1391), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1U94Htf+1fs26iz6Uc+nyze85xsKznbPXcb1FczE1lvJpWVizl5sZ3KW8udukL1caVmMo2Ltm75rGdKMW9XeLnS3R/ITxW/O3n3q0i+THrYfPTFFvxMXvEz2vMdp8sxE+WYt8pTy9nf3d/jx7R/R1evuk6cBxXS2fZy6ujuc1yEa+xvZMExGXJr6tq0m+vS/mx/HjJNZy0yU7RNJYVZ3vIfahZ9X0Hp31DzfHn0/EjTF8/g8+dbd8ef8377pd/aL6Wr+I47kL/nx5Pt/bxz9z9tJjV9zJ4+ZO31V1j0frd/n5JnP2/a3ad/+n63D833lnoFZ9X0HoZzbN8fqa3OSWMTz/lcbu+HEv7SHAx38nB7t/td9mtO/7etPZ2LV9yr4s5O31V4pdMa3f5+Thcux2/a5rH3/APc4fne83dNLPq+g9r3Kc3x58fE6lYWJ6vwfquE3vHn9/wCr/RxL+0txte/k6Y2r/a78lSv+HRn/AAuxavuRetsnb6q8c+B1u/z8nRW1sdv2up8ff9v/AJXD9h7zvp7lPGs7StvjVpStPVldWMDJpKvmviXphwWxWlPHj5ea18/f+84WT2mMUx/S+lMtZ/4XK47fr9o0Y/a7y7Fqe4/5Gk9932gePzxMxPbB0BtYJiPTvHe3VWXvPfv69v1vpcOyPeauQSlWuN21WLUPP6GN3nNm7WlPn4pWseN2/Nfq+9T/AOPFt7SmeZny9N1iPo770T/g14djw+5I4itYjP415clvpmnS2THE/nRPNX7fty+dc95l5pXz8Lt110Pwevl0Jfz+NHH97734f3vHqn2k936Onsfb7u3H+LA5lPcmdNR/tnjHu2/Q9PWr3/W/BSf8P7b0bnvMHUStP0vt/wBNCv8A53JaT/0amPn/ADPCfaS5CflwGGP+6e//ALJyqe5P6Pjt5/Fzk7fb8vCeXv8Ar/V8/wCD9t6Vz3l3qpX/AAXQfjsP428nP/RgxeE+0jyn0cFr/r55+f61HJp7lLoOPxfitzNv0PFVr+t2nbt/hejc95Y6x18/D6I8Vh+D1bO7P+f/AHvT9/8Azfv+fXPtIcx9HC6sfn5Jn/8ATDlU9yr4cR+L8T+ft+h0cdf/AG0/9PpeKHvK/Wmlf0zopxKVPNflHYXY18fg81tS/n8fyVfn88hzP08Lqf8AhJj/ABS9lvcreGkx9Z4mdQ1n7c6eO0d/zviV/wAL3bfvLfVqn+F6F8Zl+H0bicf9OHL/AOX4avOPaR5aPnwetP7NMf8A6P8Ap9txr+5T8Ppj6zxS5us/R5uNpb9vtsVe9b95f6lU8fF6BaKX4fTyGsf9Otk849pLkvp4HBP/AHR//wA/+Rxb+5Q6Kn8R4s8rX9Fw8W//AG2PT997tv3mPndP8J286qX8XlcY/wCnS1eyPaT3vp6fxT+dtdv/AGMuLf3JvSs9/J4wb9ftebgJt/g5Kr3rfvM/KqePiduGHP8AD6eaW4fw+PPH5POPaU2o+fTtJ/7siP2v9T/9PuOLf3JfAz+I8Ztmv6Lpq9v/APbw5Fge843LXj80u1nIyqU/VfRupWLi+f4PXw+/6fw/f/hcjH7S0x/tnS9rfb8vJUr/AIdOz5G37kSl+/1F47Ytf7Xx+i8+ft+f5eosPf8Ae7/cc0wveduEXfFM3tM5HiePFKyt9WcDJpX5U8ypGPArdaU8+fFK1rXx99zKe0xpT/tnSmxX7sctjt+99Qf43Wtn3IHU2PvOr7QHDbHzmK38P9vDMevpE2nqy8T6fOe0fnOYYPvMXRe94+n9vPMcLz+q+HzTFy/H+TxO15cyntJ8Nb8X0/uU/O3a3/wakOu7XuTvErH3+pfGDpza+15+mc+v3/b6gydv+Vy/B95M7Zr3j6d0n59hefr+HnQy/T+H9TprXn+ann6/k5lPaN6an8XxW/T7fa8X/wDYw65te5d8bcff6l6/6S2vtefUvr9/X7vJZO3o5jg+8b9md70/TuK9TMLz+q+HqJ5Vafh8emxa8uXT2iOj57efV5Kn2+2Gbfv9o/wOu7XubfaRx9/qXn+idn7Xn5CNfv8An98uTs5hg+8Q9gV6sfp1zqzhUr49Xw+BZOX6fw+PGZZ8+P5PLmU9oPoK34ueVp+doWv/AILQ67te589rTH3+paeH+z2+Xn6sw6/f8+Z18nbv+d9LuDi3tz/Z3cq+H6OqW50HxPH/ANlPHo6P0ea//hK5GylSH4a+fq+++vq+N/h7tdu3KZtfv/bWv8Dt+f5sk9mO+e91v7YXA+fzdC8by3k/KHmJ5TzfoPg6dfN+t9LJfiftMewzmdLUNN3TdHfpd6tKW9dmcz0+Nsa1lTzTziSypTp+D+GlaOyaviT0Ludvg9UcP55+WO+5hrk9f+B5pn/3+jCnP+xN7VvTc5Lcl4E+I31PjiZvua3TfI59OIifX/VFcEUn7f53aWUvDOrXTLqJa+PwXnfGOV2fT6viaPb4mfH0+PV582bkvl4+fn8DtGny3GcjXzaO9q7dft4MtMkfvSwT1J0B1t0ff4XVPS3OcBk79vJynH7Gpbv37du2Wkevf07OwYyjL5xlGVPwxrSv+ir6HeJ+U93UZiY+cTH58TH+F/Q/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5WtI081rSlKfXWtaUp/PUfsRM/KJn871df836sdNOmuLHN5/znjPEMSUayjkb7bYuvtVjTz5rSd+5Gninita/vUrV8/d5XjeNr59/e1tSk+vmz5aY4/btMO29MdA9a9aZ51uk+lub6h2KzFZw8Tx+fcyRMz2iJripae8zPZiBzP2pXYHwf4sNn3P9KthlWPNL2v0XKtTtdhblGvj0TxbWXCcZV+9Gvzq6jueKHQel5oydTcXkvX0tjwbWHLkiftTWLxPdIjpv2FPaz6n+HbS8DuvdTBl7Tj2+V4HkNDUvE/11c+TXtWax9M/Jj1uvbq+zt0vr9XUzkG09Hn/6l41TZerx5/UfC2UfV58fLx9f8rr+fxx8PcHfvyWxl7f7jrfE7/ndsjL/ABnusvbC5Py9uieI0fN2/HPm/qPy9+34rz6U9u3f1/Ol1lne8N+z3x6yjh7Dq1m1jWtPNenWVjwlWlfH6GVdhc80r96vjxWnir5t/aB8P69/Jk5a/b/sfasT+v8AEn9t3bV90D7XmWKzsanh9rRaIn+rHBmtET6+tY1Kdpj6Y7+k94/P49T3ivsX+N6K6/qnSz//ABv7kr1Zf/6vXSv/AO395x/54Xofzdpx8p5f7L6ln/B37vsT7nb2pPh+aNvoScn+5/hgx9v/AO/ydv3nJMD3hj2euTWMcvZ9WcGU60p8+nOVetxrX/p3KbG3SMafP9F4/k+fy5OP2gfD+3aL5OWxzP8A2OtaP15+JH+B8Tb90F7XuCJtr6Xh/tVr6+nWODHeY/4NJ07zM/c7uztL7dH2du69Hp6obvWevx/9dccprfT5+/P4uyr6fH3/AD86fgfSw+OHh7m7duTz4u/+7a/w/wBvvk9HSeS91r7YXGebzdD8XveXv+NvMzu+bt/Y/D04833O3zZEcM9qH2D85pahqe6DpRiZd/00ta7c8r1Ot2Nysv8AmxxLmXO5WVPqrT71XYdLxO6D3u0YupuKpe3yx5trFiyT+dSbzP8A72HupPYZ9rHpf4lt/wADevtjXxd5ybnG8ByG7p0iP662xTXrWK/amWXvC+qHTrqNiVz+Cc045yzCpGkq5Wi2mLsLNI1rSlJfEsTlHxWtaU8+frrR23S5TjuRp8TQ3dbbp/ZYMtckft1lHjqXobrHo3YjU6r6a5np/ZmZrGDldDPqZZtHrMeXLSs9/RzulaV+dK0rT8NK0r/oc91aYmPnEx+f6P0fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvn9uZ+yG9XPnX/B6D7/AP8AaHWfV+BAPxu+yBy37B/AYm3P7rj8iB4ffo+W++280/sRrEQAAAAAAAAAAAAAAAAAAAH927ly1L1Wrk7cqfVK3OUJU/ljWlf879iZie8TMT9uJ7T+3DxvSl48t6VvWfnW9YtE/rTEw5BreYcs0961kavk2+196zONy1PE22dZrCca+YypSF+kfNK/hpWj349zbw2i2LZz47RMTE0y3r6x8p9Ldv23ydzp3gORxZMO/wAJxW3jy1mmSmxx+rli1bfOJm+KZ9e8/KYllz0x9o73s9IJ2I8H7h+oGuwLVY0nqb+zpl6zJhD9TaybNy3S7O3StKV8Rvwr5p59TtvGeInWnETX6h6g38dI7d8VsvnxWiPlFqzHeY/OtH56PfXHsa+zL4h1y26o8H+kdzayeaa8hi0fqfdw2t874cuO3w63nvMd7YrR2mfRs66I+8V92HCb2LidXOK8J6o6SxKFLlcHEy+N8iyLdPHrpe3ORnbrGrcl8/E6aylI18foK+GS+F9obqvStWnLaulymCvbv8Ol9bYtH3c1r5qzPz9fhoQeJ3udfALqbHn2PD7nup+heUzRby/VWxr81w2G09/L8PjcWrxuaK1+ms7szMR+Kj6N13bp7fzs16wzw9V1HubboXyPKrbhK3ynJsZ3GLNZeI1le5VPH0+Lb/RefMZYnyp4+dfLM/T3j10fy/kxcjOXg9i0xExtWrfWjv6d52prhrHr/wAD0VneMfulvaP8Oq7O/wBGV4/xT4bBFrVvwODLq85kiO8xGPga5eRz3nt29Y2PWe/aPRug4J1G4J1P0GJyrp5y3Q8y45nRpPD3PHtjj7LX5EZU80raycec7c/NPn8qsyaPI6PJ69Nrj9vBua+SO9M2vkrkx2+n0tWZifRWx1V0d1V0Py2xwPWHAcr05zOraa7HG8vp5dLbw2ie0xfDmrW1e0+nrDmjmutAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBdQuqPTvpPoMjlPUrmfHeE8dxKVrkbjkezxtZg2vEay8SyMmcIUrWlK1pStfn4cDkOU47ide21yW5r6WvT8Vm2MtcVI9O/rNpj6Ha+kOhusOv+Ww8D0V03zHU/MbExGHjuG0c+9tZO8xWJriw0taY7zHeYj0ai+tvt7OxTpX9MweK8k3XVveY9blMe1w3Et3+P5dbfmlPTyWzPOx7cbkqUpCX0WfmNfV48U8VxLzXjv0Pxfnpq7Gbls9e8Vrp0ide3b/AOc1nJWIn6PrZ+2sJ8MvdRe1P159T7XPcNxnh9xeXyTlydSbF8XL68X7T68Jkrq57zWJnzR9UV7Wjy9+/rGnzrb7yb1u5BPLx+hXSTifAMadZ2bGVzTIv81yq2/NY0yIfQKcXpZuTjT4kISjP4UpUjKtz0+ZYj5r2jeb2JvXg+J1OPrPeItu2tu37fLzR8P6l8s9vWI9e3ftMz27rEvDH3LvhhxFNfN4qeIPUHV2evlyZMHTOHF0zr+ftFpw3+q552ctKz9Za1Zp8SImYivmiI1WdVvas9+XV+eTa5H3Acs1epyqzrd49xm/XU6Snr80/QYtyWZfjSMa1hD/AH1XxGtafOvzYu5TxT665ebRsc/t4sVu/fX1p+Fh9f8Agz57fL0j675J49BewX7Kfh3XDfhvCTp/e38EVinL83ijkOTny9vxWesa+KfNMRa39IjvaIn0+TBre885rybMv5/IOV8h2+Zkzrcv3s7bZt+V2dfrlKMr3o81/ejSjo+fe3dm9r7G1sZr2nva2TLe3ef17dv3ko+L6V6a4TXxanEcDxHH6+CsUxYtXj9bFFKx8oia4/NPb6O9plxWc53JVlOUpyr9cpyrKVf4a1rWtf5auLMzPrM95+3L7ta1rEVrWK1j5RWIiI/OiO0Q/kfoAAAD+oXJ25UnbnO3Kn1ShKsZU/grGtK0/nImY9YntP24flq1vE1vWtqz862iLRP58T3iXLdB1A5xxbMx9hx3l3ItPmYs6XMe/g7fNsytTjXzSsYxveiviv3qxrT95y8G/u6t65Nfb2MN6T3rOPNevafzot2/edf5XpLpfnNbLp8x0/w/I62es1y4trj9XLF6z84m04/NHf7cWifus5OlftW+/TpHcx4ce7gOWbXV43p+HoeT367bSypGtPFLmNblh35fKlaf+M0+Uq/h807vxfin11xM1jX5/by4q9u2DZn4uGe3y71jyW+5+K+lF3rv2CfZS8QqZrcv4ScBob2fzefluDxRoclHm795rmvXZxVnv69/gT6xH5zab0P95L658fu4eP146T8Q6gYVuUbN/J4TdyOE5lbFP0Eb1yWfLlMb1+EfE7tYwt0vzpKtKW/VSkcocJ7RvOa80rzvFanIUjtFraU20r+Xv280/E+qotaI9Z9I809/SEE/E/3L3hby+PZy+FXX3UPSOzeLZMWHqfHi6n1oyz9dOKkakcFbHitbvXH3tecdfL3m/aZnc70G9uv2K9Y6YWByLmOb0h5BkVt28jE57bs6/SWL12tKRt2eRZFzDsZVPVWkfXTEtfOvj0sx8F449D8x5MexuX4nYt2i1N+K48FbT8orsWmlb/a7xSPX6IVteKvusfan8OZ2dvh+ndXxD4jDF74djpO+Xb5PLjpEzN8nDYa7ObBPaJntOxf09e7bjw7nPD+oWiwuT8H5LpuV8e2Nul3B3Gjz7Gw1+XalSlaXLGRYnO3chWlaeJRrWlfLLOnvafIYKbOjs4drXyR5qZsGSuTHaJ+mLVmYmFfPUfS/UXSHK7PB9UcLyPA8xp3nHt8bymrl1NvXvE9pplw5a1vS0T84mHKnKfBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q99X6jQf+4NX9f7/wDR4QD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAAAAAAAAAA+r6gd5dHu5brx0C3djkHSHqjy3hGyszty9ep2d6Nm7C3Wla2LuPerds1sXI0rbuQhGFZW5SjSUa180+3xHUnO8DnrscRye3pZKzE98WWYiYiYnyzWe8eWe3aYiI7x9LF3iL4K+FXizxmXiPEPobp/qfSy1vXy8ho47ZaWtExGXHmxxTJGWkz56Wta0VvETNZjvEyWOyX3iWlu1q+Ed5PHqzn6rGHa6ocPxrtKUjKsbNq5vNBell3L06zrS5m7OO0xrNuEp3vo1I26xrJDov2hO0YtLrDX7/AImkcnqVn6e0RObBPnmZ7+t8kZaxET38sRClb2m/c8ze+91P7OHMRWO2XZydC9RZqTMzHfJkpxfLY416Y6+XvTV0baObJa1a44zzN4mJPfSHrZ0s688Qwed9JObaHnPF8+EJWtnodhj59m1dlCkp4uTXHuXI2cqxWtbd+xKVZWrkZQl86JM8RzXF87p03uJ3cG9q5IiYy4MlckRMx61t5ZmItX5Wjv6TEwo88Q/DPrvwp6i2ulfEHpjluluc1LWi+jy2nm1MmTHFprXPhjNSk5dfLHa+LLERF6TW0eku031HRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEvdN7QrtX7QMLI+6/1J1WJyWGPS/icG1F/G2XMM6Ny3SdmdjSRyLeVXHn6oevIpCUbcZ0nWNafKvSuqPEDpbpGlvwX5LFTZivmro4bVybl4mO8TXDFov5Z7x9d2nt37+qTXgT7IXjv7RGzh/md9F72xwts3wc/VPI4s2l05q2rea5K5eTtitg+LTy37YZtWb2rNYtE+sRku7j3iXrLz6Wfxrtg4ridKuO3fi4suV727d3fLMqzTzSGdqp2I6azo7860jP4WRj7L4cJStVlKtfXSNXVntCcxvzfW6Z1acVrz3rO3nmc23aPovi8sYYwzPaJ7Wrk7RMx6z6xd17PvuefDfpOupzXjjz2x17zFIpnjgOLpTjOn8OSe021d+uWeSycpipE2r58ObS89oreIiPrWg7qn3Adaetu6v8AIeq3UvlnN9tkVnW7lbra373q9dfNafBt1tWPH3qUrbrXx9+vzYI5TnuZ5rNbY5XktvdzW7+a+bLM9+/z9I7V7frLYOhPCXw18MuNxcR0F0V0/wBL8fhisY9fjNDFj8vljtE/Ev8AEy9/tz53T75DIgAAAAAAAAAAAABStaVpWla0rSvmlafKtK0+qtK/erQPn82QfRXur7he3jcWt30f6rct4ZlwuQncta/Z3pYeTCHj9IyMa9W5CVidKemcLfw61j8qSo+/wvVPUHT2aM/Ecrt6V4mJmMeW3ktEf1tq27x2nt2mI7fnsReJngN4Q+MHHX4zxF6C6f6l17VtWl9zRxxsYbW7/wBNxZ8cUvGWsz3ra/niJ+cSkC9qHvHHO+O0weO91fAcPmWBT4WNXm3CZXdNs8OxCtI1y9hqMmO7nusqVuP6ZSxl6+ly7KU6UjTxGmfelfaJ3tfya/VOhTcx+lfq3SmcOWlY/r8mG3xpzW7R6+W2PvMzPp8lSHj57mvpXmJ2uY8Berdnpvbnz5o6Z6nrj5LS2ctomfqfT5HBbjK8bgi8/WTl19yaUiKzNpjzTJI7Ye/ftd7vMCF/ov1L1W33NMeOTl8Q2N7H1/Ltfbl6aVlnaOuReyrEYynGFZT8U8yj8qeqiRnTPXnTHVuOLcNyWLLm8vmvqZJrj28cekd8mDzWtWImYjvP24Uw+OPsn+Ofs87dsXiV0Vv8fxs5rYdfqLSx5tzp3cvHm7V1eVjDjwZbTWs2ite/pFp7zEd2ZDuCOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdXv4mg8f/cDV/0oB+N32QOW/YP4DE26Pdc/kP8Aw8/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAAAAAAAAAAAADI3t27sevPaxzDC5n0Y59t+MZ+NdtyyddTIv3tLtseE6SuYOz19L1qN/EyI0rbvQtXLFyUJSpG7GtfNOxdPdVc70vt03OG382resxNscWtODLWJ7zTLj7xE0t8rRWazMT82G/GLwC8KvHfp3Z6a8Suk+P5zUzY71wbk4cWPk9DLas1ptaO58O9sWxhntfFbJTLStqxM0mPRMv9nh7bno73SfmF0y6zVwOlPWi/GxgY9zNzrVri3M9hOkYwrpr2RGxXX5uVcr8KzqJ39hfncpSUcivxaQjMPw+8auI6n+BxnMzj4vmbRXHWb3iNXcyT6R8G1or8O9p9K4ptktM+vm9Yhre+2B7sbxG8CvwU638N/qvr7w1xWy7eamtqZMnPdNalZm1o5LHhtljb1cGOPiZOQri1MVaTMTij4czO9uMoyjSUa0lGVKVjKlaVpWlfnStK0+VaVp9VWc/n8lV0xNZmtomJiZiYn0mJie0xMfRMT6S/R+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQO6zvo7b+zfj/5sdaee6/UbTJxrl/TcRw71jK5VvKwjWsaa7UfGt5N61WfiNy/CM42o+qdYypGtK9R6p646c6P1/jczv48WW1Zth1KWrbaz9v8Ac8Pmi1o7+k2iJ8sevaUiPAX2W/Gb2j+X/A7w06V2+Q0cOamLkuodnHlwcDxcWmPNO5yHw7YceSK95pitas5LdqRaJtEolnez7fLr/wBcMnZ8S7eLd7oj07u0u4ktlYyZ53ONtYpStmt+u2jDAxtfi51v1Xbmvlq792zS5G19LlW3Wc4o9aePHP8AN2y6nT8TwnHT3p8WtvPvZax6Tb4valcdMkd5nHOKZrExXzT2mZ2AfZl9074SeF+HR6g8X8mPxP6xx/D2I0suCur0vx+XvGSMUcfa+3m28+rfy0ptxvYseSaTk+BWLxWuhTkHJN/yrZ5W55LudlvNrm372TlZ+zy72Xk3r+RcldvXJXL05VpW5cnKVaR9MaVr4pSlKUpTBOxs59rLfNs5smfLe02vky3te1rWnvaZm0z859fT0WucTw3E8Do4ON4XjtPi9DVxY8GDU0dfHr4ceLFSMeOkUx1rExWlYrE2729PWZnvL4j0vpgAAAAAAAAAAAAAAAAAOR8W5fynhG5wuQ8Q3+145u9dkW8rC2WpzL2Hk4+Rar5t3IytSpSVY1+dKTjKP4aVcjV29rSzU2NTPl182O0XpkxXmlq2j5T3ifXt93u+NzvT3B9T8btcP1DxOhzPGbuG+Da0uQ18exgzYskdr0tW8TMRaPSZrNZ+1KQt2N+8BdYOlWVrOFd02Nf6s8GpSxhWuYY8543NdLajWMfpmfdnHOs721at0lCmJZxdbPxWE/pFfh1jKQHRHj3y/FWx6XVFbcto9q0rt1nybuGPpvkmYvXPER6RStcX0T5vT1qF9qH3SXh117g3upvAnPi8P+qe+XZv05mrXP0zyd581vqbUx1nVycVkveYvOxlz7tfS1fhfXxNZa/bn3V9Cu6zh1rm3RHnmp5frKQs12GHjZOP+bGjv34euOHu9dbvXruuzI+JRnYvVpOMoTpWnySv6d6p4PqnTjd4Tew7eLtX4lK2r8bBa0d/JmxxaZx3j1ia29YmJa/XjJ4DeKfgJ1HfpjxP6V5Dp7em2T6j2c2HN+B3KYsVvLbZ4zdvix49zWnvWa5cceWYtWfphkQ7Cw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V7+JoP/AHBq/wCf/vRAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsYuVk4OTZzMPIvYuVjXIXsfIx7k7V6zdtypKFy3chWM4TjKlKxlGtK0rR5UvbHat6Wml6zFq2rMxasx8piY9YmHqz4MG1hy6+zix58GalseXDmpXJjyY7xNbUvS0TW1bRMxMTExMJK/stvbgci6WZem6Jd2+9zOSdO7tcbU8X6jZU5T2/EfVKFnEs767crO3m6SzXxYlfpXBrgY06ZN25kRxpxuSQ8MPGzY4u+HherM99njp8uLW5G0zObUmZitIzzPeMmCvpWZ/pfw6z55m3lmJpW9ur3YPD9ea/JeJ3s+cXrcL1jj+PyPO9G4KxTjuovLW2TYycVSkVvq8pkjvljF22o281fgY6YpzVmkxzjHJ9BzPQanlPFtthbzj+9wcfZanba6/bycLPwcq3G7YyMe/alKFy3chKkoyjWtK/eql/rbODc18O1q5aZ9fPjrlw5cdotTJS0d62raPSYmPpa5XN8Jy3TfLchwXO6GzxfL8VtZtLkOP3MV8GzqbWC848uHNiyRW9L0tWYmLREvuve+UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9DabTXaTW5242+bja7V6zFv52wz8y7Cxi4eJjW5XcjJyL060has2bcZTuTlWkYxjWta0pR68uXHgx3zZr1x4sVbXyZLzFaUpWO9rWtPpERHrMz8nL0dHc5Pd1eO4/Wzbu9u58Wrqamvjtlz7OxmvGPFhw46xNr5Ml7RWlaxMzMxEIw/tF/b56LhU910n7N7uu5NyS1LI1246sZUvpmg1l2Hqs37XGsbFuWqZ+VbuUrW1tI7H4NmcKxriXK180jP4h+PGDSnNxXR849nZjzY83LWnz4MUx6WjWrWYjJaJ+WWMnlrMdppPdeB7HPuneU6mpxvX/tHU3OE4XJGHc47oDBH1Ny27S3lyYsnN5s9Mk6mC9O0ZNCdP4uSt4mNikR3mJd1K6qdQusPK9nzbqXy3c8x5PuMm5lZ213OXcyb9y7dlWUvRGVaW7UKefTGNuEaUjSlK+frRS5LlOQ5fay7vJbebc2c1pvky5rzaZmftRPpEfRHaPk2AOiuhOkPDrgdHpjonp/jenOD47DTX1NDjdemDFTHSIiPNaIm+S09u82va095mY7Ov3AdtAAAAAAAAAAAAAAAAAAAAAAd29Ce4rrF22c213PujvNtvxDf6+7GdZYWRcphZ1mk4zuYmwxKThbyMW/6KRuwpW3OUfNI3I+a1fa4PqHmOnN3Hv8Pu5tTYxzE96WnyXr37zTJTvEWpbt2tHpMx8phjLxT8HfDnxo6Z3OkvEbpnj+ouI3KWr5dnDSdnVyTWa02NTYmtrYc+LzTOO0xekT281LR6Jn/s1/bY9Ne6WOm6UddZ6rpv1wu2rOLgZc8qGLxfnWXGNI3I6imVWk9fsp+K3reqll7G9etRyLtLsY2JUlMjw48aON6o+DxXOTi47m5iK47zaKa29aI7T8LzzE48k/ioxefJa0eaYmIhrZe2l7szrTwKnkuvvCyu/wBZ+GFL5M+3r1wWz850tr2tM0nkbYImm3pV9Mdt+uvp48eScWOcczliY32fX9TOyqEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur378NB4/f/4A1dP9NPH8iAfjd9kDlv2D+AxNuj3XP5D/AMPf0XL/AH332oFiNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfV9QN0vswPa39Q+y/ket6f8AUfL2PN+3/aZkbGbpb+RdubLh/wBKn4ntdBfnS/GljGuy+lZOBPHnXIt1yLVvIx63ITt5l8MvFjkOjdnHx/I2ybvAZbxW+G1pnLp+afXLr2nzR5azPmtjmszaPNWLV7xMVq+3H7vro/2lOG3erejdfT6Y8XNHXnLq8liw46aXUcYK966HLYqfCmcubHHwMO3XNWMNvhZL4s3ktW867pR1W4H1t4DxvqZ015Bg8m4dyrX29jqdrgXrV61ctyrK3esXa2p3I28rEyLd7Ey7FZVlYyrF6zL9FCqcXFcro81oa3J8bsU2dPaxxkxZcdotEx8prPaZiL0tE1vXv3raJrPrEtWLr7oLqrwy6s5ronrTiNrhOo+B3L6fIaG3iviyUvWIvjy44vWs319jDfHn18sViuXBkx5K/W2h2K+i6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6c67de+lnbf073PU/q7yrW8U4rprM5yyc/Js2LuflUjWtnXa63duW/pWfky8RsY8K1nOvnxSvjw+PznPcX05x+bk+W2serq4azM2yWiJyW+jHjiZjzZLT6VrHrLI3hX4Udd+M/WHG9DeHvA7nP89yWSta4NXDky49TB37ZNzcvjpf6n1MMd7ZM148tfpn1QcfaT+2G6td42823BOmmbtOm/QGxfli4ugxMm7b3PL7GPP0w2PJcuEcenwcy7CmdY1trFszwYysYt3Kyq2J3bsJfEfxe5bq/Pl0eNvl47ga28tcFLzGbbrWfTJs3iK/W3mPPXFFYmn1tZvfyzM7Q3sXe7r8P/AGcuL4/qrrXW0etPFnLirnz8tsYMd+N6dy5q97afC4LTm/pmvS06uXdvmyV2rVyZ8eDBGWtMelmtayrWUq1rKta1rWta1rWta+a1rWvzrWtfnWtfnWrDPz+ayuIiIiIiIiIiIiI7RER6RERHpERHyh+D9AAAAAAAAAAAAAAAAAAAAAAAAe1g52ZrMzG2Gvyr+FnYd63kYuXjXZ2b+PftSpO3dtXYVpKE4SpStK0r/meVL3x3rkx2tS9Ji1b1mYtW0fKYmPWJh6NrV1t3Xzam3gxbOrs474c+vnpXJizYrxNb48lLRNbVtE9piYSmfZS+29yOOfmD2+93u9u5unnXE0/Buq2bd8XdVGPpx8TT8ru3pSt3cT4fotYez+LhxxqWbWLcs5FzIjcjKDws8a7a3wOA6uzzfDPkw6PK3mInFEdq0w7c2ntNO3pTL3p5e0VtFptFoon9vX3YeHmfwV8XPZ44rHrclH1TyPVXQOtjicfIWt5suxyPAUxxW9Nib98mzo/D2LZpyZM9MmGmKaWlz6zZ6/da7B2+pzcbY6vZ4ljO1+fh3Y38XMw8q1G9jZOPehWsLtm/anC5buRrWM4SpKla0qlliy482OmbDeuTFlpW+PJSYtW9LR3rasx6TW0TExMfOGvhvaW3xu5tcfyGtm097R2MuruamxS2LPrbOC9sebBmx2iLY8uLJW1L0tETW0TEx3h7z2OKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5vbl+f74d1d/iaDx/B+YGs/p8oB+N32QOW/YP4DE26Pdc/kP/AA9/Rcv3/uvv/wCJqAYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANufsufag847GuoGNx3k+Rm8m6C8q2Fq1yvjE79yV3RXMj0WP7otDKXxYY+Rh1jav5WPWxchm4tq/jxlj3L/ANIhlnwx8Td7ojfrr7Nr7PA7WSI29abTNsE27V+qME+sVtTtE3r5Zi9YtWJra3mivj26PYb6X9qPpLNzHCYtbg/FfgdS+TgOcphpFOVx4fNl/AblYjyXy4dmJyY9fNGWk62fJizWrmpinDefH0r6pcG60cC431L6cb/B5Lw/leutbLUbXX37d+zct3PMLti5K1OcbeViZELuJl2KyrKxk2btqX6KFU7+L5TR5nQ1uS47PTZ1NrHGTFlx2i0TE/Os9pmIvS0TS9e/1tqzWfWJannXfQvVPhr1ZzXRPWfE7XCdRcBuZNLkNDbxXxZKXp2tTLSMlazfBsYrY8+vliIrlwZMeSv1todhPoOogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMRu8bvR6MdlPTDN6idWN7Yx8m/bu4/FOLWci1Hd8s3Pw7k7Gt1eNOsrtytaWrt7Iu27N/6Pi2L+RK3KFqVHUusOsuG6L4y/IcrnrW1omupq1tHx9vN2ny48VZ7zPym1pitvLWtrTHaEg/Zz9mvxJ9pjrjW6O6A4rLmw4r483P8AO5cOS3F9P8d56Vy7u/mr5cdPW9MeHHfJi+Nny4sUXrbJVAK75u/vrR3zdSc7lfPtrc1vEMHLybfC+Ba+9ehpuPailycMO3ctyuyjmbKeNSE9hm1hat5OZO/ftYuNCcLNuBnW/XnM9b8lk29/LOPUpe0aWhjtaMOvh7zFImO8+fLNe05L9oi15mYrWO1Y2z/Zc9k3w19lzovV4DpPQpudRbWvhv1N1Xt48duS5jkPJW2xel4pE62lXN5q6erFsl8OtXFiyZ89qTktgq6OlMAAAAAAAAAAAAAAAAAAAAAAAAAAA/YylGVJRrWMo1pKMo1rSUZUr5pWlafOlaV+dK0+dK/Oh8vk/JiJiYmImJiYmJjvExPpMTE+kxMekxPzSTvY4e15y+i+y0vbT3GbzIzume4y7Gt4HzHYZMpXeG5+RdpDH1mxvX5ShPT5NZ1sWJ1lj/AuRxbVZXKy/RSO8H/Fu/DZMPTfUWe2Tjc1649HcyWmZ08lp7VxZJt3icNu/aJmazWYrHefppd9437vTX8StLkvGvwb4vDq9bcdr5d3qvpzTwRFOpNTDjm2be08eKK2ryOGKRly1iuX4tJz5O1IjtE0HEysbOxcfNw79rJxMuzbyMbIszpcs37F6FLlq7anGtYzt3ISpKMqVrStK0rRMil65K1vS0WpesWras94tW0d4mJ+mJie8S1sNjBm1c+bW2cV8Gxr5L4c2HLWaZMWXHaa3x3rPaa3paJras+sTExL2Hk9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvm9uXTx7Q7q7+/DQV/9Qaun9CAfjd9kDlv2D+AxNuj3XP5D/w9+5blvvvvz/jagGI1iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADb77LP2oXNux/qDh8W5ZmZnIugXLNnYs8p49ev3JXOO3cqtvHpyTSTlW5bsXcGVLWRm48rM4ZeJayLEJY929TIt5c8L/E7d6J36au3e+xwO1lrG1rzae+vN+1fqnDM94rNPS16+WfPSLViazaLRXj7dnsNdMe0/0hs89wGvr8N4s8BpZcvA8xjw0inM48HmzTwvKVr8O+am1E5MWtm+LW2vsXw5bVzUxzhvPq6f8+4l1R4ZxzqBwXc4nIOKcq1eNt9LtcK7C9YycTKhSdKVlblOMb1mXqsZFr1VrZv27lqVfVCqeGhv6nKaevv6OamfV2sVc2HLSYmtqWjv84mY81Z71tHf620TWfWGpx1d0n1B0L1JzPSXVPG7HE8/wO9n4/k9DZx3x5cOxgtNZmIvWtrYslfLlw5PLEZMV6ZK+locxcx1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABif3jd4PSnsu6Qbfqn1P2tmxKMLmFxXj0L9u3tOVchnauXMTUay1P1Tu3Kxt3cnIlbtXq2MPGyciVusLUvHVesOr+K6N4jLynJ5Yj0mmrrxaIy7WxMTNcWKJ7zM9om1u0TNaVtbt2iWffZz9nbr32lPETjuhOh9DJlibU2ue5e2K99HgeHrkpTY5DeyV7Vx0i16YMMXvjjLs5sOKLRbJXvXo95neV1Z71urm36m9TNpc+h0ycrH4hxbHuXaari2gpdrHA1+NancnG5lxxYWaZ+ZSkKZeX8e/bs41u7THhX71j1hy3WfLZuS5LLPk81q6mrWZ+Fq68T2x46xMz3v5Ij4l/TzX81orWJ8sbfHs3ezh0B7M/h7x/RHROjX6onDgzdQ87mpSeQ53lvhxO1t58laVmmvOe2T6k1u9vqfX+FivkzXx/FtiK6mkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/qE525wuW5ShOEozhONaxlCca0lGUZU8VpKNaUrStPnStKVoRMxMTEzExPeJj0mJj5TE/RMPy1a3raloi1bRNbVtETW1bR2mJifSYmJmJifSY9Eun2HHtULm9hpuz/r/wAi+PuLdm3g9HeWbPK9N7Mx8O3WkOHZ079a/Sb9jCj6tXehctytYetuWZ2b8p/GhLPwS8UZzxh6R5/Y82aKxTiNvLbta9aR6aeSZ/FWrT1xTExMUxTE1tM92vf70P2EKcXbkfaJ8JOH+Fx18l9rxG6f0cEzj1s2xfvbqTVriiPg4suzMV38dqXjJs7lMlMuKtfh2lWpSqGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfxdB9/wD/ABf1f838H8v30A/G77IHLfsH8BibdHuufyH/AIe/ouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEmP2BntCdj0/6gU7SeqXILt/g/NpZFzplk7HIrS3xvk0YTzb2qjkXpVtw120jZyY42L4hcnts6HouypKNlJPwH8QMmhv8A4U+Uz2tpbs2njLZLemts9pvbF5rT2jHl7WitfSZy5I7T6xWaTvexeyHp9W9Iz7QPQvE0xdU9MRhp1vg08Pe/NcJNq62PfnFjiL23NG2XDOfP3tSuhqzFscTWcsTNUxWtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6m649aeCdvfS3l/VzqPtsfT8U4dqruyz8i/et2K37nrt4+Hg48rtaRrk52bfx8SxGlJVrdvx8QlX9DX5PN8zo9P8AF7fLcjlrh1dPFOTJa0xHmnvFaUr3+dr3tWlY9Z7z8p+Tv/hf4a9VeL3XXTvh70Zx+bkef6k36aWphxY75YxU8t8uxtZa0jvGHV1sWbYyz3iPJit3tWPWK7f2g/fd1C76utO05xyHJyNfwbT5OVr+nfD4XbtMLSaG1clZxb9y1KXpns8+xCOXsL1YQrXKyMikLduEvRSvjr/rnkOuOay72xa2PRw2tj4/TiZ8mDBEzFbTE/PLkrEXyW7R9da3aIj0jcK9kT2VukPZZ8NNDpfh8OLb6p5HBg2+sOorUpOzyfK3pGTPipkrHeujqZbW19TH5rdsGLF5r3tHnnAh0RK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fQb7bcX3eq5Foc7I1m50udjbLWZ+LclayMTMxLsbti9auQrGUZRnGnnxWnmlaxr8q1e3Bny6ufFsYL2x5sOSuTFkrMxal6T3rMTH2pj9f5Pn8txXH85xm/w/K6uHd43k9XNpb2pnpXJh2NbYpOPLjvS0TExatp+cek9pj1iFgZ7Ib2guH3rdBsXU8v2WPTrZ01xMPT82w53Y0yt5iWIUxcPlNq1KVbl2mfC1av7K7GlbdjMzbdmtaVlSlZ8+EvX9OtOCpi28lfwa42lMO7SZjz56VjyU2ojv3n4kRFskx6VveI7+rUg94Z7I2z7M3itn3+ndLNPhl1rsbPI9MbNaTODi9jLec+xwOS8R5Mf1JbJfFpUt2vl1ta2SImKy26stK9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfxdB5/J/V/0fw/0IB+N32QOW/YP4DE26Pdc/kP/AA9/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTcL5ZueB8u4zzXj2TLD3nE99qORanIhWVK2thps/H2OJKXolCVYfHx4UuRpKPrh6o1rSlXJ0tvNo7etu69ppn1M+HYxWjv6ZMOSuSnymPTzVjvHf1h8XqTgOO6q6e5zpnl8Ndji+f4nkOH5DDaKzGTU5LUy6exEeaLRFvhZreW0xPlt2nt6LMbsn7jNF3UdtHSvrFpsqN/I33GsPF5Dbrdjcv2OS6ektPvvjRjSlbVMnaYGXlWLc6eqmPetVrKfn1ysm6L6iwdUdN8Xy+G3mtn1qU2ImYm1dnDHws/mj5x5stLWrE+vltHz+bSb9prwb5XwI8bOvPDrksE4sPFc1sZ+IvFLUxZeF5Hy8jxXw7TMxknDo7evgy3rPac2O/pX8TGVjtLAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1szMxdfiZWfm37WLhYONfzMvJvTpbs4+LjWpXsi/duSrSMLVm1Cdy5OVaUjCNZVr4o8b3rjpfJe0UpStr3tae1a1rE2taZ+iIiJmZ+iIe7W18+5sYNTVxXz7O1mxa+vgxVm+TNnz3rixYsdI7za+TJatKViJmbTER6ygke2p9pDkd1vVi90a6YbnJj0R6X7XJwbk8e/KOPzDlmB8bA2O2uUtypbvYOHkzz8TX183LeTjxsZca08xog14zeI1uquVtw/GZrRwvGZbY5mtpiu5tU82PJlmI9JpS05KU+cWrFbxLak92j7GWLwE6BxeJHXHHYZ8TuudDBtUrlx1tl6d6f2/h7enx9JtE3x7Wzhrq7G3H1l8OW2XXtE9plonYOWnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMu+yHuu5p2ddwXC+rnFc6/b1+Jn2ddy/UUuzjh73i+ZetR2GFmW4ypS5CzKFnOt/8742Hap58VrSvbeiuqtzpDn9PltXJaMdckY9vD3mKZ9a8x8Sl4+mK9q3j/hUhHv2nfAPpr2jPCPqXw95/VxX29jVybnTvITSs7HFc5rY7zqbOteYmaWyRbJq5Po+FsZJ7d+0xZM9JuqPEetPTnh/VHguxtbPi3NdFrd/qcm3OE5Rx9liWcuGPkUhWtLeXjxvRtZNmviVq7GUJUpWixrieU1OZ47U5PRyRl1d3Bjz4rRPeYrkpW8Vt9q9YtEWj6J7w0vOv+huoPDXrLqLoXqnTvo870zyu7xPIYb1tWs5tLYya9suGbRE3wZpxzfDkj62+Oa2iZiXYj6LpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdXv4ug+z+rQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAShPdzO7enGufc17UuVbSkddzm3kcs6f2r92tZf3Ra3Ct3NrrMaEpUjDH/MfXZ2wlGEayrflOVa+K1Sa9njqyNbf3eldrL2x70TtcfFp9fqjHSJy4qxM+lfg48mT0j8VMzKjf3yHs+zzfSfTXj3wOjNtzpa+Hp/q7Jhx9o/Afd2b00N3NNa97ZvwR3NXUi1p7Riisdu8R3mKJfNc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHa9u57RHK6BdPLfbL0t28MbqZ1N1vq5hssS95zOLcNvw+NKzbrbnGWJstx4w7cfjer4upzsiULXmULsY9+OfiFbgePjpri80V5Lk8f+rMtLfX6unMeaax2/EZc31kes+uK9pivymLhvdW+x7g8WesL+N3XfH3zdEdEbs16c0tjH21ue6kxWnFGW8XiY2NLje+zefh9vJyGthi1/rZpaEdOUpylOcpTnOVZTnOtZSlKVa1lKUq1rWUpVrWta1rWta1rWtfKFczMzMzPeZ9ZmfnM/bls41rWta1rWK1rEVrWsRFa1iO0VrEdoiIiIiIiO0R6Q/kfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACV77vB3xfRsve9nPUDdebeZW/yTpNPNyPTSGTS/wDE3PG8Wl2Va38nNlmXdlYtWpQraxtddpS1ONKzhKj2fetvJbP0fv5vS/m2eJ89vlbzd82vTzT9da83nJWK9u1ccx2n5qDvfBey/wDHwcV7RvSXGdsmtGHhfECurhifNhnF5ON5rPOOIjFh1o16aWW94t8TPuY5+JWZitpbaWDX4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q9/F0H2f1aAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1eh/VfkPQ/q1wDqrxjLv4e24TyjUbyMse5W3PJw8PNs3Njr5Sj8/g7HApkYN+nivqtX508fN9ThOV2OE5bQ5XWvamXS2sOePLPabUpeJyY+/wBrJj81Lfbi0uh+J/QXEeJ/h/1b0Fzmvi2OP6n4LkeLtGakXph2NjWyU09uKz6fE09qcO1in6MmKsrODt+6w8e6+9GOnXV7jGXYzNVzfjGt29bmNKM7VjZSsRs7jBjKMpUrXX7a1mYU/NaVpKxWkqRr5pSyzgOX1+e4fj+W1b1vi3dbHl71mJiuSaxGbH6TP+15YvSfu1aRPi54dcv4T+JPWXh5zmvl1t/pfnN3jvJmrNcmXTrlnJx21MTEem3oZNbar2jtNcsdpmO0u432GOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQvc5154t2z9C+o3Wnl2VZxtZwnj2Tn2Ld6cYUzNrfnawNPhR9Vaer6VtcvDszpHzKluc5UpXw+F1Nzur01wfI8zt3rXFpa9slYtMR58tprjw09f7LLekT9yZn6GV/BDwp53xs8UujfDTp7Blzb3U3L4dTLfFWbTraGKuTb5LamYiYr8DQ19nJXv2ib1rX6VaT3Cdc+bdyHV/nHWHn2xyM/fcx3mdsaQv3pXo6zWzv3PzK02NWtfFMXUa+mNr8fxSnmzjQrLzXzVW71Bzm71Fy+9y+/ktkz7me+Ttae8Ysc2n4WGv/BxY/Ljr9uKxM+rdX8IfC3pnwZ8O+l/DnpPTw6nE9OcXq6c2xY4xzvbtcVPq/ks0R88/I7nxtzN3me2TNaI9Ozpd8ZkoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2X0c6ock6L9UOD9UeJZ9/W77hfIcDdYeTjzlC56bFz0ZdnzGtPMcnDuZGPKlfNPTdr8q/U+lw/J7HDcnpcnqXtjz6WxjzUtWZie1Z7Xr6fRak2rP57pXiN0PwviT0N1R0N1BqYt3iepeI2+M2cGasWp3y082vk7T9OHZphzV+Xrjj1hZndrnXvjnc10I6cdaeM37FzD5nxzXZ+fj49yNyGs3lcSxXdaico1r+m6zPnexLtK+mUZ2q0lGNaVpSyfpjntbqXguO5nWtWabmvjyZK1mJjFn8lfjYZmJn1xZJmk/T3j5R8mkt46eFHM+CXir1n4ac5iy02OmuZ3NTUzZqTS29xcbGWON5GtbR/te9qVx7GOY71mt4mtpj1d/vvsSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+b25fj++HdXvH/Q0Hn+H8wNX9X8nj+XygH43fZA5b9g/gMTbo91z+Q/8AD39Fy/b+6+//AI2oBiNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl++7k928t3xfnfajy3a0nncZuXOX9O7eTe9P/AuXcs12mlw4XJSrfvx2F7Z7e5S3Wnox6yrW36Y1mlv7O/Vk5tbe6V28ve+tM7fHxae39JvMTlw0ifxVoyWy5Z7T6V+jtHdrw++S9n2OM53pbx86f0Jrq83SnTvWN8GPzT+CeCmSNDk9m1YiMWK2nj0uPrN4nzZYrEX7zFUptKFRKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhre8Od61ebdQ+P9p3Bdz6+OcAljcg6iTwr/rsbHk2bgSu6/Wznal8OePg4Wyp9Kx5xnO3ssSlayhW36EPPaC6z+reQ1+lNHN31tDy7HITS3euTZvj82PH3ie01pTJ9fWe8xkpHrHbs2Pvc/8As0R0z0fy/j91Txvl5nq2M/EdH12cXly6fB623GPb3a0yV89M21taUzr5qzWt9LYmIraLxZGQRqXdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYXu4vdrK1kc/7TOU7Pzau2bnOunsMq96Ldj4eZCzvdRi0uSrS7k5+Vt458bVv0ypZw7taQlGFZRlT7O3Vfltv9KbWT0mJ3uPi1u0V7XiM+Knf52vfL8SIiY9K29J+agv3yvs/Rkw9Je0BwWj2yUy06W6wtgx+a+bz618vFchnmlYnHh1MHHzqWyX71nJsUjzRNoi0tZK9r9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1e/i6Dz+T+r/AKP4f6EA/G77IHLfsH8BibdHuufyH/h7+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZO9nPcLvu1zuO6XdZdHmXMSPGeTYMd5SEp0jkcZ2Vz8zOR2JRjKNJTnpMzPpZrKkqQvVhP0S9Ppr2bo/qDP0x1FxfMYLzWNbZpGftMx5tbLPwtmPT6Zw3yeXv8AKe09pYQ9ozwg4nx08GuuvDfldemxbm+E2p4ubRXvh5zSp9W8Nli0xM1rXk9fVnJFZibY4tXzR37xZm8B5rpOo/CeKc845kW8nScv4/qeRa27buRu0pi7fBsZ1q1OcKUjW7ZjfpavUpSnpuwnGtKVp4pZPobuHkdLU39e0Wwbevi2McxMW+ty0reImY+mvm7W+1MS0l+rOmuT6N6n5/pTmcN8HKdO8vyHD7uO9LY5+qOP2surkvWlu8xTJOL4mPvM96WrMTMT3cuct14AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiT3wdzfG+0rts6k9YN7mWrOfqdFk4XFcKt6FvK2fJ9n6NfqrWFbl5lkXMPIyo7LItW41n9Ew78/MIxlOPU+tupdbpTpzkeXz3rXJiwWpq0mYi2TZy9seKKR87TS14yWiPXy0n5R6xIH2YPBHmfaB8aOi/Dri9fJk1N/lMOzz2zGO18Gjwel5tvfybN47Vw12MWC2lhyXmK/VGxirEWmYpatL59zfkPUnmvKufcrzbmx5HzDf7bke4y7kpy+Jn7nPyNhlfDpOU5QsxvZE42bfrlS3apGFK1pGit7f3djkd3a39q85Njc2MuzmvPf1yZslsl+3fv2rFrT2j6I7Q3V+k+mOI6L6Z4HpPgNamnw3TvE8fw3G69K1jyanG6mLTwefyVrW2S2PDW2W/lib5JtaY7y4i4jsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIvtL64bvtz7ielHV/RZUsXI4jyzX5OVX4lbdq7rcys9dsYZHiUaStQw8y9e9Mq+n124Sr+pdh6U5vP071DxXL4LTW2pt47X9e0Tiv3x5It9ExFLzPafTvEMO+P/AIX8Z4yeD3X3h3yuCufD1DwG3hwR5Ivem7rxXc0rYu8TNb22dfHj7xHfy3tEfNZx8G5jpOofDOK8843kxzOP8x4/qeS6TKhKko5Gr3OFZz8G9GUflKlzHv25UrT5V8+afJZbo7mHkNPV3te0X19zXxbOG0T3i2LNSMlJ7x6T3raJaQ/VHTnJ9IdSc90rzWGdbl+nOX5DheT17RMWw73G7WXU2sUxPrE0zYr1mJ9Y7erlTlPggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1e/i6D7P6tAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE3j3e/u7udXegG87euUbGmRy7oreu39FG9e+JmZvCNpmRyYZV71S9Xpw9ttbmtsUjGkY2Me3H64pq+AHVs8twOfp/ayebb4W02wRM9730st/NF7d5me1MuScdflHlrDWJ97v7PVPD3xa4vxf4PT+D094mY6YeUnHj8mtrdUaOtbDfXx+WPL32OP0abuWZmbWzZrz8pSIEg1PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEL7wF3p2us/XPV9u3CN1HM4H0buUvcilhZHxcPac8v4c7eT5lal8L16SzsM7T5WPP4koZePKsq25wrbpCnx86yjmecxdPaWbzaPDz32PJbvTLvWpMWnvHp3wxkyYb1nvMXrPftMdmzx7pL2ar+G3hbv+MXU/Gzr9V+JFJx8PXZw/D2NHpTFsVvgjy5K+fy8nk1NXksGavki2vliKxatvNMeFH1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfV9QJ6vsEe5G/1u7NMfg+6zvpvKOiO3hxHMlK5WU4aHLplz4rYpblWU4RxdPr7dn1VlWM6+KxjCniKdfgR1Hbm+jq6OfJ8Ta4TLGpeZn1jXv551K9v+DhxxX7v3GqR71/wYxeGPtIZuqeM1fqXg/E/j7dRa1Yp2rbldedenPZZvEVrac/I7d8naKxNYntabT6t4bNqr4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur38TQef/ALgav+b5fw/h+/4pAPxu+yBy37B/AYm3R7rn8h/4e/ouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfXs1O6fZ9pXdp0z6hQyp2+MbTc43FOaYdbtbWJlaHkMpaieTmfOlK2tPezobePqrSlLmHGtZUpTzTvnhv1Rk6T6s43kItMa2XNXU3Kd+1LYNjvim1/o7YbXjNHf5TSJRO9tTwJ0vaB9n/rbo+2Ct+c0eNzc/0zsxji+xg5bh4ryFcOt9MZORx6tuOt27zNNm0REzPZZG6fbYG+1Gr3uqyIZer3Wuwdtrcq3WlbeTgbHGtZmHkQrStaVhex71u5GtK1pWMqVpWtFjGHLjz4sWfFaLYs2OmXHaPlbHkrF6Wj7k1mJj89picjobfFchvcXv4ba+9xu5taG7gvExfBt6ee+vsYbxMRMWx5sd6WiYiYms94fRexwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCPtHO7DS9n3ax1C6lZWZZtcp2Otv8AF+AYE70bN/Z8p29v6NbjiVl5lLI1mBczNzSEITlWGvnWtKRpWVOjeInVWHpDpfkOSvesbWTFbV0Mcz2tk2s0eWPJ9u2LHN83aIn0xylT7G3gFyftE+O/SHRWDWyZOC093FznVu3XHOTFpcFx1/jXnYiI7Vxb23XW43zWtWItuV9ZntWa3DknItxy7kO85TyDNu7Hecj2+x3m3zr8pTu5ey2uZezs7InKVa183sm/duVp58U9Xinyorm2djNt7Gfa2Lzkz7GXJnzZLTMzfJlvbJe09/t2tM/rtzzheH47p/iOL4LiNbHp8Xw3H6fF8dqYqxXHr6Whr49XVw1iIiO2PBipSJ7d57d59XxHpfTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb7Pd9u4v7lXd9e6U7bO+Fx/rXx/L0WBhSufDtz5hhXcPY67Kl5rWM629RgbezGHppKtbvmk6UpWNc7eAXUP4FdXTxeXJ21+a174MdO/aJ3KTTJjv8AdmMVM0du3ee/z+iaove5eDn4ffZ4x9e8fq/E5fwz5fX5Xb2Yp5716d2sezp7mvHaItWL8htcfkm3mmv9L7TWZmJidYnE1ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiv3rONZu5GRchZsWbcrt67clSFu3bhSspznKvikYxjStZVrXxSlK1q/LWrWs2tMVrWJm0zPaIiPWZmftRDzx48mbJTFipbJly3rjx46RNr3veYrWtax3mbWmYiIj1mZam+6T2z3Zd2y5OXoK8zt9VOa4k7tm9xnp9l421t4WXarWk8PcbfDpn2dRk0rSla2snGrPxKNfT86MU9T+MnRvTVr4PqyOU3ad4trcfeuWKXie00zZafEjDb7lqzPy9PVP7wK92z7Snjbg1uX/AAtX6D6Z2K0yYub6v18+hfZ18kRNdnjuP2PqTJyGGfXtfDniszEx37w0Z9cfeTOuO+zMmz0E6TcO4Hq5ylbtXOdyy+Z7H4Xj0/Gt3tXlcWt2rsqeZwpPHnS3X00lSfivnCHN+0dzme9q8DxOno4p7xE7033Mvb5eaLYr6sVn6Y71nt8p7rRvC/3LvhdxWvhyeLHX/UfVe9WK3vj6VjX6a0vifP4eTFv4OdvkxxP1t/Lmr547+Wa94mNenKfbUe0R5NmXsuz1z2PGI3q1rTD4vh28HDs+a1r4s28y7sLkaU8+Keq7L6vvsf7XjN4hbN7XjnMmtE/1mtSKUj86L2yT++l9wXu0vY84TWx6+Tws0+ctj7d9jnNm+1sZO3b/AGy+vj1KW7/Oe1K/NwrD9rv7RnEyJX5d0/UTLpKXq+Bl3dZcsR+r9DGMNfblSPy+r11+uvzcOni14iUtM/ho5C/f+tvOKax+dEY4mP23Zdj3evsb7GKMUeBHR+vMR2+Lr496mWfn6za25esz6/PyxHy9HcvEfbqe0L4pdsXb/UbRcspZnCdbXLdHlbC1f9NaVrG9HB2+srKE/HiVI1jWtK1pStK/N9jU8cPEDVtWbcjg24rMT228F8kW7fRbyZsfeJ+n5d/z/VjfqH3Wfsg8/TLTF0by3T85K2rF+n+Vwal8Xm7/AF2Odrjt2ItXv9bMxbtPbvEtovQD3lSlK4Wq7jejEb07tbVvM5ZwDYz1+Hh0pWlLt+nG8vE3WZleY+ZUtQ2dqvn5eqrJ3Ae0f+IxdRcN3me0X29DJNKU+3P1Nema9/T17Rlj1QZ8Wvcr942t/wAG/EqcdafEvrcB1bpV29jYn1mmL8GtfY43XwevaJvfRvHb+tb4u2b2kHaH3Y/RcLpP1W093k2VGFYcK5Dex9Hy+UqxpWXw9Dk5Es67bjL1RpdjapGfolWlKUZ06a8RukuqvLTiuVwzs2j00tia4dvv9PbBa3xJjv8AKe3r9xVT42+xn7QvgD8fZ6/6C5HHwmCbebqXh8eblOnoiJ9PPyuDDGrS81mtpxzeZr5oiZZ0u8IsgAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAftK1jWko1rGUa0rGVK1pWlaV80rStPnStK/OlafOlT5fJ+TETExMRMTExMTHeJifSYmJ9JiY+cJ+XsPO76vcp2marhvI9l9M6hdFLlOHbut67T6Rn6a14v6DOtWJVrc+i4epy9bqZXfM4SyMaVKSjWvopPLwS6u/DJ0pi09jJ5+Q4WfqPP5pjzZMMfXa+Stfn5KYbYsUz6x5q/P6Gpn70H2eI8FvaA3+pOG0p1+kPE2k9ScZGOnfBqclePhctq5MtYin1Rs8hg3d+MflraMWaJ7TEead0rMytQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBZ9vh3l2evfcdjdFOHbemZ0+6IVnrsyuLfpcw9nzidiVvcX7kIVrCOVpL+TstFONZSrStmdJUjKlY0g9479Yxz3UVeF083n4/hJnHfyW70y7s17ZrTEenmwWtlwT8/xM9+0+jaX90/7N+Two8Gs3iZ1Hx863V3ifFdzXjPi8uxo9L1yxbjsVLWiLTg5TFg0uVrPaImMlfLNq9rToNYIWwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1uhfUbadI+sPTfqTp8quFn8Q5dp9tDKjWsa2seGVGzn/oqSjWlJ4F7Jt1r5pSlJea+aeaV+pwnI5eJ5fjuRw3mmTU28OWLx3iYrFork+Xb547Wj9d0LxR6N0fEHw66z6L5LBGzqdRdPcjx9sExExfNbBbLqekxMT5dvHgv27evl7R6+q0I6Yc91HVLp1wfqRoZ0npedcV0fK9XKM6XKVwd7rsfZYv6ZGkaT/SciH6KlKUr9fiizbjN/FynHaXI4J74d7VwbWKe8T/S8+OuSnrH/BtDRt646U5DoXrHqjovlqzXk+lee5TgN+s1mkxt8VuZtLP9bPea/wBMw29Jme325c6c51YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjB3Vd3nRPs66dZfUXrJyjE1GN6L8NFooX7Nd9yfYWbdJU1+lwJS+Pl3PVO1S/OxavfRoXI3ZwrH5V6z1T1bwvSHHX5HmNqmGva0YMEWr8fZyRHpjw45nzWnvNfNNYt5YmJmJZx8BvZ58TfaM6xwdHeG/B7HI54tityvK2xZI4rg9TJeazt8ntRX4WvTtW84q5L4/jWpNK3ifWIRvfl7Y/uL7vNjueKcX2uT0s6M3L92xhcU0GRes7XcYMZ1+Fd5LtY3I/S70/1cY4mLr6WoVjanG5WNZShX114wdQ9XZM2rrZbcXw02mtNTXtMZc1O/pOzliYm0z84ilcfaO0THpPfZy9lP3cng57POnxvPc5oYeu/EmmLHl2uf5fDiyaHHbU1jz4+F4+aW+p8dfxNp2M+5OS0Tes0iYrGn29evZN25fyL12/fuyrO7evXJ3btydfrlcuTrKc5V+/KVa1r+FiK1rWmbWmbWn1mbTMzM/bmZ9ZWJY8ePDSuLFjpixUiK0x46VpSlY+Va0rEVrEfREREQ8T8eYAAAD6Wp3O30ObZ2Ok2efqc/HnC5ZzNdlXsTItztypKEo3bE4T/AEMqUrSla1p5+89mLNlwXjJhy5MWSsxNb472paJie8TE1mJ9JcLf47j+V1smnyelq7+pmramXW3MGLYw3raO1otjy1tWe8eny7/dbxexf25fcT27bfScS617LJ6ydIoXbGHk2trO5Tl3H8CtY2/iabawrcsTx8Ola5M8K9rMi/leLlmGTalcjOGbeh/G7qHp7Nh1OayW5jiImtLVyzP1Xr09I74csd6zWkfXTScVrW9Yi0TMTFX/ALUnuufB3xi4/k+oPDPSweG/iHbHl2MGTQrWenuX2o81/JyWhaKZaZtj0w12cW7hxYO9MlsN4patpo3bn3LdIO6jpzq+p3RzleByXQZ8IwzLOPfsy2Oj2NLcLl/U7nEtzncwc+xG5bnKxfpC5Kzds3vRSF2KZPTvUnEdUcdi5Ph9rHs4MkRF61tE5MGTtE2xZqxMzTJXvEzW3ae0xPbtMNavxk8FPETwI6z3uh/EfgNvhOW1LWvr5c2HJXT5TTm9qY9/jdi9K029TLNL1jLim1Iy0yY/NNsdnfb7zFAAAAAAAAAAAAACvl9uV+yHdXv4ug/l/wCL+r+r/R9/5/zIB+N32QOW/YP4DE26Pdc/kP8Aw9/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbR7Gvu6udq3d/xO1uc+eN0/6sXbHAOXWPiVjbrd2s62eO5FPNa27dbfIp6qt+5KEq/R4zj5j+qplbwe6tnpbq7UjNkmuhysxobde8xHmyz5de32omNicXmntP1sTCAHvHvZ7r48ezxz9+N1KZuregaZerensvkibxj0KfE5nFPaPPeL8PXfjFSLR2zTW3afWs2Flq7av2rV+zcjds3rcLtq7CtJQuWrkaTt3ISp8pRnGVJRrT5VpWlaLAYmLRFqzExMRMTHrExMd4mJ+mJj1hqE5Md8WS+LJW1MmO9seSlomLUvS01tW0T6xatomJifWJiYeR+vAAAAAAAAAAAAAAAAAAAAAAAAAAAABgV7STuv03aB2qdQ+o2Tl2rfKdtrcjinAcCd2Nm9suTbm3XGpTFlWvqrf1muuZu5pGEZSrHXy80pHzKnRPEbqrD0j0tyHI2vEbWXFbU0Mcz2nJs5o8keXv/XY8c3zdvXvGOfz0rvYw8AuS9ojx66Q6Nw6+S/A8fu4ef6t2645yY9Lg+Nv8eZ2IiPLGLd3KavGzNrVjvtx2mZ7Vmty3+92nJ95uOSbzLu5+53+0z9ztc2/Ks7uXsdnl3c3NyLkq1rWs72Tfu3JfP65VVz58+XZz5tnPecmbYy5M2W9p7zfJlvN72n7s2tM/rtzrieL0eE4vjuG4vXpqcbxOjqcboauKIrj19PRwY9bWw0iIiIriw4qUj7lXyXqfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBPsLesWX1X7B+B4W2yq5O56e7XdcNvxrKsq2NRq87IwuPWvFayrGlNbhRpSnnx+h/Q0pT5Unx4H8vfleg9GmW/mzaGXNp2jv3muHFe1NePt/7XSGpH70vw61+gvaw6r2ePwfB43q/Q43qTFPl8sZeQ3tXFs8xfvERE993atMz8/X1mZ9W49mBXGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAws76+9fpz2NdFNn1R5vOGw3GXTI13COJWsq3j7HlO/pbhSzi41JQuzpi493IxrmxyY2LscTGuVvXKUjT59M656047ojhcvKb0xkzX82PS1ItFcm1sdo7Ur6TPlrNqzktFZilZ809oSW9lj2Zusvaj8TNLoXpittPjtecO51P1BkwXzafBcTN7fE2M81tjr8fNTFmpp4bZaW2M9Ix0mbT6V7Xdf3b9X+8LqluepvVbkGRnXcu/O3o9BZuXYaXjWojcnPF1msxJ3btIQtfEncvXpzncvX7l256oQrC1bgB1V1Zy/V/KZuT5XYteb2mMGvEzGHWwxM+TFipMz2iO8zaZmZm0zPft2iNvHwD9n7w79nboXjeiOgeIw6uPXxVvynLZKY7cnzXIWpWufe3titKTa1/LWmPHWtKY8VMde1rxa9sX3WWcQAAAAAAAGaXZJ3w9XeyLqvq+fdP9pfyuP3snGscy4VlX71dRybSUueMvGlajcjDG2FMad76BnUjOmPk1tXb1jJt2/g17l0V1ty/RXK4t/j8tra82rXc0r2n4Ozg79r17d+1cnlmfh3iJ8tu0zFojyzGr2nPZg8Pfad6B3+kurtHFg5fHgz5em+psGLHHI8Jyc0mdfNXJNJtm1JzVx/VerM1nNhi+PHlwXv8SLDftU7n+mvdz0b431h6Y7WznavbWIY+319LsJ53Ht9atW552l2lqPiePl2PiW70IXYW53MS/j5FIUhejWtgfS3U3G9W8PrcxxmWt8WWPLmx+aJvr54iJvhyxHrW8d4tETETNLVt27TDUC8evA7rX2fPEfmvDrrfRyau/wAfltm4/c+HeurzHFZMl66vJ6OS31ubXy+S+K18dr1psYs2GbTbHbtke7GwyAAAAAAAAAAAAr5fblfsh3V75V/UaD+X/gDV/On733vv/Olf4KQD8bvsgct+wfwGJt0e65/If+Hv6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7OHmZWvy8XPwr9zGzMHJsZmJk2pem7j5WNdjesX7Uv+bctXYQuQl96UaV+88qXtjvTJS01vS1b0tHzrasxato+7ExEx916djXwbevn1dnFTPrbOHLr7GHJHmx5sGalseXFev00yY7WpaPprMwsXvZO92WH3Z9oPAuQ5WXavc14HhY3AecY0LnxJ42y0dquJq7t+VZVlW/sNFY12xvVl4rW5lSrSnitFhnhT1XTqvpHR2L3id3QpXQ3axPea5MEeTFNvp82TBXHkt3+mzTm9vzwA2PZ/8AaI6r4fBr5MfTPVezn6t6Wz3p5KZ9LlMnx97HiiIisYtPlcu5p44jv2pgrEz379tmLJSEwAAAAAAAAAAAAAAAAAAAAAAAAAAACCz7fLvEt9du5LH6LcR2/wBM4B0SjXX5dMW/SeHsea3cetNtkXYQlKFMrS3svY6OdPVWsa2Z0lSMqVog948dXxzvUdeG1M3n0OFj4d/JbvTJuzH9NtMRMx58FrZME/drPybS/unfZzv4VeC+bxL6h4/6n6t8TrRuYJz4prs6XTOPL/rfhpNoi04OSx4NPlKz27TGSs1maz3nQawQthAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATN/dnt9d2HQLuE0k7nqtcf6h8T+Db8/4L81dVv8AMufLzXx65Q9X1U+rz80xvZtzzk4HqDBM+mvyGp2j7XxcWxef25hrb++w4rHqeLHhDydaeXJy/R/UHxL/AE3+oN/iden0f1sWmPnPz+hJhSSUngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOcv5ZoOCcX5BzPlWxx9Rxvi+o2G93m0ypwt4+BqtXi3czOy71ycowjbsY9m5cnWUqUpGNfm4+3t4NHV2NzayVxa2rhyZ8+S0xFaYsVZve8zMxHatYmZ9flD7PT3Act1VzvEdN8DpZuR5rneR1OK4vRwVtfNt7+9npr6uvjrWJta+XNkpSsREzMzHaJVzvtLe9/lXex3E8n5Zd2GTb6b8bzb+h6ccf+NOeNg6TCu3aVzblP0Nu/l5+Vcysj6TC1apXFnjWqQr8L4k68fEjrXa606h2du2S0cdrXtg47B5pmtMFJmPPPyi18lptbzRWv1s1jt6d53HPYq9mHgfZl8HuD4DHqYb9Z8zrYuV605f4Va59rlNnHSY1qfO+LX1MFMGH4NsmSYz0zZPNHn8lddjHqYYADZN2d+yt7ru8qeNt+GcQv8S6fXZUrPqHy3EyMDRXrVK+Jy09ciuJb3d234r67GLmQnSvppWtPVRkbpDwu6q6wmubT1LanHz8+Q26Wx4LR9M4Zt5YzzH01reJj9eEL/aL9vDwE9m+ufjupOocXUHV+OJivR/T+xh2+Vx3mO9a8jGKM9+Mpf8Arcuxr2rMd57eiQb0O92y6H6PX2bvX3qzzLnO3+HSUrfAaYXDddbu1p5rbuWdticpuXoQr4jWUL9v1+K1p6fPyz9wns48Jgx1nnuV3N7N2iZjQ8mnjifX0mMtNqbRHp8rR3VFeKHvovFDlNvJTwm8P+m+l+O801rfq2dnqTctSPTz0ycfs8DTFa3rMRbFfy94ie/b1zAw/YIez6xMCeDLivOMuUo0jTOy+Sa25nQ8f86N23x61a9Vf37NafvO308COgKUmn1Lu3nt2899nHN4+7ExrxHf8+so77PvYPa62Nqu1Xnultetbd/qXX4Tcrq2/wCDal+Yvea/nZIn7roTqp7uN2k8h1OTXpdzbqdwfklyM6Y2RvNvqeQ6CzWtP0FZ6rE0Goy5+JV/ReNlH1RpSlPFfNa/B5T2dulNjFb8C93k9HYnv5bZ82HYwR9r+lU18N57fT/TY7+n57K/QfvlPaC4ffwx1z0x0P1Rw1JrObDxfHchw/LZIifrorv7HLcjr17x8u+lPae8+sT2jRh3b+wz7t+2rX53KuJ41nrnwfBjdv5W14Tqcu3vMHGteq5dv5nGbWXt823i41ilLl/MlfjapCNydaRpbkwh1Z4IdWdN48m1qVrzmljibXy6WG8Z6VjvM2vrRfNeKVj1m82iO3eZ7dlpPs++9G9n3xq3NXgefz5PC3qjatjxYNDqfkMF+L2s2TtTHi1+bvg4/VvsZsvemLWrjtkm1qV7zNoaXcnGyMLIv4mXZuY+Vi3rljIx70K27tm9anWF21dhKlJQuW5xrGca0pWMqVpWnmjDdq2pa1L1mtqzNbVtHaa2ie0xMT6xMT6TCyjDmw7OHFsa+SmbBnx0y4cuO0Xx5cWSsWpkpaszFq3rMWrMT2mJ7vA8XtAbz/YWd6mV279zOD0k5bvL1nph1ryMbj1cPJv1+h63mmV/vPj2Zi25VpG3f2mxua3XZM6+aVx7cKRjGtKyZv8AA/rO3T/UuPidvPMcZzVq6/ktb6zHu2+s170iZ7RbLknHjtP9jEdu301b+9M9mjB4w+CW14g9P8Xjy9c+GWHNzEbGHF/qjd6awR9U8xr571ibXxaGnTd3MFIiJ+Ne0zMxPZPIjKM4xlGtJRlSkoypXzSUa080rSv36VpWlaV/AnTE947x8p9YaqExNZmtomJiZiYn0mJie0xMfRMT6S/R+AAAAAAAAAAANWvdz7IPtJ7zeotOqfVCHULRcwuYdrD2GdwLkWp0kNtGxSUbN7ZW9lxzdyvX7dusLMZ2p2Y/DtWqVjWsayrjDqzwk6T6x5D8FOTjkMG5NIpkyaGxiwRm8veItkjLrZ+9ojtHeJr6Vj09E6vZ894d7QXs29HT0J0NbpDlenKbOTZ1NXqzhuQ5O/H2y+WcmPSvpczxcY8V7xbJat6ZJ8+S8xaImIjFL87i9g/7ZO4X8vuLf7P3Vf53boP+2eof3fqf6OZ7/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7ken2vPs2tB2C9ROFXumOVyjb9IefauX5k7PleZi7HaYPI8SeVTN0uTsMLXazFyLv0XE/NGFYYlmULGTbhKEqwrcnH7xa8OcHQfIaVuMvtZuI38U/Cy7d65MuPYpN/Phvkx4sVLT5afEjtSsxW0R2ntMre/d6e2hy3tY9H9TYuuMHBcd4h9J78fV+jwGtn09Ha4bYprzrcng1Nrc3s+Gn1RnnTvFtjLFsuG94tWLRSunRiFYwAAAAAAAAAAAAAAAAAA3w+wT7vI9Be5+fSPk+yjjcE64Y8tNSuVf+Hh6zleNY+lavOjGVYwrlbKevxNJb8ypWv0qMY0rKtI1zn4E9WxwXU08TtZPLo83WcP11u1MW3WPNiv2mYjz5ZpXDH3bdvWfSaqvevez1bxW8Da+IPCaU5+qvC/NHJTGDF59ne4DNk+BvatpiJtGDSrt7HJ37R2j4EzPaImYnbpytVwAAAAAAAAAAAAAAAAAAAAAAAAAABhT7QTuf0faX2s9TuqWxyrdrdR0eTouH4Vb0bWTsOSbqkNbiUwo18zu3tfDKubadu3GUvgYN2VfTGNZR6Z1/1Ng6T6X5PlMl4jN8C2DTp5orfJs5u2Onk795mccWnLMRHfy0n5fNJj2RvA7lPaA8duiOhNPBe/GW5XBynUez8OcmDT4XjZtu7E7Mx9bTHuW16cfW15iPi7VI9ZmKzWscl5DtuW8i3vKd9lXM7d8j3Gy3u2zLspSnk7LbZl7Pzb8qyrKvm7k5F2fita+PV4+8rg2djLt7Gfaz3nJn2c2TPmvPzvly3tkvafz7WmW6bwvEcf0/w/FcFxWCurxnDcdpcVx+tSIiuDS4/Wx6mriiIiI+sw4qV79o79u74j0vpgAAAAAAAAAAAAAAAAAAO2+l3QXrT1tycjD6RdLucdSMrDrGmXY4bx3Zb65jVnWlI/Hhr7F6tvzWVPHqpTz5p+F9bjOC5nmrWpxHF73I3p+Krp6+TPNe/wBuMdZ7frsf9c+K3hr4ZYcOz4hdddL9GYNiLTgy9SczpcTTNFYmZ+Hbby4ov2iJ+Xf5SzL0PsjPaC7/AF9dha7c+cayFI0l9F3mp2Wpzq0rTz4piZWDG75p9VaePlX5fW7jg8Juv8+P4kdO7uKP7DPiyYcn/wDZanf/AN6N/Le8H9kXidv6kyeMnS29bvMfH4vkNPkNX0nt3+qMGzNO0/OJ+mImXDeV+zC79eH2pZGw7XurmdjW/VW9k6Xhm+2tixCNK1ldvXcfA9Nu1Tx/hJVpHzWlPPzcPa8M+u9SJtk6Y5a9Y+dsOnny1rH27TXH2iPuz9t2PgPbh9lDqLJXDp+Ofh7q5r9ox4eT6l4rQy5bWmIimKmbbib39fxMevaJ+0wj3/Ht5xXcZ/H+S6nP0W81eRcxNjqdpjXcPPwcqzOVu7Yysa9GF2zdtzjKM4TjSUZUrStHStjXz6ubJr7OLJgz4rTTJiy1mmSlqzMTW1Z7TExMTExKTnE8vxfPcdqcvwvIanKcXvYabGnv6OfHs6m1gy1i+PLgz4ptTJjvW0WraszExMTD470vogAAAAAAAAAAAAAAAAAJjPux1fPR7ulp4p8uonT35/fr549yKvz/ANCX3s0/jR1R+mHH/wAX2Gub77yP+qL4FfP16P6v+/HD/JJ/SaUcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6HvC/dxPpb0I4/268U2s8Tl3V3I+nckpjXa2svC4Xg5FulIy9MvM8XfXLOz1t+Mo0jK3anGkq1rWlI8e0D1ZPGcFr9PauWabfLW8+z5Z7XppUtHb8+uea5cVvT5RPaVx3ug/Z9r114qcv4xc/oV2On/D3F9S8N8fHGTX2updvDeZmO8dq5+Kpl0d3FaJmYteveEJb6/rQubNQACUn7I72LeB1C1nGO5fuk12Rc4tmVs7bgvS/LxZ4c9rbx7nqsbfkcr9J3Luvv34emxr7VnEu1hYle+lzhkQjbk94TeDWPkMWr1L1PjtOrfy5tHjL18k5YrPeMuz5u8zjtaO1ccVpPasz5pi0RFFnvBveVbXSG9zfgp4FbmGnPa0ZdDqnrnBnrs10L5aeXJx/C1xTSlNzFjt3y7eTJsUi+SMfwK2w2m8vDSaLTca1eHpeP6vB02p1+PaxcLX67GtYuLjWLFuNq1bt2rUYxpSEIxj5r5lXx5lWtfNUtcGDDrYqYdfFTDix1itMeOsVrWtY7RERH2ojt9tr08nynJc1vbPJ8tvbXI8ht5cmfZ3NzNfPnzZct5ve98mSZmZta0z2jtWO/aIiPR9V7XAAAfxdtW71udq9bhdtXIyhctXYRuW7kJUrSUJwlSsZRlStaSjKlaVpWtK08PyYiYmJiJiY7TEx3iY+1MT6TDype+O9cmO9seSlotS9LTW9LRPeLVtWYmton1iYmJifkj8+1M9jHwfuP1O/609vutxOGdasHCy9nt9DgYkJajqBLDszvxsQwrPwJ4u/yoQ+h2ci3euWbtaYsKYUrkJyu4D8UPBzS6ixZ+Z4DHXT5qlL5c2DHSJw8hNIm0VikeWaZ7RHki0TMT9ZHk7xPe2/2E/eSdUeDPIcT4aeLm7sdSeGe1s6+jx3K7exaOR6RjZy1xTlts5Pi1z8TgtaNjJhvjpkxxOe07UUtWMcIrkfHtxxPfbfjPIMHI1m70WwytXtMDKtzs5GJm4d2Vm/Zu250jOMozjXxSVKVrStK+PmhVsa+bVz5tbYpbFnwZLYsuO0TFqXpMxasxPaYmJj6YbOvD8vx3P8AFcfzfEbWLd4zldTBvaO3gvXJi2NbYxxkxZKXrM1tE1tHymYiYmPofFel9J7+q2mw0ez1+51OXewNpqs3G2OuzsefoyMPNw70MjFybM6fOF2zetwuW5felGlXsxZcmDLjzYb2x5cV65MeSs9rUvSYtW1Z+ia2iJiftw4m/o6nJ6W3x3Ia+Pb0d/Wz6e5q5q+fFsauzjthz4MtZ/FY8uO9qXr9NbTCx79mD3a6ru+7TeA84pmWb3MeM4drhfUDDt3KTlgck01i16IXK1lKdZ5OnvarOuSl483MqXilKeKLE/DLqvF1b0pobvnrbc1qV09+kT3mmzhrHaJ9e/e2G2K8z9u0tNL24vZ+3/Z48f8AqzpedbJj6c5vYv1L0js3rNa7fC8llyea1I8sViuDkcW/q0iO/amCvf1bDmQUPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGuP2pnaXhd3XaR1A4fj4kLnM+J67K5twfLpbpcyrO149bjtsjAxaUp663d3h4FzUUjGta1rl/oYyr4jXHfih0nTq3pPf060idzUx23dG/bveMuvEZbY6fT5s9Mc4Y/R/KUyvYT9oDZ9nr2g+keo82xanTXP7mDpjqjXm80wZOP5e86GHb2J7+WMfF7O3TkJm3pH1P6zWO8xXI7PW5un2Ww1GxsTxdhqs7L1ufjXI1jcx83ByLmLlWLkZUpKM7N+1ctzjWlK0lGtK0pX5K7suO+HLkw5KzXJivfHkrPzrelpras/di0TE/nNyTR3NbkdLT5DTy1z6e/q6+5qZ6TE0za21ipnwZaTHeJrkxXpesxMxMTEw9F4OUAAAAAAAAAAAAAAAAA+5xjkW24hyPQ8r0OTLD3XG9xrd7qcqFZUrY2OpzLOfh3f0MoyrSGRYtylGkqeqNKxrXxV79bYy6mxg2sFvJm1s2PPivH9bkxXi9J9Jj5WrHeO/rHo+XzfD8f1Dw3K8DyuCuzxnNcdu8VyGvaImM2nyGtk1NnH9dFoibYct4ie0+WZie3ossuwXuX03df2tdLOrGvyoXtrmcexNPyvHrdjPKxuS6KktPtrmVbp4nZrsMvAvbHHhcp6q42Tal6p0rScrIOg+pcPVXS/F8rjvE5b69cO1XvE2rs4O+HLN4j1r8S+O2SsT/W2ifWPWdKv2sfBPkvAPx2676A28Fsehr8xscjwGX4c0wZuE5Wa8jx9MF/xOWNTX2senlvSe0ZsF47VmJrGZTuKN4AAAAAAAAAAAAAAAAAAAAAAAAACEr7wr3fQ6rddeP9uXEttTJ4f0etWdjySOLf8Ai4ufzfZYEpxnG5alS1Wur1+0ydXlWJ0uSt5dmfqlCUPRSFvtAdXfgrzmv07qZfNp8REZNmK271ybuXH37xMen9Kx5LYrV9Zi8T3mO0Q2bPdC+zxboLws5fxl6g0Jw9ReI2TJp8LOfF8PY1Ol9Lbis0tS9ZvEb+5o4d7BlrNK318le0WrbzI6KPK4wAAAAAAAAAAAAAAAAAABtZ9kd2J/7tjuPwsPlWHfudJenVqPJ+fTpCsLW0s2btjHwuPWsqcZWYZOZmZmJk3rNYXLtzXY+XS3GFa0vW8p+E/Q34dOoqU2qWnieOj6q357doy1rNa014vMTEWve9LTHaZnHW/aI+cQL94L7U/87L4M7WzwWxip4gdY5LcF0lWbRbJoZcmPLm2uYyYKzXJbDra2tsYceSLUpTcy682taP6Xef70+6TdNOlGiweM9OeEcc4fo9bZjj4WBpdbYxo2bMKUpCHxqxnk3KRpSlKVu3rkvl9aevH8TxvFYKa3HaOtp4McRWmPDirWKxHyjv2m09vo72lqVdX9f9a9fcrtc31l1PzPUfKbuS2bZ2+T3cua2XJaZm1vhxNcNJmZnvGPHSPuOwn0HUH8yjGcawnGM4Sp4lGVKSjKn4KxrStK0/erQmIn0mO8fal+1tasxatpraJ7xaszExP24mO0xP5zQ97aT2bvFe4vorvet/TTjOHrutXTPAnur89Th27NzmHGsS38PY6zLtY8IecnEsSjs45dKSr8HXTtztylc+LHBfjL4c6vUXC5+b4zVpj5rjMc5pnFSKzt61I7ZMV4rEfXUr/TYv6+mOYmPXvFq3u1fbO57wc8S+L8MOteb2dzwz63268birv7N8lOneb2LxfS3te+W1u2HYy1tpW1+9Y+JuUvW0RTyWglyjKMqxlSsZRrWkqVp4rStK+K0rT8NKoNtqCJiYiYnvExExMfKYn1if134P0AAAAAAAAAAAAAAAABMR92J/Wm7rfnX9cTpv4p+D/i3yP6v9PyS89mf8auqv0w43+LbLXT99//AFf+Af6j+s/v1wyUOk4ozAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV2Hti+vOd1277OrOVXNrmcf4BlYvAuKeLnrt29PrbNNjcjTxKsPVTabTY0lWlKV+VKV+pXt4v87fneueWv5/Pr6F66Gr694jDij4kx+fGXLk/wNw73c3hTq+Ffsr9AYI1o1+X6twZ+rOfiaRW9uS3sk6dJme3mms6GjpzETM/TMfNq2YwTqAbdPY29k+H3hd0WFPl+v+ndL+lVrC5fzOxdtVnjbK5G/euaXT3q/KlcfY52D9FzIU8T+j3q+mUK1pVlnwf6Lp1f1PSdvH5+M4qKbe5WY+tyT5rThw2n+xyXp5b9vXtP0K+PeO+0zsezr4GbNentuNbrnr2+10901lpkiubSpOLHTk+Rxx6zGbT1dr4+vafrfi447xaImFgtq9ZgaXXYOo1WJZwdbrMTHwcDDxoRtWMbExbUbNizatxpSMYW7cIxpSlPvea+a1rVPvFix4cePDipWmPFSuPHSsdq1pSIrWsRHyiIiIajG9u7fJbm1yG/sZdrd3djLtbWzmtN8ufYz3tky5clp9Zte9ptP5/aO0ej3nscUAAAABD794W7GNJwvZaDu66c6SxrMDk2Za4/1RxdfjVt40d3O/Czq+R5EofpcL+0rmYerrCkYUlXBpPzKUq0RF9oDofBpZdfq3jsFcePZvGvylMdZisZ5tFcWzbt6RbL56YpjtEfWR27zMtiP3QntScn1Lpct7PXWPJ5d3b4TWycv0Ln288Xz24umK2Te4bDFvr7Y9H6n2d6Lea0/wCqZr2iKwi1owr1QEhb3enukj0r7lN70L5HtPo3Fesurn+ZMMq9S3hYXLNRj38mzct0lWkPpm5pZwNXbpWvquVjbhClZeKVkB7P/VH4F9SZ+D2Mvl1eYxT8KLW7Upt4azasxEzEefN5aYo+me0RHdUJ73vwKnrzwW4vxT4bRnNz3htvV/BC2DHN9nZ6f5HNiw5a37RNvqbjZy7W/efxNIm9rdo7ynBJsNYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+SjGcZQnGkoypWMoypSUZRlTxWMqV80rStK1pWlaVpWlfFSYiYmJjvE+kxPymPtS/YmazFqzMWiYmJiZiYmJ7xMTHrExPrEx6xKAF7bjs6udsXdjuOW8f19Mbpz1qpLmnHaY9qv0fW7O9WeLvNXfvx/Sq5mRtcHY7elqkbc442ZarWFY+JygT41dIT0z1Xm29fH5OO5r/AFZrRWPrceWe9c+O1o9PPbLTJl7domK3j5/OdtX3Y/tGU8cPAHjun+X25zdZeGcx01zE5rx8bd0cflz8XvYsU/X/AFNh0NrT4+cne9Zza1480T9bGmVh1ZEAAAAAAAAAAAAAAAAAAkue7rd29OCdW+W9r/Kdp8PRdULF/f8ACrF+96YWuX6nChfzbMKzlWEbN3R6vLlG1CMZTyZ+r1SrL01kj7PXVkaHLbfTG1l7YOTrbY0q2t6RuYqRa8R3ntEWwY7z2j1m3y+faaU/fEez7PVXh90/45cFo+flehsuLiOpsuLH3tk6d5DZti1clvLEWnLj5Te14tktNorgr5fLHbvEzxMdrZgAAAAAAAAAAAAAAAAAAAAAAAAMV+9TuL0Hax219U+sW7y7WPkce43l2eP49b0LeTm8i2krWp09vEty8yyJY2dnWM2/at0rKmLj35+YxjWcerdZ9RYOl+m+U5jPeK219a8a9e/a19jL2xYYpHztNcmSt7RHr5a2nvHzZ49mnwc5bx38auhPDnjNe+XDzHNYMnL5vh2vh1uG0a33+RvsXjtXFXNq6uXWxXvMV+PmxV7WmYras651zLedROZ8q53ybLnnb/l/INxyTb5M5Tl8TYbrYZGyy/R65TlG1S/kzpat+qtLdukYUr4pRW1vbmfkNza3tm83z7mxm2c1pmZ75M2S2S/zmZ7ea09o7+kejdi6W6c4vo/pvgeleE166vE9O8Rx3C8dgrFY8mnxmph09eLeWtYtecWGs3v5Y815m0x3lxRxX3gAAAAAAAAAAAAAAAAAHtYWHk7HNxNfhWZ5GZn5WPh4mPbjWVy/k5V2FixZtxp5rKd27OEIxpStaylSlPm8qUtkvTHSJte9q0pWPWbWtMVrER9uZmIh6NnZwaetsbezkrh1tXBl2djNeYrTFgwY7ZcuS9p9IrTHW1rTPpERMysOvZBdm1ntD7TOK4u6wrVvqP1OxsLnfNsr4VLeRD817Mtho9RfhKlbti/ptXn2ddl2pz81ycaUpW7cqeiNgnhH0fHSXSmrXNSI5Hk603t23btaPjV+JhxWj51thxXrjvE/11Z7xHyjUA94f7R2T2hvH/nc/GbOS/RnQ+bZ6V6Yweeb4bfgfljU5TkMVomMeXFyW/q5NzXyVr6YM0RF7xPnttUZSQNAAensMDE2uBnazPswyMHY4mTg5mPcpSUL+Ll2Z2Mi1OlflWNy1cnCVPv0rV4ZMdMuO+LJWLUyUtS9Z+Vq3ia2ifz4mYcjU2tjR29bd1clsO1p7GHa1s1J7WxZ9fJXLhyVn6LUyUraPuwravaadvde2jvR60dObGPTG1GRyO/zHQWLcaRsY2j5pOfI9Xg2PFKR+HgYOxx8WkafqPh0jX5q5fErp/8AC11lzPHVr5cNti25rxH4muDdmdnFSv3MdMlaRH0duzdB9iXxejxs9mvw16yy5pz8hh4bF05y+W9u+bPynTVa8Lv7WXvMz59va08ueZn8V55mPT1YEOiJXgAAAAAAAAAAAAAAAAJh/uxNf+Sfuup5+f3Q+m9fH3//ALG+RfNLz2Z/xq6q/TDjf4tstdP33/8AV94Bz9H4T+tPv1wyUSk4ozAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcU51yW1wzhfK+W3/TWzxrj+23l2k/1Fbeswr2ZOkvnT9DWNqvn50+X33F3tmNPT2tu3by62vlzz3+XbFSbz3+52h97pbhMnUnUnA9P4ptGXmuX4/i8c1/Fefe2sevXy/d75PT7qrP6qbvJ5J1N6g7/AC8i5lZG25pybOnfuS9U5xv7jMna8y+/SFqsIR/BGNKfeVgcpnts8lyGe9ptbLubN5tPzmLZrzH7Udo/Wb1/QnF4eF6J6R4nXxUwYuP6b4XVripHatZxcdr1v2j7dskWtP3ZmXAnAdrAT0/YGdBdX0u7JdJ1Drrvh7/rPuNhy2/s70Y/SL2osVsaXDwrc6QhKmHZytPlX7duVZ+L169Ok60n4pOvwH4LFxfReHkPh9tjmc2TbtltH11sNfLhpSJ7R9ZW2G1oj19bWnv2mO2qR72LxX3uuvab5Po/6s8/E+GvHanT+LSx2t8DHyGWMvJbGzes2tE7OTByGDFe9fLE48eOvl+t7zvFZtVfAAAAAAMVe9votpev3a11p6a7jAjsJ7XgnIsvSWq0jWVnkut1OZl8fyYVlCfiWPtLeNdp4pStawpSlafXTq3WnDYee6X5njctIyTl0di+GPT02ceK99e0d4n1rlilvu9uzPPsyeJXJeEvjr4ada8dtzp10Oq+G1+Tv3tFcnC7vIa+vy+C3a1e9c2jfNjnvPb671iY9FZLvNXd0m73Glv0rS/qNpsNXepX66XcDLvYlylf3/Xal5Vq58U4M2bDb8Vhy5MU/n47zSf34buPF72Pk+M47ksX+1cho6m9i/8A5e3r49in/i5IfLepznOemXP970q6hcL6j8ZyJ42+4RybS8n1d2EpR/37pNjj7HHhOsZRrW1O7jQjcj5pSUK1pX5Vc7jN/PxfIafI61prn0tnDs4piZj6/DkrkrE9u3pM1jvH0w6v1t0lxXXnSHUvRnN4q5uK6n4Tk+D36WrW0/U3J6ebTzWp5omIvXHmtNLdu9bREx8k3/iPvB/YNXiPGpcq5F1LxuVfmHrI8ixMfpvusvHs7mGHZhsaWMy3KNvItSy43Z25wjSlYypSnnx5rNbU8f8AoP6k1vqrY5Ku18DFGxSvHZrVjNFKxk8t4ntaPN3nvH0fbawnUPuifaxjqHmq8Dw/ROfgfwU3rcPsZus+N18uTjbbOS2n8XWvWb4cldeaVtS094tWfl37R9e57wp7PKP6je9T7n8PTjdQ/wBPl7p9oDw+j5Z+Tn/vdmh86vuhva/n8VxXQ1P/AOs+Nt/g7PSue8Nez+j+o2HU65/DwLbQ/wBNurwn2gegfoycnP8A3Blj/E5VPdA+1vP4vU6Hp/8A1Zx9v8Foelc94g7Co1/S59TLlPw/3GbOH8vzsVq8J9oPoT17TyU/a/1Hljv/AOK5FPc++1dP4uvRNP8A+pdK3+DLH6/+N6dz3ibsWj/g8XqVc/8A8V2EP9OJV4T7QnQ8fKvJT/3Lkj/9Dk09zx7Us/i8/RVP+/2pb/Bnj/p9t6dz3i3sij/g9R1Jufw8fzYf6cGrwn2huio+WHkZ/wC57x/7P/p9tyae509p2fxfI9F0/wC++tb/AAbMf9PtvSue8Z9l0fPw+N9R7n8OpyYef59dX/v/ADvCfaH6N+jW5Gf2K0f+zcmnub/aUn8XzXRlP++GG3+Dcj/p9t6c/eOezuP6jh3UWf8ADh3of6dVX/v+B4T7RPSEfLT5Gf8A7Ex/7Jya+5r9oufxXUfRtP8AunHb9b03oelc94/7R4/4PgPUS5/+hOH+nT1/7/feE+0V0nHy0OQn9aY/9i5NPcz+0HP4rqzo+n/2q2/wcjD07nvIvanH/B9NOoVz/wDv0h/p0lXhPtGdLR37cbyE/a+u7d//ACEuTT3MXj1P4vrbpCn7FNv8HJw9KfvJna/H9R0m6gz/AP1jbh/p0FXhPtG9M/RxXIT+yRH/ALByae5e8cZ/Fdf9I0/7jvb/AAcrD05+8pdtcf1HRrn9z96u7sQ/08cq8J9o/pyPlw2/P7PWP/2dyae5Z8aJ/F+JHSVPzuMy2/wcxD0p+8sdvEf1HQzntz+HkuLD/Txmrwn2kOnvo4Pfn/umsf8A7M5FPcq+ME/i/FLpOn/eXYt/g5uHpT95f6CR8+jt/wCeXPwf8b8GHn+fi1fDwn2kuC+jgN6f+66R/wDsrlU9yh4rz28/i30pT7f+x7at2/a52O//AE/X9O57zL0Qj+o7cudXP4ec66H+niVf+/8An8J9pPhI+XTu9P8A3djj/wDZHJp7kzxOn8X4y9LU/O6W3Lf4OoIenP3mvo5Hz6O2XnFz8H/KFq4ef5+H18PCfaV4ePl01vT/AN8MUf8A7G5FfckeI09vN43dL1+326Q37dv/AMRR3elc95x6UR/wfaxze5/D1M1EP9PC6/vf96fPwn2luKjv26X3Z/75YY7/APmbk09yH17P4vx36Yp+d0TyNv8AB1JH/T970bnvPHTaMvFvtJ5rcj4/VfdX0cPn5+rxXhFf4freE+0xxv0dJ7s/99cEf/sTlU9x91nMd7+0F0zSftR0Dylv1+8dTw9a77zzwCsafB7R+Ywl8/NbnVfSTp+94pHhMa/h+/8AyPC3tMaH9b0nuR+fyuCf2u2k91Pce9WRP9M9oPpy0fap0BydZ/bnqe3+B8657zrxSv8Agu1Hk0P3p9TtRP8A0cQi9c+0vq/R0rs/r8nh/wAWm5lPcgc/Hb4nj7wtvt+XofkK/wCHqGXo3fectLXz8LtZ3cfwevqNrJfw+fHF6f6XhPtLYfo6XzR6fTyOOfX9zOVT3IfJR/tnjvxlvt+Xo3dr+135yf33oXPebseta/C7YdjD8Hr59gS/n8cej/3r+89c+0rX6Omckfn7+Of/ANnhy6e5FzR/tnjjqW/Q9J7Vf8PMW9Ho3Pea8mvn4XbTehX73r5riz/0aWLwn2lbfR03P6+7X/M/9PtOVT3JGCP9s8a8dv0PTOev+Hk5/wAP6z0LnvM+7r5+F2424fX49fLbE/4Pq1cXrn2lM/0dOx+vt1n/AAYocqnuSuMjt8TxlyWn6fL0/kr3+3896XoXfeZOWV8/B7ecCP4PXySMq/5sKNK/zfe/f+XhPtJ7f0dP44/P2e//AOiHLp7k3p+PxfjBt2/Q8LNf8OzPb996Nz3mHn1f8F0B0sf4+8lKv+a1H+j/ADvXPtJb/wBHA4f18/8AyVcqnuT+k4/F+LXJ2/Q8XWvf9vJbt+1L0LnvLvVCvn4XQrjcfwevZ3peP5qx/wC/4PqeE+0jyfb63g9bv93Lb/lcunuUuho/2zxU5q36HRxV/wAMS9C57y11hr/guiPEY/x8vKnT/wDZyIV/B+H771z7SHMfRwupH59rT/8Aqhyqe5U8Oo/2zxO6it+h19evp+vht/gejc95W65Vr+ldGeDR/enPOl4/yc+Pn/M8J9pDm/o4bR+53nJP+DJDlU9yv4XR+L8SOqbfb8tdWv7XfVn1ehc95S7hK/4LpF08j/Hs7KX+am1p5/no9c+0f1B/W8Tx/wCvGT/Fl9f3nLp7lnwhjt8TxD6wn7flyaUd/wBvQns9G57yf3K1/wAF0q6ZQ/B6sHbS/n8byLwn2jupPo4rjI/Px5p/9vDlU9y54KR2+J171xb7fl2uPr+134uWSXZ77wD1c6y9wfTzpX1O6Y8Oscc57vsHjVvN4vazsDY4Gw2t+GHg5Mp5mw2Vu/YhlXrNb1qNm3Ktuk/FyPmkqdi6Q8e+X5jqDj+L5PjNONff2MetF9WL0yY8mWfJS0ze+SLVi9q94isT27+sfNhf2ivdJ+Hvhv4Q9Ydd9D9b9SZeZ6U4na5u+tzl9Tb09vU0MVtnaw1rr6mlfHltgxZIx3nJeIvNe9Ldu0yu0qVB7VF7YntBt92HaHy2GmwrV7qD0rsZXUDh+TKFJXKWtNajm8jwoxpSN29cztBi5+LiWYXI/wC+r8JUjcrX0SxV4v8ASMdV9JbcYaRPIcXW3Iadu3ee2GPPsU+3M3165K1iJ/FWj85Pn3c/tEX8AfaG6ftyWzkx9IdeZcHSPUeCLTWk35LJOtw21a0zOPFTV5bPqZ9jJak/0jHaJtSI80V5WTj38TIv4mTanYycW9dx8izdjWFyzfsTlau2rkJUpKM7dyMoTjKlKxlStK0pWiv21bUtatomtqzNbVmO01tE9piY+iYmJiY+22+8ObFsYcWxgyVy4c+OmbDlpaLUyYstYvjyUtHeLVvS0WraJmJiYmPR4X49gAAAAAAAAAAAAAAAADsTpJ1J3/R/qZwfqbxjKv4m54TybT8hxZ2LlbU78dbnWcnIwpzj86WM/Ht3cPIpStPVZvzj5p58vocTyWxxHJaXJ61rUzaWzh2KTWe02+Hkra1Jn+xyViaW+3W0un+IHRfE+InRPVHRHOYMWxxvU3CcjxGeuakZK4p3dXLhw7Naz6Tl1M16bOKfoy4qT2nss3e2Trdx/uM6EdM+snG8qzl4HNeL6/PyZ2JUlasbqzaph7/ChWkpfLB3WPnYnzrWX6T8/n5WWdNc1r9RcFxvMa163x7utjyWmvyrmrHk2KR6z+IzVvT7cdu0+rSM8bvDDl/BvxV638OOa18mvtdM87uamCuWJi+XjMl52eJ2bRMV/wDjXG5tXY9I7dsnp6O933GKgAAAAAAAAAAAAAAAAAAAAAAAENP3iru9jzTqbxHtX4lta3NJ05jjcn51DGveq1k8o2etnc1uLKVuVITs42p20fjWJ0nWGZZpWtYyh6aQ89oXq6N3k9TpbUy98HHRXa3orPpbay45nFWe09piuHLHeJjvF6/P6I2Qfc7ezxPTXRHUHjx1BoRTlOsrZ+D6WtnxdsmHgtHdrTdz1i8TauTNyHHz8LJXyxbWyTHaYt3mMmjUu3AAAAAAAAAAAAAAAAAAAbkvYqdl1zup7p9Rynkmurk9MejNy1y/k1b1qtcTZ7SxK3Y0ukjflStqOXTNzcXbxt1pclOxr7vi36fM45g8GejZ6p6ow7Wzj83GcNMbe13j63LlrMVw4Yt8ov571zRHrM1xz6du8q4veX+0rj8B/AjkOB4bcjD1x4k1v07wcY8kRsaOjlrky8nydsUT57a862tn46bxNa1y7lO9u/atrASEIW4Rt24xhCEaQhCFKRjCMaeIxjGlKUjGNKUpSlKUpSlPFE94iIiIiIiIjtER6RER8oiPoiGpLa1r2te9pta0za1rTNrWtae82tM95mZmZmZmZmZnvL+n6/AAAEJD3kTieJpu7Lpxyeza9GVzLpzK7mXfFKfGroZanU2PnSlK1+HajSPzrXx9VPFELPaM1K4eq+O2ojtbc46ZvP25wTixV/aj0bOHuZOf2OS8Aes+DyZPNg6c6yimtTv3+HHK15Dfyx2+jz5J8376Osj0uIAAAAAAAAAAAAAAAAATCfdipR+5d3WR8V9Vef8ATmVK+fl4pxzkNK08ePr81p8/P8iXfs0dvwM6pj6fq/jv2vqfY+hrr++/ifw9eAlvTt+FPrKPu9/wY4iY/W7RP0JR6Tqi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0J3UXL1rtq693cenm/b6RdQJ2afOnm5HjOyrCny+f6qlHweqZtHTfPTX8VHE7817enr9TZO377LHgRTHk8avCimX0xX8Qukq5J+1Seb0ot+93Ve+9rKW73Mp/q67XY1l/Grl3qy/wA/lWVnmZz5pn5zlyTP5/ns3kuLiteM46K/iY0NSK/oY18cR+92fKepzgFmX7PHU4uj7KO3PV4cLdvGxenmJ8OFqlKW6fH2OxyJ+mlPl853pVr9/wA1r5+aybw+xUwdF9O4scRFK8fTtEfL67JktP78y0mfbA38/Ke0z4yb2xa982fq/P57Xnvefhaenhr37/apjrEfciGZruSNoAAAAADx3bVu/auWb0I3LV2Erdy3KnmM4TpWMoSp9+Mo1rStPv0q/JiLRNbRExMTExPymJ+cPOl74r0yY7TTJjtW9L1ntat6zFq2ifomJiJj7qrL7g9da1XXTq/r7Hp+Fj9R+Y0h6P1NI3N7m3fEfnX5R+JWn1/eVf8AUGOMXOcvjjt2ryO3Edvl657z6ftt7Hwi3Mm/4W+He3l7/EzdGdOTbzfipmvFatO8/dmK9/13T75DIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADL/ALBP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0efaxjv7OPjJ/xf9Tz+1xG3KzZWVNI14sixZyrF7FybUL+Pk2rli/ZuRpO3es3oSt3bVyNflKFyEpQnGvyrGtaV+VX5atbVtW0RatomtqzHeJrMdpiY+mJie0w9mLLkwZcefDe2LNhyUy4slJmt8eTHaL0vS0etbUtEWrMesTETCvB9sD2gZXab3dcvs6zBljdPuqN27z/AIPcpD9BHH2l2cdzjXLkaRt0uw5DZ28rVqMYVhi/C+UqU9cq+vFzpG3SnVu3XHjmvH8nNt/Rnt6eXLP9Or37RHeNiM3asdu1e357cC93d7RGDx+9nvp7Lu7UZuruhcePpLqik2+vtm0cdbcbnrS0zeaW4fJx0ZMk2tFs/wAT1ifrY1VMWp5AAAAAAAAAAAAAAAAAAJa/u43dvW/jc87TeW7b1XMet3mfTi3l3vFfgS+FXb6HXwnKnqrSddnu7sYeZUp8SXppGla0ld7O3Vneu/0pt5e8177nHRaf630+LgxxM+vafi55iPWI7z27R6a/fvlPZ9jFm6U8f+n+P7UzRj6a6zvr4vT4sfE/A/lty9Y+t71jS4ylrdomfJHmmZiEsFKpQWAAAAAAAAAAAAAAAAAAAAAAAx/7puuvH+2zoD1P6zcky7WJhcL4xmZmLK7KkaXtxl1t63R49KVrSsqXtxm4NudI18+iUq0rT63wOqOc1+m+B5Pmdm8Uppat707zH12a3bHgr27x375r0ie30T+uy34E+FnL+NHiz0P4bcLr32NnqXnNbW2IpEzOPjteL7vKZu8RPacfHa21esz6easd+/yVlPVjqTyLrB1J5t1N5Vl3sze825LueRZs71yVytiW12GRm28O1KVa1pj4Vu/HFxo1rX0WbUI+a+PKtbleS2OX5Ld5Pava+fd2c2xebT38s5clrxSP+DSLeWsfRERDdu6B6L4fw76M6Z6J4HXx6/FdM8Lx3D6tcdIp8WNDUw61tnJFYiJzbN8Vs+a0RHmy5LW7R3devnu3gAAAAAAAAAAAAAAAAAPd1uvzNvscDVa6xPK2GzzcXX4ONbpWVzIzM2/bxsaxbjSlayndv3YW4UpStaylSlKVq88eO+XJjxY6zbJlvXHSses2ve0VrWPuzaYiPz3G3dzX4/T29/cy1wamjrZ9zazXmIph19bFfNny3me0RXHipa9pme0REzKxS9k32c43Z72ncQ0G0woWuofPcXE5vzzJnZpay4525sy2Gv0+TGVPiW72hws6OqvQlWla3MatZQhKnppYT4U9H16Q6U1NfLSI5DfrTe37THa3nzV+Jjw2iY7xOCl4xWifpr8oad/t++0Zm9orx+6i5bQ2bZOkOk8+x0x0phrknJr21eNyRp7fI4LRPktj5XZ1Z38doie1M8RFrRPednLJiEAAAACGd7zPKtevfblGtKeI9MuWePFPnX1ch1dfn+H5/wCb5Id+0pP+v3Tsfa4zb/f2MX/I2RPcl17eFHjJPefrut+A9J+UduI3o9Ptd/p+6jMI1rtAAAAAAAAAAAAAAAAAEwP3YuX/ACbd1UPw856dy/m4/v6f0pc+zR+N3VP/AG7x38BsNdz331e/WngNb7XS/WEft8txKUqk+oqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdedXON3OY9LuofFLNuV27yThvItJbtxp6pXJ7PV5OJGEafPzKUrtKUp4+t8/ltadzi+Q1YjvOxp7GGIiO8zOTFakR2+n1l2/w/wCap05110hz+S8Ux8N1Jw3J3vae1a10t/BsWtM/RERj7zP2lWpzvBlrOb8y1so1jLX8q5DhSjWnisa4u3zLFaVp96tK2/HhWDvUnFu7mOfSce1sUmPtTTNes/4G9X0ttRvdMdObtZi1dvgeI2omPWJjY4/XyxMT9qYv3hxVxX3gFkJ7KDqBg9RuwTt22+NkQvZmBxC/p9tajL1SxM/C3W0pSxc+da0n9EljXfFfFfTcp8vHhYt4V8hj5HoPp7LW0TfHqWw5Yj+syUzZY8s/d8nln9dpme310js9He1n4xcfmw2x6+11Di5Hj72iYjY1NrjdGZy09PWv1RXPj7x3jzUn17xMNijISHQAAAAADi3OOUYfCeGcr5jsJwtYHFuPbjkGZcuypG3bxdRgX8+/O5KtaUpCNuxKsq1rTxGlfnT63F3dqmlp7W5kmIx6uvm2LzPpEVw47ZLTP3O1X3emOD2ep+pOB6c063vt87zHHcRrUxxNr3z8jt4tTFWlYiZm03y1isdp7zMKs3qpuKch6ndRN7S78aG35xyrY2rvmlaTs5m8zr9mtK0+VY/CnCka/fjSnzqrA5TN9UcnyOfv3jNvbWSJ79+8Xz5LR6/nTHZvYdCcdPEdEdH8VNPh247pfgdK9O3aa5Nbi9XFkiY+ifiVt3+73cCcB2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABl92DVrTvI7c60/dZ4R9otc7b0H/Vh07+m2l/GMaPPtYfkcfGT/i/6n+8+4s2llbSNAaWvbhdns+5jtP2fMuM636X1D6J/H5lqZWbVJZGXx7Fj8Tk2NenSlZ1x8HSfmpsbVulaU+kR9Va1p5Ya8bOkJ6l6Vy7mtj8/IcL5tzFMR3tfXpHfZraY9fLTD8XJER/XR6+iyv3YHtFV8E/H3R6c5vd+p+j/ABN+F03yEZckxi1+Yzz5OEz46TPljNtcnOjp3vMTPwrdo7du6AbKMoSlCVKxlGVYyjWnisZRr4rStK/OlaVpWlafeqgZ8vm2zImLRFqzE1tETExPeJiY7xMT9MTHrEvwfoAAAAAAAAAAAAAAAADITtV678h7auv/AEx6ycczLuHkcQ5Rr8nY1teqtcjj+Vdpg8hxPRGVKTllaXJz7Fv1UlSE7kZ+iVY+K/f6X53Y6b57jOY1rzS2ps47ZO3efNr2nybNO0THfz4LZKx8/WYntLEXjx4VcR41eEvXHhvzOtTZw9RcHuYNKL+WIw8vgxztcPsea0T5Ywcnh1ct+3lm1KWr5oie8WbHS/qDouq3TvhnUfjWTZytLzPjen5Dgzs3YXo24bTBsZc8WdyH6Gt/EuXZY2RHxSsL1qcJRjKNY0sr4zkMHK8fp8jrWi+Hc1sOxSYmLdoy0reazMenmpMzW0fRaJiYiY7NI7rnpHlegusOpOjebw5MHJ9Nc1yPD7VcmO2Kb30drLr1z1pb1+FsUx1z4besWxZKWrM1mJnnjnOqgAAAAAAAAAAAAAAAAAAAAAIifvGnd9PP33C+0fiO3rGxo/ovMepdrFveJyzMzAuXdJo86Ea1pPGuYGxwNxGE40lG/ZtSpWtKIl+0P1d8TPpdJ6mbtXB5dzkopb1m96TOHBkj6aWpkx5o/wCFWJbCfubvZ5rq8T1L7QfUPHxbJynx+m+icmfH3rXW1tuuPlOU1bzETXNTa09rjpmszE4suSJjvKKmi2vlAAAAAAAAAAAAAAAAAAAbsfYe9lk+53uew+ofJ9dLJ6ZdEJ2+Sbj49ms8HbcjlS3Y02iuXK09EL8K5tN3bpWspSjra09HprWVM0eCfRk9TdTU5DaxzbjOEmNnN3r3x5dj0rhwTPbtFu9/jRHf5Y59FZnvP/aWr4IeB2z0fwe5GHrfxPpfheN+Fkim1x/DRNsvJcrWkT5rYbRrTxl57REW3Y+uie1bT5oxjGNIxjSMY0pSMY0pSMaU+VKUpTxSlKU+VKU+VE8Pl8mp3MzMzMzMzMzMzM95mZ9ZmZn1mZn1mZ+b9H4AAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAl++7GS/5Pu6eP4eadP6/zaLdpcezR+N/VH3dzQ/gM8/4mvB772P8AZf4ET9rprq6P2+V4uf8AElNpQKJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFap7S3o1k9C+9frxwiWLLH1tOYX9xpLtYVhDM124xcbOlk2qeKUrCubey7VaxrWlZ25fPz5pSuDxJ4e3Cdac7peSa4/quc2Ge3pfHmrXJNo+555vHp6d4bqHsVeI+HxS9mbwp6ojPGXdnp3Fx3J4/N57625x2fPqxhyT37+eNXHr5O09p8t6+nbswSdGSoAS4Pdwe63Ev6zqD2ncj2NKbK1mZHPuCWsi7StzLx54FixutXh261p+lazG08tjOkaSrSuXKsvFPFUsfZ16ppbHyHSuxk/psXtv6MWmO96zjrXNipHp6Yq4fiT27/i5me3za+vvmPATPi3ekfH7htOZ0smti6T6qvhxzFNfNTby5eM3tm8d/wCmbubkY06+aYifqesV9fRK4SnUIgAAAAANOPtuO63C7cuzrlHGNfsI2Oc9arOdwHQ4cLkY3ruo2FiGHym9WlK+uMbemz78rc6eKVnCtPPyrRh/xq6px9O9H7WtjyRG7zUZOPwUiYi04clYptW7fPtGDJbtKxv3Y/gJs+MntGcHzm5pzl6X8M8mr1Zy2zakzjpyOnltscDiie3lm1+S1cVb1nv2raJmPVX7SlWUqylWtZSrWUq1+da1rXzWta/hrX51QH+fzbbkREREREREREREfKIj0iI+5EPwfrnvTXpf1A6w8u1fBOmfE93zPlm5vRs4Gk0GvydjnXa1r+ju1sYtu7djYsx83L930VjatRnOXiMa1c7jeM3+X28Wjxupn3NvNaK48ODHbJeftz5axM+WI9bT29IiZ+UOqdadcdJeHfT2/wBVdbc/xnTfAcbjnJt8ny23g0tXH2j63H8XPfHScuS3amLH5vNe9q1j1mG4niHu/Hf3yXS4m42Om4JxmWbahftazacu11NlZtzpTxHNxZXLF3DyI180nj3YeuPila/qqMvangF17s4aZsmHQ1vPEWrjy7eP4kRP9nWZrNLR8praO8K6eofe4eybwvJ7HHafJ9Vc3Grktiybuj09uTpZL1ntM62etMtNnFMdprlx28tu8xHyco/O7PfT/wBZ6a/lVrv625X8731z/Zcb+68f+U+F/RhvZZ/3HrT+4O5/Jz87s99P/Wemv5Va7+tn8731z/Zcb+68f+Uf0Yb2Wf8AcetP7g7n8nPzuz30/wDWemv5Va7+tn8731z/AGXG/uvH/lH9GG9ln/cetP7g7n8nPzuz30/9Z6a/lVrv62fzvfXP9lxv7rx/5R/RhvZZ/wBx60/uDufyc/O7PfT/ANZ6a/lVrv62fzvfXP8AZcb+68f+Uf0Yb2Wf9x60/uDufyc/O7PfT/1npr+VWu/rZ/O99c/2XG/uvH/lH9GG9ln/AHHrT+4O5/Jz87s99P8A1npr+VWu/rZ/O99c/wBlxv7rx/5R/RhvZZ/3HrT+4O5/Jz87s99P/Wemv5Va7+tn8731z/Zcb+68f+Uf0Yb2Wf8AcetP7g7n8nPzuz30/wDWemv5Va7+tn8731z/AGXG/uvH/lH9GG9ln/cetP7g7n8nPzuz30/9Z6a/lVrv62fzvfXP9lxv7rx/5R/RhvZZ/wBx60/uDufyc/O7PfT/ANZ6a/lVrv62fzvfXP8AZcb+68f+Uf0Yb2Wf9x60/uDufydqV7n+2zn/AGn9XeQdGOpctXPlnG6Ylc+Wny7ebg1pmYljMtfCyLU7kJ/pV+FJeJV8SpWlfqYo6m6c3+leW2OG5L4U7Wt5PiThvF6fX1reO1omYn0tCwHwP8aOkvH3w94jxK6JjejgOZnYjUjkde+rtROtsZdbJ8TDkrS1f6Ziv271jvHafpY9vgMugAAAAAAAAAAAAAAAAMvOwj/HH7c/xtcH+0etdt6E/qw6e/TXS/jGNHr2r/yOXjJ/xfdU/ebcWbiytpGAPR2etwdzrdhqNnjWszW7XCy9dsMO9H1WcrBzrFzGy8a7Gv6q3fsXblqcfvxlWjwy46ZseTDlrF8eWl8eSk+sWpes1vWfuWrMxP3JcrS3NrjtzU5DRzX1t3Q2sG5p7GKfLk19rVy0z6+bHb6L4stKZKT9FqxKuI9qH2nbPtF7tuoPC6Yl61w/lWwyObcCzLlqtq1naHeXa5OTHGj6Yx+Brdzc2Opt+jzSkcKnmvq8q6/E3pTL0l1ZyGl5JjT2slt3QvMdovgzz5rRX0iPLizTkxR27/iPm3LPYZ8ftL2hPZ96Q6l+qMeTqLgdPD0x1ZrUv576vLcXT4GGc0+abTl3eNpp795t2+u2Z7R27NdjHyYQAAAAAAAAAAAAAAAAACaj7u73cXepHRnlXbTyrafSORdJb13c8St3rta37nC9rmwvX4yrOUpXJ2N5tMm3apH0xt41uEPR4j6ky/Z86snkeG2um9rL5tjiZnNqRa3106WW8Tb5/Oa58tojt8qxEdmtL74T2fcfRniTwPjZwWjOHh/EHHj43qC+LHEYqdS6GtbHitHkrFaVy8Xo4b3m3eb5r2t5vXskjpGqYQAAAAAAAAAAAAAAAAAAAAHT/X/rBx3oH0Z6i9X+U5ljC0/BeMbDcTu5M4ws3c6kKY2ow5SlKNKfT9tkYWFH5+fVkRpSla+KV+Rz/L6/A8NyPL7V60w6OtkzTNvlOTt5cNJ//mZrUp/9pkTwl8O+Y8WPEjo7w84HXy7XI9U83qcdTHhrN8lNWbTm5DYrWImZjU4/Fs7NvTt5cU9+0eqsl69dYOS9e+sHUHq3yvMyMvbc25Pt91SmTcrdnhYGVm3rms1cJ18VrY1evrj4FilaeaWceFK/UrU53l9nnuX5Dltu9r5d3ay5vrp7zTHa9pxYomfXy4sflx1+5WG7l4U+HfC+FHh30j4fcBr4dfj+mOD4/jO+GkY67O3g1sdN7evWPT4u9txm28vb0nJms6hfJZCAAAAAAAAAAAAAAAAAAfQ1Gqzt5tdZpNZYnlbLcbDD1evxoUrWeRm5+TbxMWzClKVrWV2/dtwpSlK18y+p7MOK+fLiwYqzbJmyUxY6x87XyWilKx92bTEfruJyG9q8XobvJ72WuDS47U2d7bz2mIrh1dTDfY2MtpmYiK48WO9p7zHpCxq9lr2f4XZz2ocI4bl4kbfOuWYWLzLn+Vcs0tZtd1u7NdlDU5fypKsuP28+eoj6vTWscWlZRjL5UsP8MOkadIdK6WnekRvbdK7m/ea+W/xs8fFjFf6e+vGScMd/opDTd9ur2idn2jfH3qjqTX2Jv0rwG1sdN9JYKZPia0cZxeSNK3Ia/aZr5eYvqV5G3bvHmzz2mY9Wx5kVDQAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEvf3Y2VKcG7pIffry/gUv5tJuafX/LVLb2aZ/1F1PH0fVmhP/kM7Xl997WZ6p8CbfRHT3Vsft8nxn/u/bSoUolEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJT7yH2tZEMrpv3Wcf13qw/olrp9zi/j2qxt4lbeffydFsMu5GlaSvbHM3U8GEp1p5pixpStfHhFD2i+l7RbjuqdfH9Z5Y0N61Y7RTtktbBkvP02yXzTSJnt6ViPobAnuZPHXDbB1p4C8vudtn6ov1f0vizZO99iL6mLByupr0mYmMenr8bXatFe/ac9pnt3RPUVl+gDt7oR1s5z28dVuGdXuneyua3k3DN1g7XGrSU6Y+fYxsm1eydVnwtztzva/Y2rcsXNsxuW5XMe5OMbkK19VPrcFzW90/yuny/H5Jx7Onmplr6z5cla2ibYskRMTOPJETS9YmJmszETHzY98VPDPpfxg6C6k8POsNKm7wnUnG7Whn7xWc2plzYcmPBv6lrVvXHuaeS8Z9bJal60zUra1LxHlmxs7G+9Dpr3sdFdF1J4RscaO9sYtjB5xxiuRbnsOOchtWbX0uxkWaem7DHyPiW8nFuXLcKVt342/M5W5TlYj0R1lxvWnC4OS0clfj1rXHvavmicmtsRWPPW1fSYrbvFqzMR6W7evbu02/ai9mzrX2ZfEvlei+p9PNbi8ufLtdMc5GG9dPmeIyZL/U+XDknvjtlxeS+DPSt7TF8U3mKxaKxmc7ijaAAAA646t9WOC9D+nnJ+qHUje4nHeH8S1mTs9rscu7bt09Fi1O7DFxo3JR+kZ2XKHwMLFt1rdycicLNuNZypR87luV0eE4/a5Pkc9NfT1MVsuXJeYj0rEzFKxMx5r3mPLSketrTEREzLufh90B1V4n9X8H0N0XxWxzHUXUG7h0dDT16XvPmy5K0tnz2pW3wdXXrb4uzntEY8OKtsl5itZlXae0g74+U983X/cc7zJ3cHgXH63NB054/W5clDA0GNfv3I5eRSUqQuZ2fk5GVkTuwtWfTj3bFisZVs1nKvfxF632ut+fzb15mmhr99fjtfvMxTXra0+e3ee03yWta0zEV7VmtZj0bhnsZ+y7wXsueEnHdKa9ce11Xy3l5brLl4pSLbfL58WKk6+GYjz01dTDhwYaY7ZMnfLTLli0RkitdfLoCXICbz7vj2manpx225vcHyTj+LPmfV/bZF/je4ycWEsixwfWxs4GNYxpXozlblXd4m6nO/ZlD4kLlLdY/ofnNXwB6Uxcd05fqDZ16zu8vltbWzWpHmro4+2Ota9+8xPxqZu8x27xMR29GsT73bx/3+s/GjW8IeF5fPXpvw74/Di5rjsGxaMOXqndnLtZ8uauOa1vX8C9jja1x5It5LUm0T9ckPpBqfQAAAAAAAAAAFfN7cv8AZDur370NB/L/AMAauv8A8kA/G77IHLfsH8BibdHuufyH/h7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZd9hNfHeN251r+61wb7R612zoX+q/p39NtH+M4ke/aujv7OXjJEf733VP3m3Vm6ssaRYADQr7fDs9u9ee2ix1k4nqq5nPuiFz81L9MWxW5mbLhl6/WG3xbk4xlKOJprOZsN7crSlaU+BOsq0j5rTBPjv0hPO9N15jUxeff4Sfi28le98mnNu2WkzETPkw1vkzz9ryzPotc90/7RWPwp8bMvhx1Bvxr9J+KFPqHFOxlimtpdSY8Xm4/PStpittjksmvqcXSO8TPxaxHeZ7TBRQdbTgAAAAAAAAAAAAAAAAADNv2enc9tu0zur6X9UsXKla0VN7jaDmGLK7W1iZXG9/Wenz7+ZSlaeu3qrefLa2qVrSlL+HblX5U8O6eH/U2XpTqnjOUraYwfHrg269+1ba+fvhvN/l3jFF5yxHf8VSJ+hGT2vvA/j/H/wABuuehc+vXJys8Vm5bp3PGOL7ODmuJ8vI6mPWmYny3376ldDJMRMzi2L1j1lZS8e3ut5RoNJyXTZEcvUch1Gt3mqyoVpWGTrtth2c/CvwrStaVjexsi1cjWla0rSVPFVj2vnxbWvg2cNovh2MOPPivHytjy0rkpaPz62iWlny/FbvB8tynCclhtr8jw/I7vF7+C0TFsO7x+zl1NrFaJ7TE48+G9J7/AEw+w9z5wAAAAAAAAAAAAAAAAAAACKh7xp3f3tZquE9pPD9tW1kbatjl/UqOLf8A0X5nQt3J6jj+fajXzGORdu6vd2vX6a1pZt1pGsa+UWvaH6unFi0uk9PL2tl8u3yUVn/rcRM4cF4+ceabYs0d/orHb7a+j3N3s8Y97e6n9oHqLj/Pi0Iy9O9FW2MX1v1Za9achy+peY7WnFjpvcZfy94icl4mYtHZEWRMbCAAAAAAAAAAAAAAAAAAADef7Cnsrr3H9ysOrXK9b9K6bdDJw3WVTIs/FwNxy3Itxx9RpL9a0pSk7VjOu7u3WkqSpPWRr4rSla0zf4HdGfhi6kjldrFNuN4OYzW7174823aPLiwW9O0TWuSc8evfvihVv7072lv5jPgrbw/4HcjB1p4pVtxmCcWXybfHdP4r2zcjyeKInzTXJl1acZeJr5Zpu29YnsnkUpSlKUpSlKUpSlKUp4pSlPlSlKU+VKUp9VE6WqfMzMzMz3mfWZn5zP25foAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAl4e7HS/wCJ3dFH/wDGrgkvH/6m29P6f8/8KWns0/8AxTqf/trR/gczXp993H+yPwMt/wBgeqo/9JcdKVQlIodAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdFdynQLh3c30W530X5xjWrum5lpM3X2sqdql25qNpcxrsNZusWNfqy9Xlzt5mPX50+Laj5pWnyfD6k4HT6l4Xf4bdrE4dzBfHF5jzThyzWYx5qxP9fivMXr92IZT8FvFjqPwR8S+lfErpfPkx8l03ymtt5MFLzSnI6NM2O29xmeY/wD4ff1631s30/DyW7TE+qta7ne3vnHa91r5x0b57rcnA2vFttfs4eRdtThj7bUXZVua7Z4N6saW8rGv2JRhO9ZrK3TJtZFnzSVqUaVw9TdP73THNbvD7+O2PLq5bVpaYmK5cMz3x5aTMRFq2r6TMd4i0Wj5w3TPBDxe6X8cvDPpfxI6T3cO1x/Pcfiy7GLHkrbNx/I0rFNzR2scTN8GbFlibRjyxW84b4snby3rM9AvgssgMpu07vC61dm3UfD6i9HuRT19+k7UN1oM342Rx/kWDCVfiYW1wbd/HrchO3K5b+JZvWL1KT/wnyj47R0r1dzXR/I05HiNicdu8Rm1797a+xSPnTLSLV7xMTMd6zWfX5sFePvs7eGftH9GbHR3iLw9dvDNcluM5bW+Hi5fh9q0fWbOhtXxZYpat4raaZMeXHM1/Ees95pXZT7bjtf7ncTU8Y5/tsTot1Ru2bFjJ1PLNljY3HdpnSjGHnT73Lhg4sruXkeqGPrKVyMmFZW4Vu3JXKJldF+NXTHU1cWrv5acNyk1rFsW1krXXy3n0/pOe8UpM2t3iuLva0ekd57w1qfaY92N45eB+fkOc6S4/Y8TOhaZMuXByHT+lmz8xoa0Wm3bkuKwW2titNfF5bZd6Yw4bRF7RSkVlufw8zE2GLj52DkWcvDyrUL+Nk49yN2xfs3KeqF21chWsZwnSvmMo1rStPnSrMlL0yVrelovS0RatqzE1tE/KYmPSYn6JhWxsa+fUz5dbaw5NfYwXtizYM1LY8uLJSe1qZKWiLVtWfSazETE/N7LyekBrm7vPaj9p/Z5r86xzTnOBynnWPau0xenXEs7F2XI7mVGlaWbOzs41cq9pbF+7T4f0zLxJWrfic6xrSEqMd9W+J/SvSGO9d3ex7W9WJ8vHamSuTZm8fKuStfPbDWZ9PPekxHrM/JMf2evYX8ffaK3NXL010tt8F0rlvT4/WPUGpn0uGpgmYnJk0smeNfHyeXFTvf6m19iuS8+WkTE3iULf2gntQOt3fZyS7g7bJnw7pHq8y5c4z091d+9SzS36qSjm7/Jpc8bTZTlGNK3IWcXGjZtWIRxYzhcnchr194m831zszTNadPicV5nW4/Fae0R6T589u/bLlmY9ZiKV7RWIrE9++yr7I/sOeGHsr8Lj2ePw16j8Qd7XrXnOr9/FjnJNu0xOtxODyd9HSrEz2pbJnzTkvltOeaWpSmshjVNwB3H2/8ARrk3cD1j6fdIOJ4t/J2/OOTanSUuWLM7/wBAws3Ox8fO2t+MPnHF1uNduZmVdlWMLVm1Oc5xjStafY4Dhtnn+Y4/iNStrZt7ZxYO9azb4dL3rXJltEf1uOsze0z2iKxMzPZjnxb8SOE8I/Dnq7xE6gz4sPHdL8JyHKTTLkri+q9nW1cubV0cVrfPPu56U18FIi1r5Mla1ra0xE2c/RfprqOjvSjp/wBMNFjWsTWcK4vq9Has2aRpa+Pj2KTz7sKRpSPjI2FzKyPl9+7X51r862W8NxuHh+K0OMwVimLS1cWGKx27eate+SY7en12SbW9PttITxK615HxG6+6u645XNfY3upuc3uUyZcnecnwsuWa6tLeaZnvh1KYMPr9FPlHydnPpukAAAAAAAAAAAK+b25f7Id1d+fn9BoP5P8AgDWfL+n+VAPxu+yBy37B/AYm3R7rn8h/4e/ouW/X/wBd9/8A/d+s1AMRrEAAAAAAAAAAAAAAAAAGXfYV/ji9ufz8f8rfBvnX73/GTWu2dC/1X9O/pto/xnEj37V35HPxk9O//U96q9P+8u6s3VljSLAAfE5Lx7U8u47veLb7FhnaTken2Wi22HcpSsMnW7bDvYGbYrSVJUp8TGyLkKV8V9Na+afOj0bOvi29fPq56xfDsYcmDLSY7xbHlpbHePX7dbTD6fC8vv8AT/McVzvFZ7avJ8NyOlynH7FJmLYN3j9nHt6uWO0xP1mbFS3bvHft2+lWse0F7Yt12m90/U/pbn4l2zpYb7K3nEMutmVvFz+Obv0bTD+hTr5hes66uZLVXJ25SjS/hXYV9Mo1jSuHr7pnP0p1RyfF5KTGGM9s+nfyzFcmtm7ZaeSflaMfnnFMx3jzUmPm3TvZH8b+M8f/AAI6G671NimTk78Vg4vqLXjJF8+pzXGebR2fqmv4rHk3PqeN+lbxEzi2aWjvW0WnCl0xJcAAAAAAAAAAAAAAAAApWtK0rStaVpXzStPlWlafVWlfvVoHz+aeZ7B/u7l3Bdq9rpjyXZ1zOe9D8iXHsmWTepPO2PGr136Vp86luVfifRNdi52FpIXKUlD1YtI+v1eY0nT4F9Wzz/S0cZs5fPv8Jade3mt3vk1rW8+G/afXyY65KYYn1jvXt37+jVO96r7PVfCPx4ydb8Jo/U3SfifhrzGCMGOa6ulzePH8DktWbxHl+qNzPq7PJ2pMxaYzzbt29W8xm9VwAAAAAAAAAAAAAAAAAAA4F1S6haHpP065p1I5NlWMTScL45tN/nXci9CxbnHAxbl6zjUu3K+ml3MyKWsSxT51nevW4RpKUqUrwOU5DBxXHbvJbN60waWtl2Lza0Vifh1ma17z6d727Ur9u1oh2zoXpDlev+semujOEwZdjlOpeZ0eJ1ceHHbLes7eemPJnmlfWcethnJsZZ9IrixXtMxETMVlfdZ195H3N9fupfWbkuZfy7/LuTbHI1Mb9ZevC41jZFzF41r6xlX9DLB0lnAxZ1pGHrnZrKsI1r6aVrdU89sdS89yXMbN7Xnb2clsMW796a1bTTWx9p+U0wVx1n5d5jv2btvgL4TcN4I+EvRPhtwmti18XT3CaeHkLYvLNdnms2GufmtyLVj1rtcpk2s9YmbeWuSKxaYjux4dfZfAAAAAAAAAAAAAAAAAAfV0Wl2HJN3qOPamxPK2m82eDqNdjQpWU7+dscq1iYtqNKUrWtbl69CNPFK1+b24MOTYzYdfFWb5c+WmLHWPWbXyWilYj8+0xDgcryWnw3Gchy/IZq6+hxeltchu57zEVxaungvsZ8lpmYiIpix2t6zHyWP/ALM7tE1vZx2q8C6ezxI2+Z7vXY3K+f5lyzS3m3OR7y1XaZGsyq0pGs6aC5nXtTYrWlK/Bx4+rzWixTw26Sx9H9LaHHzWI3c2Ou1v3mva87OePiWxX+39Tze2Ks/2NYaZ/ts+0Lu+0d489V9X1zzbpvjNzPwHSWtTJN9anDcXeNHDu68d5iv4LU1cfIZYiZj4maZj0bBHf0RgAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAS6vdkJf8Ve5+P4eTcHr/ADafa0/pSz9mn/4r1N/2zpfwOVr2++7j/X7wNt/2F6pj/wBIaE/P9ZKuSlUMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANKXtkvZx4feH0eyOovTrT2o9dummtys7UXMOxSeXy/Q4dLmblcavWYUpdzMysfpdNNG1Kl76bmemsciPotUwx4w+HdOr+ItyPHYYjneNx2vhmle9tzBTve+tNY9b37ef4MV+u+JftMW9IWY+7i9srY9nXxFxdHdY8lknwq613cGryFNjLNdfp7ltia62Dm8eS8zTX14t9T/glN4+H9S68zFsVvNkmBLt9TsdDtNhpdvh39ftNVl38DYYOVblZyMXLxrkrV+xetTpGcLlu5GsZRlSlaVp86UQSzYsmDLkw5qWx5cV7Y8lLRMWpeszFqzE+sTEx2mJbXfH7+nyujqclx+xi29Hf18W3qbOC9cmHPr56RkxZcd6zNbUvS0TExMxPf5vnPW5gDyWr13HuQvWLtyzetypO3dtTlbuW5xr5jKE4VjKMqVpStJRrStK080r5fsTNZi1ZmtonvExMxMT9uJj1ifznhkx48tLY8tKZcd4mt8eStb0vWY7TW1bRNbRMekxMTEx82UfS7vc7sei9vHs9M+vHP+LWMXx8CxjbSGbahGlfV6KR2ljO8R81r8qV8UpXxTw7PxnWvVXDxWvG87v6tafiYrli8R69+39Nrf0YM659mPwB8Sb5snW3hV0lzuTP3+LkzaNta95mO3mm2jl1frvu/TPrPdlRa9tB7RS3bhbr1/wB5drCMY1uXcTArcn4p49U6xsRjWVfrrWkaUrX7ztNfGTxCiIj8Hs9u0du80x95+7P1rBGT3bHsd3va8eEnF44taZilNjbile8/iaxbLae0fKO9pn7ro/qX7SLve6twyMfnHcVz/Z4GRCVr8zrWXh4OJZsypWkrNn6Fh2MiMK1rKX6K/OdKyr4n9Xj4fJeI3W3LRau91Dv5cdomPh1vTHSIn+tjyUrbt+faZ+6yf0V7GPsw+H18Wbpfwd6S0dvFeMn1Zk19jb2MmSs965Mn1Ts5cNrRERHpirXtWO9fn3wv2W12e5y7uft9jm7TOvSlK7l7DKv5mTclKtZVrO9kTuXJea1rX5y8fP5OnZMuXNecmbJfLe0zNr5LWvaZn1nva0zKSeloaXG69NTj9PW0dXHERj19TBi18NIiIiPLjxVpSPSIjv27+nq9B63LAf1GMpyjCEaynOVIxjGlaylKVfFKUpT51rWtfFKU+upETM9ojvM+kRHzmftPy1orWbWmK1rE2taZ7RERHeZmZ9IiI9ZmflCZ97B/2bu16Ncfu91vWTQS1/OuZa6eL030W0xq287j/GcqxKzf3d/HvwpdxM7cxv5liFm9CM6YVvEyrX6G/GVZj+Bnhzl4fBPVXMYJpvbmOa8bgy17X19a1ZrbNato71vm816xExExSKXj8U1sveq+2doeI/LU8A/Djlq7fSvTe5XP1pyujmi+rzHN4MsZMXGYs2OZx7Grxs4tbLbJjtNfqq+xgv647ViSwkipVAAAAAAAAAAAAV83ty/2Q7q7/E0Hj5f/AGg1f8/z+/8AyfeQD8bvsgct+wfwGJt0e65/If8Ah7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZc9hla07xO3OtP3XOCU/n5LrKf0u2dC/wBV/Tv6baP8ZxI++1ZHf2dPGSP/AKveqvvJvSs31ljSJAAARyveGO0GXVLofx7uR4lqq5HLekF2xrOTyxbHxcvP4Ts8+Vq3CNu1H4sq63Z7S5scm/L4lLeFYn6qQhD10jv7QPSM8pwmv1HqYvNt8RMYtny172yaWTJMRHaPWfh5Ms5LWnv2pWe/aIXI+6C9oeOhfFDl/BfqDfjD0/4iY8u9wcZ8vw8Gr1NpakZL2te8zSv1bpaGPTwYo8k5NnLWIm1rRWYTiF7ZnAAAAAAAAAAAAAAAAAAbRfZF922V2n94HB9nn51zH4J1Hy8fgHNsWk6xt38bd3K42lvylWtbdqGHyC7rMvIvSty8Y9i5StYU8yjk7wm6st0r1do5cl5ro8jeuhu17zEWrmny4bT9ERTPbHe0zE/W1mPT5oM+8I9n7B4++zv1Ro6mrTL1V0bgy9W9MZ5rFr4s/GUjPyeKsR2vkts8Rj3dfFjraO+bLWYi0/WzYmY2TYzMbHzMW9byMXKsWsnGv2pUnavWL9uN2zetzjWsZ27luUZwlStaSjKlaV8VWEVtW9a3pMWresWraJ7xato7xMT9MTExMT9pp5Z8OXWzZtfPjviz4MuTDmxZKzXJiy4rzTJjvWYia3pes1tWYiYtExMd4ed5PUAAAAAAAAAAAAAAAAAAjS+8R94V7p90p4t2ucQ2lbG/6pTt7vnUce7WsrXDNbfnexsG58KsZY+VkbvE1eVGlydfiYXrpS1WM/XSN3tCdXzocVq9L6mXtn5SYz70Vn1jTxWma457THlvbNXFeO/zp39PXvF1nuevZ1x9Xde89469Q6HxeI6Frfi+lrZscRW/Uu7hrizbdPPFq5sGLjNjewT5ax5NiInzxNfLMMFDhsmAAAAAAAAAAAAAAAAAAAN9nsF+yuPcF3FXut3Ltb9J6edDJw2FmGRZpdwdvzTMtRxtZqsikqeKxsYWbl7e3KMqSjka6196laM7eBXRn4P9RTzW3j83H8HMZKxaO9M27eIrixWiY9YrS98sTE+lscfalVF71v2lreEfg5j8MentyMPWHilW2nkthy+Tb47pnXyTm3t/DMW7xOXZ1tfj7xasxbDuZPtxKdZ9X1JxNWQAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEuX3ZCv/ABc7nY+fr5Dwmvj+DVbOnn/Olj7NM/6n6mj7expT+1iy/wDK18ffdV/158D7fa4jqeP297SSs0p1CoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8rSlaVpWlK0r8q0rTzStPwVpX6w+XyRv/a6+xut9fq7HuD7ZdLha7qvYsX8vmvCsW3bsYvOrWNCtymfq7UPRKzyOln12pWbdMiOyjZxMexi2sis7t2Oni14Pxz05Of6awUx8rWtr7ulSIrXeisTPnxRHby7EV7x2jzRk7UrWtbd5m5r3e3vHcnhLGn4Q+N3JbO50DlzYtfpnqbPe+XY6VvmtFJ1d+9vPGThpyeW8ZL/CnSnJsZsue+KK46QxuUcX5BwrkO34pyvUZ+h5Foc27rtvp9njXcPPwMyzWnrsZONfhC7an4rGdKThGtYSjKlPEqIc7WrsaWxm1drDkwbGC8482HLWaZMd4+dbVmImJ+U+sfKYlsk8FznEdTcRx/P8DyGryvD8rrY9zj+R0s2PY1dvXyd/Llw5sVrY717xNZmtpiLVtX5xL4L0PqgAAAAAOyulXR/qZ1v5dgcF6U8L3/OeU7C5bhZ1PHtbl7PJt25y9MsrJt4lq9Oxh2Y0lcyMmcaWrNqE7k60jGtX0uL4jkub26aPFaWxvbWSYiuLXxXy2iJn8VaKRM1pHrNrT6ViJmfSJdL698ROifDDp7b6p696l4npfgtOl7ZeQ5jd19LBe9a964MN9jJjrl2MszWmHDW03y5LVpWJm0JfHsx/YZaLo3laTrT3X42t5b1BsVx9pxzp3Glu/oeK5dusbuLkbm5Sd781tljXaQybUbc8Ozj3o27WTjX6W7lLktvDTwQwcPbBzPVVce3yFfLl1uOjtbBq3j1rbNMd5y5Kz2tHaaVrPaLVntPfXj9t33pHK+I+Dk/DTwCz7nT/AEhljNocz1jab4uW5/XvE48+HjaTXH+B+lnpNsGS1q7GTNjtfJhzY5vSayUMfHsYlizi4tm1j42PbhZsWLMI27Vm1bjSMLdu3ClIwhCNKUjGNKUpSiR9a1pWK1iK1rERWtYiIiI+UREekRClvNmy7GXJnz5L5s2a9smXLktN8mTJeZta972mbWtaZmZmZmZl5n69YAAAAAAAAAAACvm9uX5/vh3V3+JoPH8H5g6z6/5fP8iAfjd9kDlv2D+AxNuj3XP5D/w9/Rct9999qAYjWIAAAAAAAAAAAAAAAAAMt+w3/HE7c/xu8E+0usds6F/qv6d/TbR/jOJH72q/yOnjL/xedVfeXdWcKyxpEAAAOI8/4ToupHCeWcB5NiW83Qcw49uON7XHuRhL1YW51+Rr8iUPXGcY3oWsiU7M/TWsLkYypStaOJv6WDkdLb0NmkXwbmvm1stZiJ+szY7Y7THeJ7WiLTMT9E9pdh6T6m5XozqfgOrOE2La3LdO8xx3NaGatrV8u1xu3h3MMW8s1m2O18Na5Kd4i9JtWfSVZt3mdu+/7W+5Dql0b3mJPHt8b5Llz0d2tuUbOVx3Z0t7XR3LFyvmN+lrWZ2Lj37luvp+k2r0fEaxrCNbHWPT2fpfqPlOHz0msa2zecE9u1ba+XtlwTWflbtiyUraY9PNE+kfJuy+zf4wcT46+DHQniRxexXNbm+F168pj89bZcHMaM20OUrlpHrinJu6ufNipaO/wcmOe9omLTi86yzkAAAAAAAAAAAAAAAAA8ti/exb9nJx7s7ORjXbd+xetyrG5avWZxuWrsJU+cZ25xjKMqfOkqUrR+1tatq2rM1tWYtW0T2mLRPeJifomJjvEvXlxY8+LJgzUrkw5sd8WXHePNTJjyVml6WifSa3rM1tE/OJmFh/7Hzu2sd1nZ/w3J2edDK550ws2On/ADOzSdJXLdzU262tDdnStazrLI47b1d67OVa+q9cnX5efCwXwi6sr1T0jp2y3i2/xla8fux39YnDHlwT6zM97a8YpmZ+czLT994n7PuTwE9onqPDo6tsHSnXOTL1d01kmnlpenIXjJyuOsxEViMPMX3seOsRHlx0r8/m2qMpIGgAAAAAAAAAAAAAAAAOO8v5RqeE8V5HzDe34Yum4vo9pv8AZ35zjCNvB1OFezsmvql8qSrasSjClfrnWNKUrWvhx9vaxaWrs7me0Vw6uDLsZbTPbtTFS17es/T2rMR919jp7g+Q6n57huneKw2z8lznJ6PE6OKlZvN9rf2cerhjy19ZiL5Ym3b5ViZ+hWj99fcxvO7Luc6odX9rmSydds+Q5ms4rbjOVbFjimlufmTx6tmEpSpCWTqMLCyMj0eI3L85z9MfV6aVudcdSZ+q+puT5fLfzY8uxfFqxEz5a6mGfha/aJme02xUpa3b52mZ7R37Ruteyz4KcX4A+CHQ3h3oa8YdzR4jX3eevNaxly8/ydPwQ5iMlorWb1w8hs7OHD5u80xUrXvPbvOILqSQwAAAAAAAAAAAAAAAAAD7fGuP7PlnIdHxfS488vb8h22v02txoUrKV7N2WVaxMa3SlPn87t2Pn8FPNfvPdra+Xb2MGrhrN82xlx4cVY9ZtfJaKVj9uYfM5rl9HgOI5TnOTzV1+P4jj9vkt3NeYiuLV0sGTYz3mZ7R6Y8du3257R9KyR9nN2l6js57Wun3TCzixt8py9Xjck55lztxjl3+Vby3+amywsicYx+JDTZebk6zErWnqjj2IRlKVfMq2M+HfSmLo/pfj+MrTttXxU2d68x9fbaz1+LlpafTvGG9746f8GI+lphe2R7QHIe0b47dXdc5c834LX3s3C9Ka9bzbXxcDxd/qHS2cNZm3kvyWDVw72xET2nNltMRWO0RnY7yiuAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACW/7sjL/gLubj96u84ZX+Wmt2FP6UsfZq/wBo6lj/AOX0/wB7Hk/5Wvt77qP9dPBGf+xnUsft7unP+JK5SnUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANX/fZ7Kjt072tNnbLY6exwHqzTFuR1PUjj2NatZU78aSni2t/h/Cnb2eut5EqyvWrH0PMu2rl23TNhWVuVvGXXPhZ071phvkyYa6HKxWYxcjr1itpt6zWM9O0xlxxae9or5LzEzHnj0mJx+yv7enjH7MnJaulp8jl6s8P5z0tyHRnMZsmTXritNa7GTidn4lb6O5fFEVxXy/VGtjvTHada0RaLREe6j2Mfed20X87Y4vB8zq1wmzcuyx+TdPMDK3GRTDt1rWuVtNHgV2OXqbUIUrO5PKvemkYynWtKUqiX1R4OdZdN2vkrpX5bSrMzXZ4+ls1vJH9flwY/iXwxEeszae0R3nu2FfAj3kns2eNmLV08/VGt4fdTZK0rm4TrDbwcbhnYtEdsGhym3Gng5C97T5aVwYu82mK9pmWqLZa3YafOytZtcLJ12xwrsrGZhZlmePlY16Pj1Wr9m5SNy3cj5p5jKNK08/UxXkx5MN7YstLY8lJmt6Xia2raPnFqz2mJj7Up76e7qcjq4N7Q2cG5p7OOMuvta2SmbBnx2/E5MWWk2pek9p7WrMw9J4OSAAyE6I9qfcJ3GbKzrujfSnmPN6XL0LN7ZafR7HK02BWdaUpPY7THxruLhWqefMrl+cYxpSta18Uff4TpbqDqLLGPh+K3N3vPa2XDgyWw4/u5MtazWlftzM9mIvE7x58IfBzSybviP17050vNMdsuPS5HlNPX5LbisTM009HLmx59rJPbtWmKtrTPaIj1SGOz33c7lW3vYXKe77l9OOa2vwr0en3BczByNvOsa0uR+ncjnHZ4EbN3zG3ew6au3fhSFyNb0azpWMgekfZ42s002urtz6nx/W2jj9C9LZp+n6/ZmMmOIn0iafCi0dpjv6+lQftFe+P4Hj8ezwXs8dO/gzux8TFPV/VWts4eOr370tGrw1Z0tq2TH2m+LZnevitM0n4cxWYmTL279oHbx2saC1oOivTXQ8Up8OEM3b2semRu9pdjGkK5OdsL/rn8e5GMY3Po0ca1KlP8FTzXzJTp7pHp/pfXjX4bjcGr6R580V82bLaP66+S3efNP0+Xyx9xSX4w+0P4weO/L35bxL605Xn589ra3H3y/B4zRx2mbRg1dTF5axipMzNPjWzZI7/wC2T2jtku7IwoAAAAAAAAAAAAAAr5vbl/sh3V3+JoP/AHDrPq/7/X5QD8bvsgct+wfwGJt0e65/If8Ah7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZbdh/8AjiduX43uBfV//U2s/wC9f3nbOhf6r+nf020f4ziR/wDaq/I6eM3/ABd9V/eTdWcSyxpDgAAAIv8A7xf2if3UcA4b3XcT1VJbTgs8bifUC7jWaeq7x/ZbCdrU7C/6I+q5fjt9pjYkrkpVpHFtRj6aUjSqMvtD9JfVOhp9U6mLvl0Zrq781j56+TJMYslu3rNoy5a07/2MR9ruvG9zl7Qv4B9W9SeAfP78xo9U1z8/0jjzZJ7U5fS1K35DUxRafLTFbj9HNsRSsRNs97T3mbdkOdEFsZAAAAAAAAAAAAAAAAAAN3XsLO72Pbn3W4fT7kuypidP+t9mPFM/6Te9GHruRVpTI0ewt26yjCubsNhh6/SRlKtfNvL9MaVl4Zq8D+rfwvdVU4/Zy+Tj+brGrk809qY9j8VgyRHeI8+TJTHh79/lb0Vje9L9nifGTwD2eruF0pz9W+GGSef1PgY/NsbnDRM4eU1L3iJtGtqamzt8nMRH4vB3mYjunvJ3NUAAAAAAAAAAAAAAAAABH79v93hz6I9uuv6EcV2NMbm/XK5GxsfgXvh52t4Rr8meVmbCxWMvPpy9lrLOovUrGtJWM27T5VrStMB+PfV88J09j4LVyeXe5uYrk8tu18eljtN75I9e/wBdkxVxW9PxN5+2tu90p7OtPE7xj3PFXntP43THhdS2XT+Lj+Jq7vVG5gjX1tPLEx276+lvZeQxzExNcutjn1j0mDWhG2igAAAAAAAAAAAAAAAAAAEgr2BHZVDrl18ze4HmWsrkcC6JS+Np45Fmk8Lbc4zbNMXDw70ZxrS7ZxdbmbDPjKFY1t5mFZ8y+VY1z74DdGRzfPX5/cxebQ4WfNh81YmmXevEVpSe/wA60x3yZPT5XpX19FRvvZfaXt4W+E+t4R9ObsYerPE6Ph8jbDk8uzx/S+rknPs7OOa2iceXPu62pqTF4mL6+zk7R6xMTjk22ryAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAls+7JS/4L7mI//bfh8v8A1fnU/wC//wAkr/Zqn+ldSx/8rpz/AOTu1+vfcx/q7wSn/wCYdRx3/P29af8AElfpUqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHju2bV+3OzftW71q5GsZ2rsI3Lc41p4rGcJ0rGUa0+VaVpWlafW/JiLRMWiLRPziYiYn8+J9HnjyZMV65MV748lJi1L47WpetonvFq2rMWrMT6xMTExLGbqx2X9rHXGk6dU+hvAuWznblbrdytVXCvemVZV81uaq9gSlPzKtfVOspfhrWnyda5Xo3pfm+/4KcJo7czHbvfFNJ7T93FbH3/X7s29Ae0p47+F0xPQfij1Z0/Wt4vFMG/G1j7x2jtFN/Ht1rXtWI8tYrHb5dpnuwI5H7CL2fW/y8jJx+B8g45G/OUo4vH93j4+Nj0l9UMeObrc65GEfvUncnX8NauibHgZ0Bnva1dDY14tPfya+eta1+5WL48kxH3Jmfu90r+G96n7XPE6+HBm6r4jmbYqxWdjluLy5s+bt/XZba27q0m0/TNaUiftQ4VH3fPsHpOk62OqEqUl6qwrybSeitPPn01pTjFK+mv1fKvnx99w48Aeg4nv5eTn7k7ODt/FO/wC+7Nb3uvtYTWa/F6GrMx280cHyfmj0+cf6+du/0/Lt9xkj0x9j72AdL8rD2Ov6E6PkW2wJQuYu15TkZewy7V2HitLtI413BxZT8xpWvrxpQ8+f0LsXGeEXQXGWpkpweDYzY5iaZdq18l4mJ79+1ZpTv8vnXt9xhfrf3iXtbdc4NnT2/FTk+H4/bramxocDh19PXyY794nH3z02s9a9p7R5c0WiPpbE+N8N4lw7Cs67inGtHx3Cx7UbFrH0+sxMCEbUKeIwlXHtQnOlKfLzclKVfv1qyFraepp0rj1dbBr0rEViuHFTHHaPlH1sRM/rzKHnNdSdQdR7OTc5/muU5jZzZLZcmbkd3Y27TktPe1ojNktWsz9qkVj7UOSuS+KAAAAAAAAAAAAAAAAr5fblV/8ApDur370NBT/1Bq6/0oB+N32QOW/YP4DE26Pdc/kP/D39Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy17EPl3h9uX43+A/5+T6ujtfQ3p1f07+m+h+/tYoYA9qmO/s6eM3/F11ZP7XB70rONZa0hgAAAHWnWPpdxzrT0u510t5Xh4+ZpObcZ3GgyI5Fql6OLd2ODfxsTY24V+X0jXZNy1m40q0r6b9i3LxXx4fN5ji9bmeM3uL26Vvg3dbNr280d4rOTHatckR/ZY7TF6/atWJd18OeueZ8NOueluuuB2MuvyfTHN8dy2GcN5x2z49PaxZs+ne0evwdzBTJq5oiY82LLeO8d1ZL3LdE+Q9uvXTqX0b5NiXsPZcI5Pna61bvxrG5d1N6Uc7R5cqVpT/xzTZWDlfVSn6d8vkrU6k4XY6e5zkuH2azTJpbN8cRb0mcVvr8F/wD7eG1L/a9W7l4K+JvEeMXhb0T4kcJsY9jS6o4PV3L2xTE0x7+OJ1eU14mJn01uRwbWD5/9bdGPiMogAAAAAAAAAAAAAAAAPq6LdbLje61HIdNlXMLbaPZ4O31mXalWNzGz9blWszDvwrT50layLNudP34/N7cGbJr5sWxhtNMuDLjzYrx865MdovS0fdi1Yn9ZweU43S5njeQ4jkcFNnj+U0trjt7XyR3pn1N3Bk1tjFaJ+dcmHJek/clZNezk7oNX3Zdp3S/qVj5Vu9yDF0WJxnmONW7S5l43IePRlp8q/mw8+u1d2v0Cu1hGcY1lay4Sj6o1pKtjfh31Pi6r6U4zkq3i2xTBTW3K9+967Gv3w2tePnE5fh/Fjv8AOLxLS79snwN3vADx+656Ky4L4+Iz8pn5vpzP8OaYM3D8vMcjgxa1u3lvj0Pqr6gtNZtFcmvas9piYjOl3hFkAAAAAAAAAAAAAAB87cbbA0Oo2m82uRDE1mm12btdjlXK0jbxsDXY13Ly7861rSlIWcezcuSrWtKUpGvmr15suPBiy58toriw475clp+VceOs3vafuRWJmfznM47Q2+V5DR4vQxWz73JbmroaeCsTNs23uZ6a+virERMzbJmyUpEREz3tHaFb57TTuv2Hd33Z9RuoEcqdziWk2uTxDhGJC7W7h2NDx6cdRDOw/Na0jb3lzA/Ni54lKMrmXKsa+Kq6fErqrJ1b1XyPIebvqYcttTSpE96Vwa8/Bi9PuZ5x/Gnt6d7tzT2JPAPT9nn2f+jekZwVp1Byehh6h6o2LY4ps5eV5is8jbV2e0R5r8XTb/A6szET5NeO8d2vt0FLgAAAAAAAAAAAAAAAAAByPh/FdxzjlXHeHcfxrmZuuT7nXaPWY1qErk7mZssq3i2f0EP0VYQlc+JcrT9TbhOVa0pStacjU1c27ta+ngrN82zmx4MVYiZmb5LxSPSPojv3n7URMvjdRc7x3S/A8x1Hy+emtxnB8bucpvZslopWmtpYL58n11vTzWinkpHzte1axEzMQsoPZ/8Aano+zzti6edJdfjQt761qcbd82y6xh8fL5dubf5p7y1cuwjGl2xgbLMzMPC8+qUMW3bhWc/HqrY70D0tg6Q6Z4/icdYjPGGufdv6ea+3mj4uaJmPnWmS96U+1WI7zLS39rbx75T2i/HDrDxB281rcVfkM/GdM68TaMWDp7jb/UXF5KY7TPky7elr6+xs9u0Wz3taK17+WM1Xc0aAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAS0vdlK/wC8+5WPn69lxKvj+DBzKef86V3s1fiOpY/+U1P/AFLtf/33Ef6p8Fbf/M+oY/b2taf8X/TsljJVKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADLPsSrWneF25Vp9f3X+AfajVu19Df1XdO/pvx/8axMA+1P+R28Zf+Lvq37x7yzlWWtIUAAAABE39427QYfA4T3ccQ1EbdLNMfh3U27iWa0jWt3JuW9LyDY3aUr5vXruVrNHarWsY+i1ajSlZfXFT2iOko8ul1ZqYe0R5dPk5pH02tMYdjJP27TbFgjv29IiIX8+5t9oe3xep/Z86i5GbfEnN1H0RTYyd7R5MNb8nxGnSZjtjx48G9yuTtFp817zPaES9FJf+AAAAAAAAAAAAAAAAAAka+7zd3UOl3XPkXbhyrZ/A4t1isXs/jFvIvfDxsTm2qwo5M7k7lyVbcIZWm1d/Es2aUt1uZd+HiUpT9NZD+z91ZHF85sdO7WXy6vL1nJrRa3atN3FSLTMzPpEWw4ppEene9o7esqb/e++z3brrwt4fxm4HR+Lzvhzlx6nOXw4/Pm2OmN/ZnBWlaUiL2vr8lvYtjJknzxTXxW71rFfNE2NNFrLgAAAAAAAAAAAAAANJ3ty+8Gnbd2pbDgPHNlXE6h9brlOJ6mWNepHO1mi9Uszc7Stqnmf0TLw9dmaWdytIwpczaR9Xq8Rrhfxu6u/C50rk0NfJ5OQ5qfqXDNZ+vxYO83zZe3z8tqY74e/pHe/bv39FmfuufZ1nxn8fNPqzmdKNjo/wwpPP8hGfHM6u9yvlrrcZoxee1fqjX2dzX5KtO82mmrMzXy95iAzWtZVrKVa1lWta1rWta1rWtfNa1rX51rWvzrWvzrVA/5/NtiRERERERERERERHaIiPSIiI9IiI+UPwfoAAAAAAAAAAAAAAAAACRX7vv2WW+sHWvbdyvM9XW/wzo3WVjiscmzSuPsec7C1TGtz8XYyhk4uHqcnbVlW3Snws6zZ83KSjWEpC+AXRkcvzWXqTcxebT4afLqxav1uTeyR5In1iYtWmK2afSPrcla+vp2mnX3uPtLZPDvwy4/wW6b3oxdSeJERl52cOSfjafS2pknNevfHatsGfZ5DDoREXmfiauTJ2pMW80TbU02siAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACWb7spX9J7lI/hzeKV/mw8mn9KVns1T9b1H93Jq/+pZQH77eP6Z4LW/+bc/H/nGGf8SWWlYoDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q//F0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMsexX/HB7cfxw9P/ALUat2vob+q7p39N+P8A41iYC9qb8jt4y/8AF11d94t9ZzrLWkIAAAAA6Q7kOifHO4jol1H6P8owsfMwOZ8X2usxa5MYyhhbmWJdno9lHz9U9bto4edCvmn6KxSla+HxOo+F1uoeF5HiNqlb49zWy46eb5UzTSZwZPz8eWKXj7tWT/BnxN5rwe8TujfEXgtnNrbfTXOaG7n+DMxbZ42NjHXlNGe3zru8fbY1bfP63LPaO6sk6z9LuQdFuqvPOlnJ8TIw9zwjku00eRbybcrV67YxcmdMDMrblSlaW8/ArjZtmv6mVrIhKNaxlSta1eZ4zY4blN/i9qlqZtLZy4LRaO0zFLT5L9p+jJTy3j7cWiY9G7l4bdc8R4ldB9Kdd8HsYdnjep+E0eVw3wXjJjx5c+Gs7Wt56zMTfU2oza2SPnXJitW0RaJiOsXzHdwAAAAAAAAAAAAAAAAHNum/O950w59w/qFxzJu4m64dyPUciwLtmcrcpXtVn2MyliUo1pX4WRGzWxej5pSVq5ONflVzeO3s/Gb+pyGtaaZ9PYw7GOYmY72xXrfyzMfRbt5Z+5Mus9Z9K8Z1v0p1F0jzODHscZ1Hw3I8Pt48lIvWMe/q5db4sVmJj4mGckZcc9u9b0rMesLNPtI6+6Dub7eOl3Wbj+ZazLPLeMYNzaStSjKlnkWBD8zeRY9aUrX00sbvEz7UKV+fohTzWv1rKek+ewdS9P8AGcxr3i8betScsxPftsY4+HsV/Wz0yRH3IaSXtBeE3LeCPjB1z4bcvr318nT/ADm1TRi8TE5OH27fVvDZu8/OcvGbGpktMenmtPpDI92JhoAAAAAAAAAAAAB4MrJx8LGyMzLvW8fFxLF7Jyb92VIWrGPYtyu3r1ycq0jC3btwlOcpVpSMY1rWtKUeN7VpW17TFa0rNrWme0RWsTMzMz8oiImZl7cGDNs58Otr475s+xlx4MGLHWbZMubLeMePHSsd5te97VrWsRMzaYiPWVd77X3u7vd2Xd7zPN1WZdvcB6Z5WV0/4ZjVnWdqEdJdpg77NtTpWlq9Z2W9xM7Oxb0IUpXFyIUjOca0lWvnxb6tnqvq7dvivM6HG3tx+nXvMx/SJ+HnvE/Ka5M9Ml6WiPxNo7TMercG93j7PWPwA9njpvU39amPq3rbBg6u6lzxSK5LW5Sk7fE62Ss9748mlxWxq6ufHa3f4+G0zWkx5a6sGL07QAAAAAAAAAAAAAAAAAHK+C8N3fUPmXF+Dccxb2bvOWbzXaLWY9i1O9cnlbHJt48Z/Dh+ilbsxnK/erTxSFm3Ocq0jGtacrR08/Ibmto61Jvn2s+PBirWJmZtktFYntH0V7za32oiZfB6p6j4zpDpvnOqeZ2MetxfAcXucrvZsuSuKlcGngvmtXz3+ti+WaxixRPfzZL0rETMxE2WHYx2vcf7Q+2rpx0c02LatbHV6TF2PLsmFLdZ5vL9vajseR3a3YRjW5YhuMrOhh0lWdbeN6LfxJ0p6q2Q9EdMa/SXTfHcPhpFcmLBTJt2jt3vt5Y+Jsz37etYzXyRTv3mK9o7y0q/al8c+X9obxq6z8R+Sz3yae9yefT6ewWm8V1enePvOnw2OKWmYpltx2DVtsTWKxfN5reWvfyxl67ajyAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAlj+7Ky/RdyMfw5HF6/wA2Ne/7/wAyVXs1/PqP9Fq/+pdQN77es9vBe30Ri52P/LYv+n7aWilcoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMsOxb/HB7cPxxdPvtVqna+hv6runf034/8AjWJgL2pfyO/jL/xddXfeLfWdCy1pCAAAAAAIdnvF3aBb4tzjhvddw/U/C1XNoWuL9RJ4tn1UhyTBtzt67cZdbUaRxse9q7Oq1cJXI+LmVGlPi1nP0UiF7Q3SMau9p9VamLti3Yrq8hNa/LZpE1x5rzEfW1tjjFijv87fT6ti/wBzn7RF+e6X6k8A+ouQ8+/0xbJzvR1c+XtNuF2b0vucdrxeZtmzYt7Jv714pPemvPrSK18yL0jIvJAAAAAAAAAAAAAAAAAASsPdx+7imBuOddpnLNr+k7ml3mPTe1lXvMqZ2Paty2+h11qtaem3XFtbPd3aRpOVblLkq1jH6pS+zv1ZGPNvdKbeX0zebc46L2/r6xE5tfHHf5eWMuefTv37z8lC/vk/Z9nb47pbx/4DQ/pnHfD6c6zvgxzFZ1c2S8cfy25eInveM+TR4zHNprHlmlY9fnLoSza94AAAAAAAAAAAADVD7Ynu9x+1LtD5b+ZWfHG6g9Vbd3gHDLcZ0+Lbns7Up7vKuWo1pdpZpx6zt7Vq7GVukMqVr9HWtPRLFfi91dXpXpLb+FeK8hykToaUd/WJyR3z3mI9fL9TxlrE947Xmvr6J8+7o9njN49+0N0/9X6s5ukeg74+repb2r9ZemjeK8Xgpe3ek5J5fJx+S+Oa3m2CL+kR9dFeTevXci9dyL9yd2/fuTvXrtyVZXLt27Ks7lycq+aynOcqylKta1rKta1+dVfkzNpm1pmbWmZmZnvMzM95mZ+mZn1mW35jx48OPHixUrjxYqVx48dIitKY6VitKVrHpWtaxFaxHpEREQ8b8eYAAAAAAAAAAAAAAAAACST7vX2W2eqHVred0XNdVW/xbpPKeu4PTJs+LWZzbPt/RZ5tv4sZQy8TB1N7cY9z4Uf0nO+F6rsZQpCUjPZ/6Njk+Wz9T7uKZ1eK749LzR9bfdyR5ZvHeJi9KYrZqz2+WTt3nvHaaYPe9e0rk6H8P+L8C+mt+MXO9fxTd6onBk75NbpjUvOeutf4dotr7G1yGLjs1PPP9M1ZydqTW3miaemY1pgAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASwvdlpf747joeafO5xqXj79fGPcp/m81/70Sp9mv8X1F+frf+rZQX77aP6T4NW/4PNx+3lpP+L95LWSva/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/wCLoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZX9i9fHd/241p+7F09+1Wqdq6H9Orunf044/8Af28MMB+1J+R38Zf+Lnq/7w76zpWXNIMAAAAABjF3jdu3H+6btz6ndGd/h2sqXJeOZ09FO5SFK4vKNbarseNZNLkoyrC3a3eLgTv0jWFblmM7dZxpLzTrPWHT2v1R07yfDbFIv9U615wTP9btY4+JrW7/ADiIz1pNu3bvXvDN/s5+MPL+BPjH0P4k8TsXwRwnNateVrTzT8fgty8afNYPJWY818nGZ9quLvForlmtorMx2ms26h8H3nTTnXLeAckxbuHvOH8g2vH9jZvWp2JVyNXm3sSt6Nu5+ipZyY2o5FiVfNJ2btucZSjKla1s8ho5+N3tvQ2aTTPp7GXXyVtExPmxXmveIn6LREWrP01mJhuzdIdT8X1r0t0/1bwufHscX1FxGhy+nkx5K5axh3tbHsRitevpOTDN5w5Y9JrkpesxExMOGuG7GAAAAAAAAAAAAAAAAA7t7cetHIO3vrd036v8by7+Hn8L5RrNnkSx5SpcyNT8eNjd4XiP6r6bqL2bieK0r4+N5pStfk+107zOx0/zfG8vrXtS+ltYstvL372w+aK56enz8+Gb0/8AtMZeMvhrxHi94Y9Z+HfNa+LY1OpuC3tHDGWKzTDyHwrZeM2u9vSPqXkMetsfOP8Aa+3eIWcHRvqfoOs/S3gnVHjGVYy9PzbjGo39iWPdjehYu5+FZv5eDKcK1p8bAyp3sPIhXxK3esThOMZRrSllnD8nr8zxejymtat8O7rYdis1mJis5KRa9JmP67HebUtHzi1ZifVpFeI/Q/LeG3XXVXQvOYMuvyPTHN8jxOWubHbFbLj1NnJi19qtbRE/C28FcezitHetseWtqzMTEuy30nSQAAAAAAAAAAH5KVIxrKVaRjGlZSlWvilKUp5rWta/KlKU+da1+qh8vm/YiZmIiJmZmIiI+czPpER92ZQD/bi93tvuU7s9nw3jOz+mdPuikbvDdTSxdrLGyuQY/iPJcm7bpWsK5ODuq7TWwuU8V+DCsfn581gZ429XR1J1Xl09bL5+P4XzaeHyz3rbYr6bNpj5eamb4uOJ/sYbZfuvfZ4v4Lez/o9Sc3o/U3V/ibanUnITlp2zYOIzd54XDjvMRaMO1xsaO5ak94+Jbv8AcaWGGllgAAAAAAAAAAAAAAAAADmvTjgm+6n884j094xiXs3fcw3+u0Otx7Fqd+5W9n5ELUr3wrf6KVvGs1uZN6tPFIWbNycqxjGtac3jtHPye9qcfrUtfPuZ8eDHWtZtPe9oiZ7R6zFY72t9qImXWusuquK6H6V6g6v5zYx63FdO8Vucru5cuSuKkYtXDbJGPz3mKxfPkimDFE+tsmSlYiZmImy67Lu2jjfaX259N+jHH8WzYv6DRYeRybJteiX5ocu2VqOfybM+JClKzs3t3k59zGpKU627E4QpOVKeqtkXRvTWt0n07x3Da9IrbBgpbZtHb+mbeSIybN+8fOJzWyTXvM9qzEd5aUftKeNnNe0B4ydZ+JXL7GTLi5bldjDweHJ5o+pOntLJbU4PWmlp7UyY+Mw6tc81ivny1taa1me0ZUu0sEAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/AFb8D96N1GaRsXZgAAAAAAAAAAAAAAAAJXXuy9f+Ee4yn4Y8cr/NalT+lKj2a/8AbOoY/wC1/wB+J/5FB/vtY/1H4Nz/AMLmY+763j/kS3ksGvuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/8Ai6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGVvYz/jfduP44+nn+flepdp6I/qu6c+7zPHfxrEwL7UcRPs7+M33PDfrCf1/wB31nWsvaQIAAAAAACFL7wx2e2+mHWnj3cvxLV/A4v1et29dy2Vi1SlnG5trMWWPCfi3GMbNnJ0uuwZyrP1VuZl25X11lP00hj7QPSEcZzOv1JqYvLrcvEY9ua1+tru46zWJ9IiIi2HHSZmY9bzPr6tmH3QXtFX658NOY8FOoN74vOeHl77vT9cuSZy5+mN7PGa1Zm9ptly4OT3NqtYr28mvSkeXtXzTHBR1XLgAAAAAAAAAAAAAAAAAJlXu6XdvPmXTPmXa1yva0u7jpzcvcm4Lbyb3plPi2zzbdzYYNqt2UpZGRb3WyzMmMLcqVtYkPHwqQt+tML2eerJ3ON3Ol9rLE5uOm21oxae0zq5ckTkpHeZm1ozZb27R8qx8vRrg++M9n2vTfW3TfjtwGhNOO6ypj4Pqq+HH3rXntHWtTT2rxjiK4cN+M0tfDNrx/TNi/4vzW8qTckspFAAAAAAAAAAAa/vaZd1Wr7SO0rqRz25l2bXKt7qsnh/BcK5dpavZ/IN7CmDcriV9UZSyNZrMjN3EaQ81pTBrWtPTStadB8SuqcXSfSfJb83rXaz4ramjSZ7WybGePJPk9YmbYsdr5YiO/4hLb2JfAbe9oL2gei+k66+XJwPF7+HqLqnZpjnJi1OI4q07VI2I8s1jDvbuHW46027RP1V2ie8wreNttM/ebXZbra5NzN2m3z8zabHMvS9V7Kzs/IuZWXk3Zf865fyLty5Ov35SrVXTly5M+XJmy2m+XNkvlyXn1m+TJab3tM/TNrTMz92W5voaOpxejpcboYaa2jx2pr6Onr447Y8GrqYaYNfDSPopiw46UrH0RWHz3rcsAAAAAAAAAAAAAAAAABJo93i7LrHPuo3Ie6/m2p+Px/pvW9penf0mz4t5HMMulMXL21it6MreVjYWrlutddpbjX4Wbct1ldjOHorJT2feja7/I7HVW7i82vx3mw8d56+ltu/1t81e8TFqUxTmx2iPleY9fTtNJfvgPaVy9JdG8P4BdMchGLl+tPh8l1j8HJ3vh6c15+Pr8flikxbBn2t6vG7lJvP8ATNaloik1t5omYJiNbsAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAErX3ZiX/DHcVH8Njj8v5o0p9X73n/ADpTezX/ALd1D+h1/wDAoU99pH+t3g7P2svLx+3b/wByXGlk18gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADK3sa/xvu3H8cfTz7Wal2noj+q7pv8ATnjv41iYF9qL19nfxn7f72/WH3h31nWsvaQIAAAAAADCz2gXa9qO7jtb6m9KM3Fje3d7R5W84fkQtxnlY/KNFGm31FjFlKkvh12ebg4+uv1pTzXHyLkaVjWtK06Z1/0xi6s6X5Pir1ic84L59O3bvau1gj42KtZ9e3xb0rjt/wAG0wkt7JHjlyPs++OvRHX2tnnHxmPlMHF9RYbXmmDLwXK2njuQy54iY88aOttZd3FEz2jLhpMxPymtX5Rxza8P5Jv+KbzGnh7nje52Wi2mNcjWM7Gfqsy9g5dutK/P9DfsXKUr9VaUpWla0qrh2tfLqbOxq56zTNrZsuDLWfSa5MV7Y7x+tast07g+Y0OoeG4nnuLzV2ON5rjdLldDPSYtXLqb+tj2te8THp9diy0mftT6PhPQ+oAAAAAAAAAAAAAAAAAy97Fe5Lc9qnc90s6ua3Lnj6/V8ixNdya1W5KGPkcb3Xr1G4lkxpWlLkcPBz8jNtRl8o37FuXivh23ofqPN0t1NxfLYrzXHi2KY9qO/attbN3w5vN8u8UpktePtTWJR69qbwY43x68Duu/D3d165tzf4bPucJkikWzYea4zy8jx1cNpiZpOztamHVyTHrOLLePTv3WXfE+TanmnF+Ocw0ORDL0nKdHquQ6nJhKko3tduMGxsMO5SsfNPMsfIt1rT71a1osj1NrDu6uvuYLRfDtYMWxitHrFsebHXJSf162iWlHz/Cch01zvM9O8rhtr8nwXKb/ABHIYbRNbYtzjdrLp7NJie0/W5sN4j7cerkDkPkAAAAAAAAAAIPXvBXdzb6w9xGo6CcV2tMrh3RbGtS2/wBFv0vYWw5nscP6ReyKTt1rare1eLssjUZFvzOVu/YuRn6ZxrGkJvH7qyOY6hw8Fq5fPp8NWvxvLbvTJuZKeabenp5sVctsNo9Zi1Z79vk2f/dGez3fw68HuQ8WOe0ZwdR+JebJHHTnxfD2tTprS2Zw4sM1vEXjFv59LDyOG/aIviy0tXzVmJR7GAFvIAAAAAAAAAAAAAAAAADn/Svp1yDq31H4X004tiX87fc15DrtDr7GPanfu0lmXqUv5HwrdKylbw8WN/LvVp4pGzYuTlKMY1lTn8Xx2xy3I6XG6tLXz7uxjwY61ibT3vb663aO8zFKea9vtVrMz6Q6n131jxHh90b1L1rz2xi1eJ6a4jc5Xcy5slcVJrr45nFh895isX2M84tfF39bZMtKxEzMRNmJ2idufGO1Xt96b9FuMYlnHhxfj+DTe37NIVpseVZliGXybZeuNPMoZ28vZ2TZjKU/h2rsbdJVpGlVkvSXTur0twHHcNq0rWNXXp8e0dv6ZtXrF9nJ3j5xfPOS0d5ntE9u8/NpOe0J4x8548+LvWfiXzmxlzW53l9r8CsWXzROlwOtltr8HpeWZ7Vvq8Xj1cGSYrXz3xzaaxM9oyVdkYWAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABKv92Zl43/cPH8OHoq/v/L0JS+zX/t/UH6DB/iUMe+0j/Wnwen7Wzysft+afn+sl0pZte4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADKzsb+Xd724/jk6df5+W6ijtPRH9V3Tf6c8d/GsTA/tQfkefGb/i36x+8HILOxZe0fwAAAAAAAEFr2+nZ3HoR3JYvW3i2t+i8C65QpnZH0ez8LA1fNMLHri7DWWq0j4rdzcXW/m3frKdZVu5tytKUjWlKQe8eOkI4LqOvNauPy6HORGS3ljtjxbtKzTJjr2j53pi+Pbv6+a8/OG0v7pz2i7eKngvn8Mud3fj9V+F1p1cPxsnn297prZzRn1N7JE27xj1djd/AzHFaxWKa1Yn1+egxghbCAAAAAAAAAAAAAAAAAAnS+wG7u7nXHtoy+i3KNn9M5x0Pv3MHHlk3viZ+y4dm5VMnX51yMpeqmPrLmyxtHY9MKQpbxbcayrKlfM4PAbq2eb6bvw21k827wlppXzT3vl08l/PjyT6+lcc5K4K+nbtWPp7tWr3s/s9U8L/GzX8S+D0vqfpfxQxU2c0YcXk1NLqPV1/g7erSYjtObepp5uUy95802z3ntEdm/NnhU4AAAAAAAAAxT72O4rR9rPbR1U6w7jLt4+RoONZePoLNbsIZGVyLbVt6jTRxrVfM78sfYZ+PmXrduNZUxrF6dawjGs49W606hwdL9N8py+a8Vtg1r1147xFrbGXtiw+WPnby5Mlb2iI9K1mZ7REyz17Mvg7ynjt42dB+HXHa982Hlua183L5Ipa2LBw3HxfkOSnNePrcUZtTVza+K95is5suOsRa1orNZ1zXl2659y/k/N+R5U83e8t3+35Htsmcpyrd2G62GRscusfXKco26X8m5S3Csq0hCkYUr4pRWzu7ebf29rd2LTfPt7GbZzWmZnvkzZLZL9u/r281p7R9EdobsXTPT3GdJ9O8H0xw2CutxXT/ABPH8Nx+Gta1imnxuph09eLeWKxN/hYaze3aJteZtPrLjDjPuAAAAAAAAAAAAAAAAAAJQvu7XZdj8u5jyXu45vp6X9PwuuTx3plXKs1pbu8nvTpibLe4krlKwyLWDgx3Onu0jGtLeRf81nGcKRrJv2e+ja7e5s9WbuHzYdLza/GzevpOzafJkz0mfS0Y6Rmw27RPa1vnEwo298N7SmXp7pzhPZ86Y5H4XI9S/B5nreMGWJvTg8VZz6XF7FaT5sN9ratxvI0m0xN8OKYis1tNkxNL1roAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAlU+7NSp/dN3Cx+/XX6Wv8ANKzT+lKP2a5n6q6gj6PhYJ/X7woc99nH+snhBb7W5ycft1yf+5LvS1a9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/AOLoPs/qkA/G77IHLfsH8BibdHuufyH/AIefouX++++1AsRrEAAAAAAAAAAAAAAAAAGVfY5/je9uH45enP2u07tPRH9V3Tf6c8d/GsTBHtP/AJHnxm/4tusv3un+QlZ2rL2j8AAAAAAAA14+0+7TsDu77SuofBrWJC5zDj2syOY8HzI2qXcvH3XH4R2s8LDp9fxd3i4NzT+I0rKscytIUrKtGPvEzpSnVvSnIaMUidzXxW3NK8R3vXNrx8WaU+7nrScP51/T1S/9h3x+2/Z69oHo/qm+xanTnMbuHpvqnXnJ8PXy8Zy9p0KbWzPeI+HxefapyPrMRE6/e09olXC7bV52j2uz0m0x54mz0+wzdXscW7SsbmNna/JuYmXj3I1pSsZ2cizctzpWlK0lGtK0pVXZlxZMGXLhy1mmXDkviyUn0muTHaaXrMfRNbRMT92G5dx+9q8poaXJ6Oamxpcjqa29p7GOYmmfV28NNjXzUmO8TTLhyUvWYmYmLRMPnvW5YAAAAAAAAAAAAAAAADZF7Kzuvze0zu96ecpyMu7a4ZzDZY/B+b4cbkoWcrWb6dcDX3r8vnCFrW7jJwNjduTj6Y28WXqlGNKypkXwu6qv0p1dx21a8109zLXR3aRMxFsWxPw8drfRFcea2PJaZj5U+cQhl7ePgHreP/s8dYcDh18eTqTp3Sy9UdMbE1i2TBvcTWNvbxYo9LWybvHYdvSx0rPeb547RafrZsbMDOxNng4eywL9vKwdhiY+dhZNmcblnIxMuzC/j37U41rGdu9ZuQuQnGtYyjKlaVrStKrEMd6ZaUyY7RamSlb0tE94tS8Raton6YmJiYn7UtNva1djS2tnS28V8G1qZ82rs4MlZpkw7GvktizYslbRE1vjyUtS9ZiJi0TEx3h7TzegAAAAAAABDl94y7to8p6hcK7VuKbas9XwOFjlnPbONer6Zci2WBcnqsC/SEvRcsx0+0xsqtuVJVjkW4yrWlY+mkQPaH6s+quQ0+ltXL3xaMV2t+Kz89nJjmcWO3ae01+DlrbtPytET3+hsae5w9n6eC6Q6m8eee0PLvdV2y8B0pkzY4714bS26V39rF5q+amW3I6ObBF6zHmw3tHaYt3mMCjMvEAAAAAAAAAAAAAAAAAAdmdGul3IutXVTgfSrieHfzt9znkeBo8KxjW5Xb0YX51u52TG3Glayjg6+zl5t371LWPOVa0pStafS4fjNjmuU0eK1aWvn3tjHgpWsTM9rT3vaIj5+THF7z9ysuk+JHXPDeGfQnVXXvP7OLV4npbhtvlNnLnvGPHNsVYpq4JvaYiLbW5k19Wnr3nJmrEd5mIWZPa12/8AFe2HoR066McSw7GLh8R49r8bZ3rEaUpsuRXca3e5Dtp1p86y2e4nmZtaVlKkPj1jGvppRZP0vwGr0zwXHcNqUrSmpr465JrHpk2JrFtjL+yZpvft9Hm7R6NJrx28W+e8cfFTrHxK6g2cufZ6h5jbz6WPLaZnS4fHmvi4fj6xPpEaXG11tXvER5vheaY7zLIN99iIAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEqP3ZuX/G7uCh+HVaeX81yxT+n+X+RKL2bP/jfUEf/ACOH961f+VRD77KP9j3hFb/shyMft0yz/iS9UtmvKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZU9jta07ve2/x9/rP04p/J/ddqHaOif6rum/06439/bxMEe0/wDkefGb/i26y/8Ay/yCzvWYNH4AAAAAAAB+VpSVKxlSkoypWko1pStK0rTxWlaV+VaVp8q0r8q0Pn837EzExMTMTExMTE9piY9YmJj1iYn1iY+SAj7cPs8n20912z5vx3X/AEbp11sjXl2k+j2a0xdbup0ljbzW3b0f0uuXlbHC2G3+FX0TpYy419FYeJVgb42dIT031Vl3tfH5eP5vvt4fLH1mPNP1ufHNvl575KZM0V9Jito9PpnbK91/7RdfGvwD0el+Y2/jdY+GNo6e5P42SJz7vGVmM/F7uPHP1/1Pg09rU474n11Zy68xNvN3rGlZhlZaAAAAAAAAAAAAAAAAA/u3cnauQu2pyt3bc43LdyEqxnCcJUlCcJUrSsZRlSkoypWlaVpStK+aP2JmJiYmYmJiYmJ7TEx6xMTHrExPyl43pXJW1L1rel62peloi1bVtExatqz3ia2iZiYmJiYmYlYNexb7u490XaFxvWbzYRyuoHR+lrgXKIznSl27h6+FY8cybdqVa3ZW4cf/ADLsX79ZTjPKpP8ARRlX00n54NdW/hn6R1sefJ5+Q4jy6G13n1mmOO2taIn66YjX+HW1pme9u89479o1FveVez1PgX7Q/NbvF6k4OkfEScnVnB2rT+l49nctE8zhvesRSL25f6vy4sURW1cE19JiPNO3tltXkAAAAAAA6V7iusvH+33ol1J6w8ny7GHq+D8Y2G0jcyZ0hZu7OVv6JpcOUqyj4+nbjIwcKniVK+q/TxXz4fF6h5jX4DheS5favWmLS1cmXvb0icsx5MFJn0/2zNalI+7Zkvwd8N+X8XfE7ovw64PXy7O91RzmpoTTDE2yY9Gt/qjk9msRE9/qXjsO1sz6du2Ke/orIutfVTkPW3qtz3qrynKv5e45vyjcb+7XIuVuzxcfPz7+Rha6E6/OtjW4c7ODj0r5rGzYhGta+PNa1Oa5TY5rld/lNq9r5t3azZ58095rXJe1qY4n+xx0mtK/8GsN3Tw06D4fwx6C6T6D4LBi1+O6X4PjuJx/BpFK7GbU1cWHa3b1j0+Lu7Fcm1mmIjvky2ntHydXPmO8gAAAAAAAAAAAAAAAAAJU3u6nZjZ3e45T3fc209L2BpfpXFelssyx5tz29MmmLueRYNyUaUlPBt4+20dz0+qlJZMq1rGVKJR+z10bGfNtdXbuHvjwefV4ubx6Tm83lzbFJn6ccVy4J+15p+lQ/wC+K9pLJxnHcF7PHTPIzj2+T+Bz3XUa+WPPXjvgzn43h9qkT3rXavm0OUpM+WZjBXt3rMpeSWrXnAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABKc92dl/x36/x/8AtLqpfv8A+GxaJQezbP8Aq3no/wDkcU/v17f41Evvso/2M+Elv+ym/H/ks8/4kvxLhrwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZT9kNfHd324fjn6b0/n5fp6f0uz9F/1W9Ofpzx38bxME+09+R68Z/8Ai16z/wDy7yKzxWYtH0AAAAAAAABqv9r52hWe7PtE5jh6nCs3uf8ATLGyef8ADMqUKSuwlpbVMzfYcKU9N29cz9Dj7DExbEZ/PKv26xhOVfTXF3i50jXqvpLcpipWd/jK239K0xEzHwY8+xSPpmcmCuStIifxcx6T8k7/AHePtDZPAD2hunNnf2cmPpLrfNg6S6lwRea0tHJ5J1uJ2bTPemOmpyubU2M+W1fTBivE2rX1iu+ysXIwsnIw8uzcx8rEv3sXJx7sJW7tjIsXJWr1m7CVKShctXIShOEqUlGUa0rSlaK+rVtS1qXia2paa2rMdpraszExMfRMTExMfbbgmDPh2cGHZ18lM2DYxY8+DLjtFseXDlpGTHkpaO8Wpelq2raJmJrMTHpLwPF7QAAAAAAAAAAAAAAAAG5T2JPd7Xtl7t9JxnkGx+idPus0YcI39L92scbE2mVKl3QZluFZUj9Kytzj6zW+utJfpN+sfFPrZh8FurvwtdWYNbYyeTj+Z7aWfvPatMtp82C8R8vNbNXFj7/2M9lcPvN/Z5/m3ez5ynN8Rp/VHV3htNuqOJ+FTvn2NHBE4+X1r3iJt8DBxubd3fJHb+mYomZ+cTYB0rSVKSjWlYypStK0r5pWlaeaVpX79K0+dKp7/P5NSaYmJmJiYmJmJifnEx6TE/diX6PwAAAAABFP9437ubmu1XBe03iW1rbyNrK1zHqPDEv09VdfbjdrqdBsLca19FLt6Wr3dqM6RlKNu3KlKwr5rFr2iOrJx4tHpTUy9rZe25yMUt6/Djv8LXyRHy7zOLNET2me0T8l9HubfZ7pub/VPj/1BoebFoRk6c6MtsYu0Rt3nHHIctp3tEeaceKN7jMk171ib3jv3RF0TGwgAAAAAAAAAAAAAAAAAA7Z6E9JOR9d+r/T3pFxPDv52853yXB0uNZxoVuXoY0qyydnlRjSkvNMHV4+bmz80rT0Y8vPy8vq8HxOzzvL8fxGpS18+9s0w1rWJmYrPe2W8don/a8Vb3n07dq+vo6B4p+IPDeFXh31f4hc/sYtXiuleF2uTz5M1opjtmiK4NHXtaZjtO1vZtbWr69/Nmjt6rNDtw6HcV7ceinT3o5xDCxsTWcL43q9Zk3Ma38OOy3NvDs03e4u081/T9ttKZWwvfe+JkS9NKU+Syjp3hNXp3heP4fTpWmLT1sWO01jt8XNFI+Nmn/hZsvmyW+7aezSV8ZvFHnvGXxM6v8AEbqLZzbG91LzW9u4aZreedLjb7GT8DOOpP8AuXH6PwNTH9Pkw17zM+ru99tjAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEpf3Z6X/AB96+x+/XQa2X82RhU/p/wA6T3s2z/q/no+3r4p/atX/AJVFPvsa/wCxPwmt9rl92P28Oz/7/wDpCYCl013QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v8A8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP8Aw8/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAADKbsi/xu+2/wDHR02+2Gmdn6L/AKrenP0547+N4mCfae/I9eM//Fr1p/8Al3kVnksxaPoAAAAAAAADx3rNrIs3ce/bhesX7dyzetXI0nbu2rsawuW5xr5pKE4SrGUa0rSsa1pX5Vflqxas1tETW0TW0T6xMTHaYmPtTHpLzx5MmHJjzYr2x5cV6ZMeSkzW+PJS0Wpelo7TW1bRFqzHrExEwrz/AGxvZ/kdqPdzym5qMCuN086r3L3PuG3IQ82rX5pXZU3uHcuwpS3C9HkFvbXbNj0wlDErarSNY+Jyr98X+kbdK9W7U4cfl4/lZtv6cxHpHxZ/p9JmPSJ+qIyzWvpMU7ekx6zt8+7l9onD4+ez3wNeQ2ozdX9A0x9JdSUtbtfJOljj8C9jHjt3vbFPEX0MeTL5r1tsRkjzRP1sam2Kk/AAAAAAAAAAAAAAAAAHv6vZ52l2eu3GsyLmHstTnYmy1+XZr6buNm4ORbysXIty+9cs37Vu5Cv3pRo88WS+HJjzYrTTJivTJjvHzrelotS0fdraImPuw4u9pavJaW5x29hpsaW/q7Glt6+SO+PPq7WK+DYw3j6aZcV70tH0xaVj97MLus1/dv2j9OOcyybVzlnHdVi8L5tiRu/Fycbd8dty1VrKza+qso5G5wsGzuJeqkfNMz1Rj6a0WK+GfVOPqzpPjt3zRO3rYqaW7Tv3tXNr1+FFr/8ACzUpGae/9n9ppn+3D4C7ns++0H1n0vGDJTgOZ38/UvTGxOP4eHPxnMXjfvg1o7RE4eN2drJx0TE27Tr9rT5omGwtkBEEAAAABwfqXz3R9Lun/MeonJMmziaXhvHdtyHPuX70LEJ29ZhXsqOPG5crSPxsq5bhjWI/OVy9dtwhGUpUjXhclv4OL0NzkNm0Vwaevl2Mk2mKxMY6TaKxM9o73mIrWPptMRDtHRXSnKdddW9OdH8LgybHJ9R8zx/EatMWO2W1b72zjwTmmlPWceCl7Zss+kVx472tMViZisr7s+v3Ie5zuC6m9ZeRZl3Lucr5NsbuopdrOlcTjWHfnhcbw/ROtfRLF0mPgWLvpjD13Lcp1jGtfFK1eq+e2Opef5PmNi83nb2ck4e/f63Wpaaa1O0/Ka4K46z6R3mJmY7t23wB8JeH8EPCLojw34fWpr06f4TTx8jNPLP1RzWxirtc1s+asfXVz8pm28tO828tLxWLTEd2ObrzMYAAAAAAAAAAAAAAAAACWJ7uj2aWcqvLe8Dmunjet2/pnEOlksyx5hHKs5scfecjwJ1pStMjFnhbPRSr6pR+Hl3f0NK+KpVezz0dW/1X1du4YtEefU4ubx3iLVyeXPsY5/sqzjy4J+5eVBPvjfaQy4Pwv+zt0zyM48l/qbqLruNbL2tbBl1pzcXw23WJmJw7FNnS5SvpW3xNenrMd4mWolc1/QAAAAAAAAAAAAAEMz3man/L526V/D0y5X/m5Bq0OvaU/H7p79LNr+MY/wDlbIvuS5/6k/jHH2ut+A/f4jeRmkbF2YAAAAAAAAAAAAAAAACUj7s9L/lE6+R/DxvX1/l+l4P9CT3s2/jjzsf/ADfH+9bH/wAqi332Ef7DvCeftc1uR+3r7U/4kwdLprsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZS9kXy7uu3Cv4Os/Tb7YaZ2fov+q3pz9OeO/jeJgr2nI7+z34zRP0+GvWn/AOXeRWeazFo+AAAAAAAAAANNfttez+vc72l7rk3HddHK6hdGPjc30U7dqksjJ02HD1ckxLk6U9crGPpJbPOt26SjT6RCkv0X6muHfGnpH8M3SmbZ18cW5Dhu+7gmI72thp67NJnt38tcHxbxEdvroj5/JZB7sj2iI8EPaA43hOZ3JwdIeJXwumOVre8xiwcls28vC7FKzPlrlzcpGjq3yTE/0m0x6R6xX+zhK3OVucZQnCUoThKlYyjKNaxlGVK/Oko1pWlaV+dK08VQJmJiZiY7THpMT84n7Uttetq2rW1Zi1bRFq2iYmLVmO8TEx6TExPeJj0mH8j9AAAAAAAAAAAAAAAAASDvd+O7u30b7itp0F5Ts/o/DutmNdt6iOTepaw9fzTW4tMyxl3Llyvw4Vzddqp6uxb8wrcycq1GNZTlGEs/eAfVscP1Dl4LayeXT5qsxhi09qY93HWL1tMz6R58eKcVY9O97xEd5nsqJ97j7PV/Efwd0fFfgtL4vUfhjmpfkZw4vibO501u551sutSlI89o1tzervZL/XRTDgvNoisTaJxSbTV9AAAAARwveHu7m90y6JcZ7bOLbL6PyPrBet7LlcLN2sb9rhOqyrmRCMa25RlauXt7rcCE6SrWlzGuTj6K0l6qR19oLq23GcLrdN6uTy7HL2jLteWfro0sN5tER29azbPipE/brMx29Vy/ufvZ8xdb+J3N+NPPaU5uG8OsV9HgL5MffFk6n5DXrhtMxes1yUxcXu7V6zWImmelZ80TXshSIYtmEAAAAAAAAAAAAAAAAAB3P28dGeSdwfWrpz0d4piX8zcc65LhamEMeNZ3LWDGlzN22VSlKS/8T1WJm5XzpWn6T4r9b7HT/D7PP8zx3EatLXzb2zTDEViZmKet8t/T+wxUvf8A+yxv4v8AiRw3hF4adZeI3P7GLW47pXhNnkLWzWitMm1aaa3H68+sTP1TyGfV1/Se/wDTO8LNHoH0a4r2/dH+AdIuHYONhafhPGtTpqyxrVLUdhscXCsWtpuL0KfL6Vt8+GRsMmtPFK38i5WkaUr4WU8Dw+rwHEaHE6dK0w6WtiwzNY7fEyVpWMua3/Cy5Itkt8vrrTPZpJ+LHiRz3i34idW+IfUezm2eS6n5vkOS7ZrzknT08+1lyaPHY7T6/A4/Uth08ETMzGLDWJmZ9XcD67HYAAAAAAAAAAAAACGZ7zN+v526fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Yn8Y/wBW/A/ejeRmkbF2YAAAAAAAAAAAAAAAACUX7s/L/lM68w/DxbCl/Nm66n9P+lJz2bZ/1y52P/mtJ/8AHxxP+JRj77CP9hPhTP2ue2o7/n6u5P8AiTDUvGuqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZR9ktfHdz23/jp6a0/n5hp3Z+i/6renP0547+N4mDPaajv7PfjP8A8WnWk/8A4d5H/Es9VmLR6AAAAAAAAAAensNfhbbAztXsce1ma/ZYeTr8/EvR9VnKwsyzPHyse7H5eq1fsXLlq5Hz84yrR4ZMdMuO+LJWL48tLY8lLetb0vWa2rMfatWZifuS5Gnt7Oht6u9p5r6+5pbGDb1djHPlyYNnWy1zYM2Ofoviy0rek/RasSrk/aodpew7Ru7jn3E7WJetcL5jnZPOOB5k7XwrWXpt3e+lZtrGjSMY0sazc3dhq7VKUr4t4cfNa181V3+KPSmTpLqzf1IpMae5ktu6N5jtF8OefPeKx/Y481smKI+1RuSewj7QGp7Qns+dJ9QZNjHfqXpzVw9LdV69b+fJr8lxeP4GtkzTNrW+Lvcbj1N+8z/X7M9oiJiGt9jpMwAAAAAAAAAAAAAAAABynhHL9zwDmHF+b8eyZ4m74nvtTyDWX7c5QrHM1GdYzrFJVhKMq253LEYXYUlSk7cpQr8pVcrS282huau7r2mmfUz4tjFaJmO18V63r8pie0zXtMd/WO8Ph9T9Pcd1Z07znTHL4abHGc/xPIcPvYr1raLa3IauXVyzEWi0RetMs2pbtM1vFbR6wsxeyruM0fdR21dLesemyoZGRv8AjeFi8hh641u2OUaiNdTyKly3TxKzC7uMHNu48J081sStypKdK0lWyXovqLB1T03xfMYbRa2fWpXYjvHeNnDHwtjvH9bE5qXmsT/WzHrPzaTntL+DnKeBHjV134c8lgthw8TzWzm4i01mKZeD5C0chw80vP1uS1OO2tbHltWe0Za3iYrMeWMqnaWBgAAHyd/u9dxrRbnke3vxxdToNVsN1s8mdaUhj6/V4l7NzL8q18UpG1j2Lk6+fvRerYz49bBm2M1opiwYsmbLafSK48VJve09/tVrMvocTxm5zXKcbw3HYrZ9/lt/T43RwVjvbNt72xj1dbFWI+nJmy0rH56th9or3RbXu27rep3U/Iy53uP2t5lcb4bjRvVu4ePxvj0o6bAysOlaypCG3sa+1tb1IyrSV/KnKnilaUpXF4hdT5erOquT5O1pnXjPbW06xPeldbX/AKTjvT7UZoxxlt/wrzPp8m6P7HfgZoez94CdD9D4cFcfL34vBzPUmeccU2M3NcvWeS28GzMRXz24/Lt30MczETGLBWJ79u7Bt0lKEAAAAAAAAAAAAAAAAABLh93R7NLWPquWd3/NNRG5d2X03iHS+uZY8xtW8TYRsbzkOFOtKShlWsnXZunpPzWEsXLveI1rL1Ulj7PPR0VxbfV27h7zl8+nxfnr6RFMkVz7FJ+cXi+O+H7XltP0tfT3xvtIXzb/AAHs7dNcjNMelOt1F11Gtl9cl8+pbLxfEbURM1vgyYdzW5Ga9vNXPr4/ro7dplbpTqEgAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAShfdoZf8qnXWP4eI4sv5s/WU/pSb9m38dOc/wC1KfwmL/lUbe+uj/YH4V2/+kOxH7epvT/iTE0vWugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/8Ai6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGUXZP/jc9t/46umn2x0zs/Rfp1Z05+nPG/v7eGGDfaZ/I+eM//Fn1r/8AlzkVnssxaPIAAAAAAAAAADRH7ebs8udwHbHHq1xTV1y+f9D7ld34xLFbmbtOI3btbe4wrk4xlKOJqbGZn72filPFcaVZS9PmjBnjr0hPP9M/gtqYvPyHCT8f6yve+XUme2bHPb+sxVvkzz+hlal7qX2iqeEnjfPh9z29Gv0l4oVjjO+fL5NbR6hpj8/HbNKzNYnZ5DNr6nFV7zPeM0REd+yCGg02pgAAAAAAAAAAAAAAAAAEon3c3u4hxvm/Nu1Plm19Ov5pC7yrp5ayb3nxv8GxbubPUYUJSpSFqerxdntbkaRrWV6M5er5+EnPZ46sjW3d3pbay9qbsTtcfFrR/t+OsTlxUifonFXJlmP7Lv8AbUZe+Q9n23M9L9M+PfAaEW2+mr4+A6wyYcfb/Wjby3po8js2iJm2Sm9n0tCkzPpjmsdvTumHpeNdQAABo/8Absd3le3jtSyunPHNl9E591wyI8YwJY16kM/Wcet3K5232VLdK+r6Lm42uy9JcuSj6PObWFJeutKMJ+OXVv4X+lr8drZfJv8AN2jWp5Z+vx68T582Tt8/JeuO+CZn0nzzHfus+91h7PP82Dx7wdZczpfVHSfhfitzm1GfF5tTe5i9PqXjtLzzEV+qNbNua/J0pWfP21ot28vdAnrWta1rWta1rXzWtfnWta/XWtfv1qgm2uvl8gAAAAAAAAAAAAAAAAAHe/bL0M5L3IddOm3RriuHfy9jzXkmHr79bEa1rjauzG5n7jLlLxWNumPqsPNuwlP9DW5CEfEqypGv3OmuE2eo+c43h9Wlr5N3Zpjt5Y7+XFXvkzXmflHlxUvMTPp3iIYr8bfFHhfBnws608SOe2cWvpdM8Ls7mL4toiM+/lmmpx2vWO8Tec2/sa2O0V9Ypa1vSImYsz+inSbi/QzpVwTpRw7CsYWi4RxrT6GxTHt0tUzMjX4GPjZm0vRjSlPpW0yrV3Py5UpGk8jIuSpGPnwso4XitXg+L0eK06Vpg0tbDgr5Y7ee2PHWt8to/s8tonJefTva0z2hpK+JnX/OeKXXvVXX3Uezl2eU6n5vkeVy/FvN51sO3tZc2to4pmZmNfRwXx6uCszPlxYqR3nt3ntJ9R0UAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEn/AN2hr/yt9dI/h4Zj1/m2Wpp9X/6VUmvZt/HbnP8AtOv8JhUde+uj/qfeFtv/AKS5o/8AMuQn5/rfvJjKXzXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q//ABdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADKDsor47t+3D8dXTSn8/MdNR2boz+qzpz9OuM/jmFg72mI7+z54z/wDFl1tP7XTnJSs+FmTR4AAAAAAAAAAAfH5DodXynQ7rjW7xbebp+QarYaXa4d2NJW8nXbTEvYWZYnStK08Xce/chX79PV5p83p2MGLawZ9bPWL4djFkw5aTHeLY8tJpes/cmtph9HiOV3uC5XjOa4zPfV5HiN/T5PQ2MczF8G5o7GPa1stZjtPfHmxUtH2+3ZWw+0S7Xdv2ld1fU3pjl4l21oLu7yuRcNzK2a28XN45vZR2mNDCl4pC7Z1c82WpnO3WVKXsKcJVpOMqUrj8QumM3SnVPJ8ZesxgnPbY079u1b6+ftlrFJ7dpjFN5xTMf11Jj5+jdH9j3xz472gfAbojrjXz478tj4vBw/UmvGSL59bmeKi2hnts17zbHk3q61d+tbxWZx7NbViazEzg66SlAAAAAAAAAAAAAAAAAA7Z6FdWeQdDOr3T7qvxjMyMLa8J5Rqt1SeNOtu7fwsfKt/mng+qlK1pb2GtllYN3xTzW1kTpTxWtK0+rwfK7HB8vx/K6t7Uy6W1izRNZ7TalbR8XH6fRkx+ak/cs6B4pdAcR4o+HvV/QPN6+HZ0Op+D3+MmuesWpi2c2C/1Dtdp/r9Pdrg2qfavhr37x6LODoH1f49166O9POrfGMrHytXzfjGq3Na41yl21i7C/iWvzW13rpKXmet2VMrBu0rX1RuY8qSpStKrLOB5fX53iOP5bWtW+Ld1sWb62e8UyWpHxcff7eLL5sc/drLSJ8WPDzl/CjxG6w8PucwZsG90xzm/xsRnrNMmfTxbGT6g3PLMR9bu6U4NqkxHaaZYmszExLt99djwB4cjIsYmPfysm7bsY2NZu5GRfuypC1ZsWYSuXbtycq0jC3btxlOcpVpSMaVrWtKUflrVpW1rTFa1ibWtM9orWI7zMz9ERETMz9p7MOHLsZsWDBjvlzZ8lMOHFjrNr5MuW0Ux46ViJm173tFa1iJmZmIiO8q7/wBsB3b3u67vA5pl6rNu3uB9MsnI6f8ADsaU6yt26aS5HD3+VCtPTbvW87f42xy8W9GHiuNfhSM5xr6pV8+LnVs9VdXbt8V5tocba2hp1mZmI+BPk2LR8omL565L0mI/E2j1luC+7v8AZ9x+Afs7dNa2/rUx9V9b4cPV3UmaKxW955Ok7HE4LRPe+O+rxObT18+K1u8ZsVptWtvrY1WsXJ3gAAAAAAAAAAAAAAAAAJgPu6vZpHR8V5X3c810/wDwjyemXxLprTNsUpLH1eHsYWtxu8ak40uWsmWbrL+DZvUrSFzBy7lYxlSdJ0lx7PPR/wAHV2+rd3D/AEza82pxvnr+JxUyds2esTHeLTfFbHFvlNLz279+7Xe98V7SE8pz3Aez30zyXfT4OdfqDrX6ly94zb+zp2ycdxeea2mmTBXW3cO1kxzE2x7WvTvas1mqUulAooAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJ592il/yxdcofh4Par/ADbTT0+f9H/zSY9m38eOc/7Rr/C4VH3vra/9Tnwut9rqjJH7ehyKY+mA1yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfvx0Hj8n9XT/SgH43fZA5b9g/gMTbo91z+Q/wDD39Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMn+yqvju37b/wB/rX0zp/PzLS/0OzdGf1WdOfp1xn8cwsHe0x+R98aP+LLrf/8ALfJLPlZk0eAAAAAAAAAAAAEdj3hDs+n1a6D6TuL4lqvpHMOjd2zicili2Pi5mw4Vss6tj4UbVqnxJ012y2ktlkX60uUtYli5WfotwrKkevH/AKRnluCwdRamLzbnDzWmx5K975NLJeazWIj1n4eTLOW1u0+WlZ7zEQuH90R7RFfD/wAVuU8HOoN/4PTviPjybHDxny/D1tPqfT1Yy/EtfJPkr9WaejXSw4oms5NjNWK+a9orMI5Cxs4gAAAAAAAAAAAAAAAAAJgvu5fdvXfcP5z2o8s21J5/E5XuX9PbeVfpDzpM3LtV2uoxKXZerIyfzTz87ZVt261nbxYTl6KW7fqpLn2d+rJz6m70rt5e99TzbfHxae39IvePi4q9/W1vi5L5O0fKsTPbt6tdv3yPs+xxPUPS3j50/wAfNdXqCMfTvV98GKbf66auveNDkdiaR2w4fqHU1dLz3iK3z3rHnm9orMpNJ9RWA1b+147tcbtR7P8Am2w1+dbxuddSce9wDhNms/TcuZW3tVhubsYxrGdK4/HvzVvWpxlH03rcK+a1p6a4w8W+q69K9I7uTHeK73I1nQ0o79pm+aO2aft/W6/xZiftxCdPu9PZ/wA3j37RPTGnuat83S3RebH1b1NkinelMHHX83G45mYmkxl5j6gx5KTFvNivaO0RPeK7XIyL+XkX8rJuzv5OTeu5GRfuyrO5ev3pyuXbtyVfnKdy5KU5yr86yrWtfrV72ta9rWtM2taZta0z3m1pnvMzP0zMzMzP224XhxYtfFiwYaVxYcOOmLFipEVpjxY6xTHSlY9K1pSsVrEekRERDwvx7AAAAAAAAAAAAAAAAAGRXah0A5J3OdwHTPoxxnEvZORy/kmLjbG7C3KVrC0uHC7stxk37lP0FiNNZhZULNy7KMK5E7UP0UpRjLsPSvAbPU3P8bw2tSbW29itckxHpTBSJyZrWn5V/pVLxEz6eaYj1+TD3j54tcL4IeEnW3iVzexjw4eneFz5tPHe9Yvs8nsWx6XG4MVJ+uyzO7s4LZK0ibRhrkvPaKzaLMvpN00410d6bcK6Y8RwrODoOE8a03HcG3ZtwtfGjqtfj4U829GEYxllZs7EsrKuUjH4l+7cnWlKy8LJ+K43W4fjdLjNSlcevpa2HXxxWIjvGLHWk3ntEd7Xms2tPb1tMy0mOv8ArXmvEbrTqbrfqHZybXLdTc1yPMbd8l7X+Hbf282zXWxzabTGDVrljBgp3nyYsdK957Ow30HTwAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASc/do5f8ALT1vj+HgUK/zbbS0/pqkv7N34883/wBoR/DYFIXvrI/6mnhhP/0rtH/o/k5j/BKZKmC1xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5WtI0rKVaUjSla1rWvilKU+uta/epQ+XzfsRMzEREzMz2iI9ZmZ+URH0zLjmTzHieFdrYy+SaPFvR/VWr+zw7Vyn8MJ3oyp/M41tzVpPlts4K2j5xbLSJj9aZiX2MPTvPbNIy6/C8pmxz8smLR2clJ9O/pauOYn0mPpe/rt7pdv5/Mvba7Y+PPn6FmWMnx4p5r5+DOf3vn/AAfN7MefBl9MWXHk/QXrb/BMuLucXyXH9vq7Q3NPv8vqnXy4e/f5f7ZSvzfVe1wAAAAAAAAAAAAAAAAAFfP7cv8AZDurn/5vQeP/ALg6z+nygH43fZA5b9g/gMTbn91z+RA8Pf0fLd/7rb3+Ls0/sRrEQAAAAAAAAAAAAAAAAHK+B8w23Tzm/Due6GUIbvhPKeP8t1FbtJVs/mnxzbYm4waXowlCU7NcrDtUuwpONZQ9UfVTz5crR3MvH7unv4JiM+lta+3h7+sfF18tM1O8RMTMeakd47x3jvHd8Hqrp3j+r+mOo+k+Vre3GdT8Fy/T/IxjmIyfUPM6Gxx218O1q2rXJGDZyTS01tFb9p7T27LBP2fntWOgPebxHj+ky+Ta3hXWzHwMbC5FwbkGbY12Rs9vYtRjfyeMzzZY/wCbVjLjSOZ8LApkyxaXZ2Ls6zsXK0n30D4p8D1jqa+G+zj0uarjrTY0ti9cdsuaI7WtrTfy/GreO1+2PzzXvNZnvWZajXtb+wX4tezd1Dy/J6/CbvU3hll2s+zw/VPEa2Xcw6PH5MlrYsHN11q5fwNy68zOtN9ucNc80rlx1iuWkNrTKaBQAAAAAAAAAADinOuG6PqHw3lPBeSYtvN0XLtBt+O7XHuQhOk8HcYF/X5FYUnGUY3YWsiU7U/TWtu5GM6fONHF3tPByGntaOzSL4NvXza+WsxE96Zsdsdvn39Yi0zE/RPaX3uluo+U6Q6k4Lqnhc99blenuW4/mNDNS1q+Xa47axbeGLeW1ZtjtfFWuSneIvSbVn0lWfd6/bjve1buV6o9HdziXMfG0HI8vI49e+HKmPlcb2vo22jlj3q+YZH0fWZ2Li5Fy3KUaZNq7CtIyjWEa2utOnc/S3UnKcPmpNa4Nm9tee0xW2tl7ZcHlmfS3lxXrW0xM/XRMekx2jdh9mfxl4rx58FehfEfjdimXNy/Da+HmMfnrObBzWh5tDlIzY47Ww/G3dXPsYaXiJnBkx2jzVmLTim6szyAAAAAAAAAAAAAAAAAyg7Ne4Te9r3cj0s6x6TMniw41ybDhu40lP4eRx3aevVb63dtxlGlz06nOzLlmkvVSN+FufprWNKOzdHdQZ+mOo+L5jBeaxrbNIzR9FtfL3xZ4mPp/pV7zH2rRE/OGDvaP8IeK8cvBjrzw45PXrntzfB7NuMtMV8+HmdHy7/E3x3mJnH35DV1qZJrMTbFa9O8RaZWZnA+ZaXqJwvinO+O5NvK0fL+PafkervW7kbtK4W51+PsceE5Q+XxbdrIjbux8UlC5GUZRjKlaUsn0dzDyOlqb2vaL4NzXw7OK0TE/WZsdclYmY+mIt2mPomJiYhpL9VdN8n0f1Lz/SvMYb4OU6d5jkeG3sd6WpMbPG7ebTzWrW3r8O98NrY7d5i1JrMTMTEzyxy3wEDD273d5b7he6m9004xs6ZnAeh9mvGseuNe9eHseUyh8Xe5d23SUoxzdVn5Ox0lZU9Pi3YlGsfPmqCnjn1bHUHVNuN1snn0OEidavlnvTJszHfPeYiZ+vxXtkwzP2q/ntrT3Vns838IPAbH1rzujOt1b4oZY5rNGfH5dnT4KLfD4rXpea1mdbf1MOnycRPmjzZYmJ7dmjZhJaIAAAAAAAAAAAAAAAAAAmRe7tdm39x/T3lHdjzTT1t73n1Mri/T+mbj+i9h8b1+yhDZ7GFq9D4tq/l7HVVpi5Mawje12VWsKThdpOswPZ76P+pOP2uqt3D2z7/m1dDz17WprY8sRlyREx3i18mL620du+O30xPdrje+G9o/8MXV/BeAPTXI+fi+k/qfnerp1c3mxbPNbmla2lpWvjt8PJi19Lfic+GfPOPcwx5prenliTskwpAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJt92lr/y49bKfh6fef5txo6f0pK+zfP8Ar3zMf/MO/wD5XB2/xqRvfWR/1L/DGf8A6X9v2+N5Wf8AEmVphtcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0T137mOiHbTxm7yzrR1C49wrWxtzuY2Psthi29ts/R59VvUaqd6GZs71K/L4WJauz9VaU8ea0fC53qThOm9adrmeQ19LH2ma1yZKRly9voxYptF8k/cpEyyp4VeCfif4185TgPDXpDmOpt2b1pnzaWnsX0NHzdu1+Q364ra2ljnv38+xele3ee/aJR/+473kTpZx2mw03bb002fOdjbrdhhcu5jTL1Wgrcj5jGt3j87Ws29y366Vr6refGk4VpWNafXXAnUXtF8Xr/Ew9Ocbl3ckd4pt7nmxa/f1+evNceWYiftZI7wtr8Gvcx9d8xOnyXjR1rpdLad/Jba6e6cnX3+Xilu0zFOXrfd4+l/LPby31LTW0TFon5NHvWn203f11iyMmNnq1d6caXKrOl7j/AsDFwtdO3KtfTCV3b29xsI0hTx4rbzYV8/XWtPkwnzPjL15y9reXlp47DaZ76+hjpTHMT8o75ozZI7fcutA8NPdqeyd4c4cM5PD+nWXJYIrOPl+rNvPs7lLxEea0U463Hak+aY9YvrWiI9IhgRyDuO698pv3snfdYeomfevzrcuz/uq22L651r5rX0YeTjwjStf+bGNI/e8ePk6JsdRc9tWm2fl+QvaZ7zP1Vmp3n86lqx+8lfxHg34UcFix4eK8Ouj9XFirFMdfwB4/P5axHaI82zgzWme30zM2+64bc6mdSLsqzu9Qeb3J1+uVzle+nKv8MpZ9a1/ncOeS5GfWd/dmftztZ5/w5HY69E9GUiK06R6YpWPlWvAcVWI/OiNSIe5gdXOquryLOVrupXPcO/j3YXrU7PLt9H03bcqShKsPp9YS8SpSvpnGUa/VKlafJ54+W5TFaLY+S36WrMTE1288dpj1ie3xO3p92HH2/D7oPexZMG50V0psYstLY8lcvT/ABNvNS8TW0eb6k81e8TMd62iY+cTEs0elntW+/PpJLFs8e7gOVZ+oxfRT8wt7a1ey19+Fuvmlu9cua+OwlGv1V9GbCVaf853Li/FPrriZpGvz+1kw0/6xnjFkx2iJ79rTOP4nb868SjX137BPspeINdjJzHhHwOryOfzf668Vk39LcxWt87Y6U251ImPnHm1rRH2uzdV2w+8jZ1q/rdB3TdMcS5iS+Hj5HNun1M6xXDtxrSks3YaXLv7vM2N2tK1rK3g1xqVrTxGNPv5n6Z9oy8Wx4OqOMrNJ7Vtu8f56+SPpvkw3tmvkn6Zik1+592tDxw9zFq3xbvLeBPXGxTYr582Hpjq6dXLGxee811tTk9fFxmvp0j0it9uM/aJ9ZlJb7eu5/oj3ScNxucdFed6bl+qu2oXM3ExMux+bOluT8UpjbvUfElnarI+dKxs5tmzclCUJ0j6Zx8yQ6f6m4TqjTrvcLvYdvFMRN6UvX42GZ/rc+LvN8VvX5XiJmO09u0qU/F7wO8TvAvqPN0x4l9K8l07v0yWprbGxgyzxvJUr375uM5DyRq7+H0mJya2TJStq2rM96y7/ffYlAAAAAAAAAAAAAAV8/ty/wBkN6uf/m9B/wC4tagH43fZA5b9g/gMTbn91z+RA8Pv0fLffbeaf2I1iIAAAAAAAAAAAAAAAAAD6em3e449scXb6HaZ+n2mDehfxNhrcq9h5ePetypKE7V/HnC5GtK0p8qS8Vp5pKlaVrSvtw5s2vkrmwZcmHLSYtTJjval6zHymLVmJhweR4zjuY08/H8ro6nI6Ozjti2NTd18Wzr5sd4mtq5MWat6WiYn6Y7xPrExMRKTx7ML26m14XPR9Eu8TbZW843cuY2p4x1YuwlLZaT4k42sPH5V8KMrOTrYTlHGrsI2cKmFYrHLzsi5CxelOS/hn445dKcHC9X5bZ9aZri1uVt3+Jg7z2pXa7RMXx9/rfiRWnkrMWvaYiZUge3D7rPQ6lrynid7OfH4OL5qlM3Ic50BS0Rpcp5K2vsZuBnJaMmDdvWJzfUk5NmdnLE4NbDS2XHWsvHjXJdBzHQ6rlHF9tgb3j+7w7Ow1W31mVZzcDOxL8aSt38bJx53LN2FafKsoTlSkqSjWvmlaJa62zg3MGLa1cuPPr56RkxZcVovS9LR3i1bVmYmJ+5LXo5rheW6c5bf4PneP2+K5fi9nJqb/H72DJrbWrsYp7XxZsOWtMmO0ekxFqxMxMTHpMPuPe+WAAAAAAAAAAjIe8Vdof8Adj004j3UcT1VJ7rp5cxuNc8u41qlZ3+L7LOnZ12ZdjClLlzItbjZ4lid6VZ0t4lukaxjGHqpGn2hekvqzjdTqjUxd83HzXW3prXvNtXJeYx3mI9ZtGbJSvf17Uj6Ihd37nX2hvwuda9Q+A/P7814zrCmbm+lKZskxXFzulq1ybutjm8+SmLJx2lny1x1is32LzPeZt2mGsh62PQAAAAAAAAAAAAAAAAAE3/3fHu4udX+3vddAOUbOuVzHotkXr2npk3viZufwrZZsb9rKn5lWtLOuz9pa1NikYxpGzYtx+daeazX8AOrJ5fgM/AbWXz7fDWm2HzW73yaWW/mi0+v4nHkyxhr6R2rWPz2sJ73b2fKeHni9xni3wejGv054l4seLkfg4/JravU2jqziyYK9o/2zd1NDJyGWZme+TLefTv2jZ97Qzua1Pah2p9U+qGZl2rO7px/K0HEsWt6lvLzOQ7/ANGnxJ4MPPxL1/WfT67WUbcZVjZwrk50pCMpUyZ4g9S4uleleU5O94rn+p76+pXv2vfYz9sNJpHfvNsXn+LMR37VpMz6IO+yD4I8h4+ePfQfQ2vr3ycZ+C+Dluoc/wAOb6+vw/E+bkdiu1btNMePd+pY0K2vNYtk2a1rM2mImtZ3+92fJ97ueSbrKuZ243+12G52mZdlWVzK2G0y72bm351r/wA69k37lyv3vMvlTwrh2M+TZz5tnNab5tjLkzZbz87ZMt5ve0/dta0z+u3TeJ4vS4Ti+N4bjcFNbjuJ0NTjdHXxx2pg09HXx6utirH9jjw4qUj7kPkPU+gAAAAAAAAAAAAAAAAAyd7Ou3XkfdP3FdMujPHsS7kU5NyLG/NvIjanLHwOP4ELuy3GRl3o+IY0LmDhX8WxduyjCuXfsW6eqc4wl2bpDp7Y6o6h43htek2+qdivx7dpmuPXxxOTNa0x6ViaUtSszMR57Vj5zEThH2i/GLhvAnwd638SeY2MeKeD4fN+BmGcla5tvl9u2PS47Fr4573zWptbOLPlpjra0YMWW8+WtbWrZh9NOn/HelXAOH9OeJ4VrA49wvjmm43q7FqEIecXT6/H19u9dpCMYzyMiOPS9kXfTSt29OdyXzlVZLxuhr8XoafHalIx6+lr4dbFWIiPrcOOuOLT2+drRXzWn6bTMz82k71r1dzHXnVvUXWXP7OTb5fqXmeR5rey5L2v2z8jt5tu+Ok2m01w4pzTjw07zFMda0j0iHOHNdXAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJn92lr/y89ao/h6cTr/Nu+P0r/pokn7N/4+8z+l0/w2BSX76uP+pT4aT9rrOsf+jOWTMUxWt2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0B+1F9tDxPtWlsejnQK9o+cdbZWrmPutlcuTz9BwSl6lYU+kywMizG/vYw9V6zh1zIzxJSxr+VjXbN2MZ4F8TvGTV6W+Jw/Azg3eamJrmyTM5NfR7+n180tXzZ+311aef63vW1qzEwtp9hj3a/P8AjxGn4jeLOPlOl/DGuSmXjNKlK6nLdVTjmLT8CNvDkti4qbdseTZjXmuxEZ8WDPTLjm1YYnWbr51d7geXbLm3VvnW+5lvdnkzybtzZ5k5YmPWUq1jaw8C1S1hY1u1HxCHwrEZ1jGlZynLzKsOOZ57l+f28m7y29n3M+W02mct58le8+kUxx2pWI+Udq9+3zmWyX4b+E/h74R9P6XTPh90rxXTfFaOGuGlNHWrGxl8sdrZNjbyefZz3yW73t8TLasTMxWta9ojp58hkQAAAAABkD26dz/WftY59quofR3mOx45ttbl2r+TgRvXLml3WNGUaZGv22urKlrIxc2xSeNflb+FlRs3JVsZFm7GFyP3+nepuZ6X38XIcPuZNfLjvFrY/NM4c1Y/FY82Pv5bVvX620x2t5Zny2ie0xiTxj8D/Dbx36S5Do/xH6c0+Z4/d18mLDt2x0pyXGZpiZw7nH7kVnJhz62Xy58Vb/EwWyUj42HLSbUtPq9mx7Rjp9369LYZ+NPF0PVniuPYxuoHDK3vTdx8msY+jb6yzelW/f1GbSVKW78ZX7cci3k2a3qzszjGePhx4h8f13xnxKTXByurWtd/T79prbtHbLji0za2K/f0tE2jzRavfvHZqce2j7HHV3so9dW1M9djlegOfzZc3SPUvw/NjzYYtbzcfvZMdYxYuR1prM3xTGK9sNsOWMcVyVm2y1khCkAAAAAAAAAAAABCP9tZ2Td0fM+9Hl3Urp/0T6i9RuIc0wdVlavacD4nu+V2rFcPX4+vvY+w/MTCzPoV+l3DuTjbyK25ytztzpH0zjWsLPGfovqfc6y2+R4/heQ5HU3KYr4sujqZ9qK+XHXHNcnwaX8lu9JmIt2mYmJiO3q2cPdne0z4F9N+zV0/0X1b4m9HdHdQ9Nbe/r72j1Xz/GcBky/VG5m28eXU/BPZ1vqrFOPZpWb4fPWL1vWZ70tEahf9wl3qf+Sf3Df+iLnP9iMSfhG6z/Mr1B/cne/zKw3+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEmf7hLvU/8AJP7hv/RFzn+xD8I3Wf5leoP7k73+ZP56j2af9/zwg/8AvC6W/wBJn+4S71P/ACT+4b/0Rc5/sQ/CN1n+ZXqD+5O9/mT+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEmf7hLvU/8AJP7hv/RFzn+xD8I3Wf5leoP7k73+ZP56j2af9/zwg/8AvC6W/wBJn+4S71P/ACT+4b/0Rc5/sQ/CN1n+ZXqD+5O9/mT+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEm8d3sX7z7Fq7fv9qfcHas2bc7t67c6Sc4hbtWrcazuXJzlpaRjCEI1lKVa0pGNK1rXxR+T0P1lWJtbpbn4iImZmeJ3YiIiO8zM/B9IiPWXnj9qT2bMuSmLF49eEWTJkvXHjx08Qel7Xve9orSlaxycza1rTFaxEd5mYiPVi7mYeVr8vKwM7Gv4edg5N/DzMTJtTs5OLlY12VnIxsizcpG5av2L0J2rtqcYzt3IyhKlJUrR1i9LY72x3ral6WtS9LRNbVtWZraton1i1ZiYmJ9YmO0s5a+xg29fBt6ubFsa21hxbGtsYb1y4c+DNSuTDmxZKTNMmLLjtW+O9Zmt6Wi1ZmJiXrvF7gAAAAAAAAAG6/2WXtZufdnXMdV066nbXY8v7f8Af59nDz9bm3ruTm8LuZco2IbnSZFazuQxcW7K3fzsO7bybdzEjk28eOPdnC7DM/hf4rb/AEhuYuO5PLk2+Az5K0yY72m19KbT5YzYbes+SszFslJ80TSLRXyzMTFZvt2+wB0n7RnTm/1j0RoafT3i5xOpl2dTd1sWPBq9TU162y243lMURWls+ekXxauzS2G9Ni2G+a2XHS1LTv8AhHNuMdRuJcf5zwzcYW/4vyfWY2202219+1k4uXh5UKTjWN2zOcKXLUvVZyLXq9djIt3bNykbluUaTn0t3W5HU197TzUz6u1irmw5cdotS9Lx3jtMTMd4nvW0fOtomsxExMNVfqfpnnOjeoOX6X6l47Z4nnOD3s/H8lx+3ivhz6+xgt5bRNMla2mmSvly4cnby5cN6ZaTNL1meVOU+CAAAAAAAAA656udNOPdYumfN+mPKcSxmaTmvGtvx/KhkW6XYWJ7HBv42PnQhKlafHwMi5azMeVaV9N+xbl4r48Pnctxuvy/G7vGbVK3w7utm17xaO8VnJS1a3iP7LHaYvX7VqxLuXh71tzHhz1t0x1xwWxl1uT6Z5rjuXwWw3nHbLXT2sWfNq2tExPwtvDS+tmiJjzYst47x37qynuh6F8i7bevPUzo1yfDv4efwzk2dh4kb8fTO/pcmdM/QZlflSlfpmlysDJrWlKUpW7WninjwrW6n4PY6c53kuG2aWpfS2b0p5omJthtPnwX9fn58NqW7/dbt3gb4pcP4z+FPRPiRwmxi2dXqXhNXZzzinvTFyeGs6nLa3zmY+puSwbWCIn17Y/nLoN8FlgAAAAAAAAAAAAAAAABn/7M7un2faX3bdM+fRy7tri243GPxLmuDS5W3i52j5BWerhczPH/AOB1WdmY238+Y0pPCjWVfRStK998NuqMvSnVnGb8XmNXNmrqbuPv2rfBsd8Xe/3MV71zfn0jv6QiX7bHgTo+0B7PvW/SdtfHfnuO47N1B0xtTSL59XlOIiu9amt3if6bv6uvn475TM12piI7zDZv7wZ3l67rF1V4L0D4FvLey4P091Gs5busjByKXsHack5Lp47LV5Fm/YlWzesWuP7uxauWqyufDyoS9VYzj6Y5K8fuscfMcro8DoZ4yaXH4cW3ntS3emXY2cMZcVoms+Waxr54iY9e1o+iYmEIfdF+zfueHPQXVXix1Zxd9LqjrDkN7p/jMO1hnHtaHC8JyNtLew5MWWvxMWXJy/GZb0v2pN8F47RNbd5jko8LkgAAAAAAAAAAAAAAAAAEz/3eHs2l0+6Vck7puZ6atjk/U6mTx/hNM7GraysDiGv2cY5eVSzfj8W1PZbDVWsnDyoUtUva7IpWHxLd2k6zH9n3o78D+K2eqN3D5dnk/Nr6Xnr2tj1MeSPPbtMd4nJkxRalo7d8dvTvE951svfA+0fXq7rzhfAnprkoy8H0P8Hl+qJ1c3nwbfUW5pWtr4JyYp8l6aWnv3wbOC03nHuYe14pek1iSykipUAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJh92ml47gOtEfw9M71fH8G94786f0pJezf+P/ADEf9jbfvZ9f/lUn++qj/qSeGtv/AKbY4/8ARXMT/iTN0xmtuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0i+2T9pRj9nXS+vS7pvscefXbqVqcq1rZwuxnf4Zx7L+Ngz5NPHjL1Uy7k4ZsNRO9+kQzcKsrtrIhStquFPGHxHr0hxc8XxuSs87yWG8YpiYm2nr37452ZrHyvMxeMM2+ti9O81tHos693D7Fmb2jOuY6660081PCrorkMF92t8c0xdS8xrzj2qcLTNavadelba1uRrj/AKbbV2e2PJhvNciBru91teR7fZb7eZ+VtNxt8y/n7LY5t6d/KzMvJuVuXr167OtZTnKUq/f8Rp4jGlI0pSkF82bLsZcmfPktlzZr2yZMl5m173tPe1rTPrMzP/JHo2sOM43Q4bj9PiuL1MGhx3H62LU0tPWx1xYNbXw0imPFjx1iIrWtYj7tp72tM2mZn5b1OcAA/qEJ3Zwt24SuXLkqQhCFKynOUq+IxjGnmtZVrWlKUpTzWpETMxERMzM9oiPWZmflER9My8bWrStr3tFaVibWtaYitaxHeZtM+kREeszPpEOd4fSzqVsMWWbgcC5fmYcI0lPKxePbS/jxjX6pSvW8aUKUr+GsnOpxfJZKzfHobl6R87V18tqx+vFZh1fZ666L089dXb6s6d1tm0+WuDPzGhizWmPSYjHfPW0z3+js4jsNVs9Terj7TX5mvv0r4rZzce7jXaV/ft3YwlT6q/XRxcmLLit5cuO+O39jes1n9qYiX39Tf0t/HGbR29fcxT8sutmx5sc9/l2vjtas9/z3oPW5YADKrs17rOednXXbiHWPhGXfpDVZ+PY5NpYXJRx+Q8Zv3aWtxqr8PNLcrmRr7mVZxbs6S+j3rtL0aeYu0dH9U73SHOanMaV7dsWStdnDE9q7GtM9suK30d7Y5vFJnv5bT3YH9o/wF6U9o3wr6i8OOqNfF5t/UzZeE5K1Itm4fm8VJycdv4rdpvFMO3TBkz46TX42PHOO09pWQvb1114P3IdIeFdYen+zx9lx/mGosZ8Y2bsZ3cDM/RWs7XZdulfXYv4uVau2/RdjCc7dLd2kfRcjWti/T/OaPUfE6XL8flrk19vDW8dpiZpf1rfHePnW1bxMesR3jtPbtLTK8XvC3qjwZ8Q+pvDrq7SzaXL9O8jl1LTkpNabet6ZNXcwX7eXLiz4L47+bHNq1vN8cz5qWiO6X2WNAAAAAAAAAAAAAAAAAAAAAHw+T09XG+Qx+9XR7an8+BkUejZ9dbYj7eDL/B2fU4Se3NcRP2uU0J/a28UqsrrHTx1d6qU/B1I5xT+bk+0oq/5j8duU/THd/jOVvY+HM9/D3oOft9GdLz+3wmi64fOdzAAAAAdg8e6TdUOW27d3i3T3mfIrV7x8K5peObbZQuefq9EsTFu0n5/82tXP1+K5PbiJ1eP3NiJ+U4dfLkifzvJWf/3+nzdR5jr7ofp+98fO9X9N8Pkx/wC2U5LmeP0rU/RxsbGOa/r9n3Nx0A648ehW5vukPUjTQpGkqz2fDd/hR9NaeqkvVkYFunp8V8+fPjx8/qe/NwPN68d8/Ecjhj598unsUj7f9djh8zjvFnwv5e3k4rxD6M5K8z5Yro9ScRtW83ft27Ydu89+/p2+fd1PfsXsW9cx8m1csX7M5W7tm7CVu5bnGviUJwlSkoyjWnitK0pWlflV8q1bVtNbRNbVmYmsxMTEx84mJ9Yl37Hlx5sdMuHJTLiyVi+PJjtF6XraO8WraszW1Zj1iYmYl4n48wAEij2I/tO9h0J53ru2nrTyG7kdI+cbG3hcM22yvTnXhPJc6UbWJhUvTlWNNNtc74WPS3OlK42Xn3ciV+liNLcZCeCviZk4Pfx9N8zsTbid7JFNPLkt/wDEtnJPalPNM9vg5b9q9p9a3yTbzeWO0U8e859h/U8Veldzxq8NeHx4fELpfTvtdScfpY61jqbhNWJybOzOOtfNPJaGt583nrMxn19WmGMXxZm9ptlm9ZybNrIx7tu9Yv2rd6xetTjO1ds3Y0nbu25xrWM7dyEozhONaxlGtK0rWlU062i1YtWYtW0RatonvExMd4mJj0mJj1iY+cNZHLjyYcmTDmpfFlxXvjy48lZrfHkx2mt6XraImt6Wia2rMRMTExMd4eR+vAAAAAAAAABFH9417QaZWu4T3b8Q1Pi5rqY/DupdzEseIysXr9y3puQbG5SlayvSyMjWaO1WtYxpat2o+msvnWK/tEdIxbHpdWamLtOPy6fJTSPnWbTGHYyT9vzWxYI9e3aI9F93ubfaGnBudT+z51FyHem58bqTommxk72jNjxUvyXEadO8RXHXFh3uVydomZvfJMz29ER9E9sFAAAAAAAAAAAAAAAAAP2MpQlGcJShOMqSjKNaxlGUa+YyjKnitJUrSlaVpWlaVp5p8yJmJ7xPaY9YmPnE/bfkxFomtoi1bRMWrMRMTEx2mJifSYmPSYn0mHu7HZ7Hb5Vc3aZuVsMutrHsVycy9O/frZxbNvGx7dblysp1hZsWrdq3Sta+mEIxp8qPPJlyZr+fLe2S8xWs2vabW7UrFax3nvPatYiI+1EQ42no6fH4I1tHWwamvGTLljBr464sUZM+W+bNeKUiKxbJlvfJeYj1taZn5vReDlAAAAAAAAAAAAAAAAAMseyTtr5D3X9yfTPo9o8S7exN1v8AGyuS5dLU54uu43rKXNltb2Zej4hjW8nGxLmBYu3ZxhXLyse3T1TnGEu1dFdN7HVXUfG8RgpNqZtittm8RM1x62Pvky2vMfiYtWk46zMxHmtWPnMROAvac8auH8AvBbrfxF5XYpi2OM4nNg4XXm9a59zmt6aaWhj1sc97Zr4M+xTby46Vtb6nwZbz5a1m0WXPAuE8f6bcK4rwHiuFa1/HuH8f1HHNRi2oQhSGBpsDH1+NW5S3GMZ3p2ceEr1zxSty7WU5fOVVkehpa/HaWroatIx6+nr4tbDSIiO2PDjrjr37fO0xWJtPzme8z6y0perOp+X606m57qzndm+3zHUXL8hzPIZ72tbzbXJbebczxTzTaa4q5M1q4qd5ilIrWPSIcuct14AAAAAAAAAAAAAAAAABDM95m/X87dPxZcr+0Gr/APgh17Sn4/dPfpZtfxjH/wAjZF9yX9ifxj/VvwH3o3v+VGaRsXZgAAAAAAAAAAAAAAAAJLfu1EvHcP1lj+HpfkV/lpv+N/8Ax/zfwJIezfP+yHmI+j8C7T/5xrKU/fVV/wCo/wCG9vtddYo/b4jmkz1MhrZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOqeuHV7ivQbpRzrq3zPKt43H+Dcc2m/zIzvQs3Myuuwr+Xa1+LWfn4mZnSs/R8WzCM7l29OMIQnKtI1+VzfL6vA8Vvctu2iuvo6+XPfvMRN/h0teMde/zvfy+WtYiZmZiIiXffDDw857xW6+6W8PumsF8/L9U8zocRrTXHbJTW+rNnFr33M8V7eXW1a5PjZ8lprSmOtrWtWsTMVoXdP3Ccy7oOufPesfNdlez8/k+6yrmvtXJT+DrdLZuVtazAxLU5Srj2LePCN2dqlaU+kXr8/FKzrSlbnVHUG51Nze/wAxu5LZMmzmtOOJme2PDE9seOkT+JrFYie39lMz9Ldd8CfCHpzwN8Luk/DjpnSx6mpwfG4Kbl6RX4u7yeSkZN7b2MlYr8XLfNa1K3mO/wALHjr3ny95x6dfZeAfe4xxfkPNN9q+L8U02x5ByHd5ljX6rT6nDv5+xz8zJuws2MfFxMa3dv37t27OEIQt25SlKVKUpWtXv1tXY3M+LV1cOTY2M9648WHFS2TJkvaYrWtaVibTMzMREREz3fK5vnOI6b4rf5znuS0+I4jjNbNub/I8hsYtTT1NbBjtly5s+xnvTFjpSlbWta9qxERMzPZKO7Hfd49husXSdQu7/kORqcPLs42wx+l3GbuLHZRjKkb9uzyHa3IZ9mlq/SsbeTg49rBzbFKXYSuwnWPpk70T7PuTNXByHV2xbFS9a5K8ZrTT4kfTFdjLMZI7W9ItSsUvXtMTMSov9qD3wGpxmfk+kPZ34fDyGzgyZtPN11zmPPOlMxM4r5OH0KX1MnxMUxa+HazX2tXLM0tFLViYmRt0d7Eu0joPhWsPpp0K4JpawsxtXMrL1kt5k5EqRpGV65Pe3tlGN2fj1SrZhapSvzhSKRHEdDdJ8FSKcbwejh7R2m18U57Wnt2mZnPOTtM/8GIj7UQpu8Rvap9oLxW2b7PW3ip1XyUWyTfHg196OLwYYm3mrjpXiselM46/KIyWvMxHa0yyItdP+B2LdbNjhPEbNqtPFbVrjemt260/BWEMKka0/e8OwxoaNY8tdLUrX7Ua2GI/ainZh7J1b1XlvGTL1N1DkyRPeL5Oa5K94n7cWtszaJ+73cF5r259BuoupyNHzPpFwDeazKjKORj3eNa3FncjOniVPpWvsYmZHzT78MiNfwV8uDu9O8FyOK2Dc4nQz47x2tWdbFWZ7/8ADx1peP1rQ7T0z4yeK3R3IYeU6b8QureL3teYnDmx83u560ms94/pG3l2Ne3b7VsVoaV+733fvtw6r6nP3XbpKXRLm9uF/Iw9VZuXtlwzYX60lc+DlYubK/tLVy/OtYRvQ29qzalKMpQrCNaVwz1b4B9O8riyZunZ/AXdiJtTFE2y6d59Z7WpebZYm0+nf4sVj09IiFlvs8+9v8ZugeQ1ON8Y618TumL2xYtnfyUx6XUupiiYp8XBsa0YtHJTFXta2O3H5MmSImtbRaYlEO7o+0rrX2g9RM7pz1l4tl6TYWpylqtvbtzu6LkOF5l8PO02zhSeHnWZUjKlymPfvVsXYXLNytLluVKRK6n6U5rpHkL8dzOrbBkie+LLETODYp9F8OWO9Lx9vy2nyzExPaYlsLeBftAeGftD9HavWfhvz2vyenkpWN/j73rj5XiNntHn1eS0bTXZ1clZmPLObFjjLS1MlI8t6zONDrbNYDf97DP2hk+3Lq7DoB1M3l2HSTqvs8XD0t/Nvyrh8U5pm1tYODkW5Tr4x8Tb3467ByqyrTGxYRuZMqQrK5OuevBHxBnp3lvwB5PPMcTyuStMNr2+s1d2/amO0d/xNc1vh47esUpETae3rKpb3o3sg18ZPD23i10TxeO3iD0Bo59jk8WriiNjn+mdb4m1tYbRWO+bY47Fbc2sEVic+e00wVm0RSictZvWsi1av2LkL1i/bhes3bcqTt3bVyNJ27luca1jOE4SpKMo1rSUa0rStaVTdiYtEWrMTW0RMTE94mJjvExP0xMesS1c8mO+LJfFlpbHlx3tjyY71mt6Xpaa3pesxE1tW0TW1ZiJiYmJjvDyP14AAAAAAAAAAAAAAAAAAAAPh8nl6ONchnWvikdHtpefwenAyK+f8z0bM9tbYn7WDLP7WOz6nCV83NcRWPXzcpx9f29vFCrK6x19XV7qpL6/PUjnFf5+T7Sqr/mPXl+U/THe/jOVvY+HMeXw96Dj7XRnS8ftcJow64fOdzAAAbTfZ/eyl68d9OdTf4FqfT7pLg5VuOw5/v8AX36Y2zhbuQ+k4vG7NyeNXa3609WN9JxK5VjFyKXK34Spj3bbKHQXhZzvXF/j44nj+KpaIyb+fHby5YiY81daszX4tv63z189a27+aJ8swgn7W3t7eFXss6v4E7d69X+IG1gvbT6S4ncxTm0r3pb4OfmsuOuaNDFE+XNODY+Blz4Zr8K0TlpZL57ZfY79lPblqdVL7m2H1J5tgwtzyObc5uXNhsbuTTxO5SzhYlcDURxY3ay+BC9rbt2Nv0xuXbkqVlWW/TXhB0X07ixT+BtOS3ccRNt3emcmSbfT2x08mHy9+/li2OZiPSZn5tePxt94v7THjLyG/X8Omx0X0ztWvXD0x0tSmnp48H4mnxNrYja5C2eaRX4t8e5THN+9qUrExEbJNd0/4Hp7VqxquFcT1tqzCNu1DB47qMWkIQpSMaU+DiQr8qUpTzWta1+uta1ZGx8fo4YiuLS1MVaxERFNfFXtEfL5UhDDc6t6q5G98m/1Lz+7ky2tbJba5jkM83taZm0z8TYt85n876Pk93K4lxTOp6c3jPHsyNaeK0ytLrcilaePHjxdxp08ePl4/A876mrf0vra94+1fDjt/hrLi4OoOe1Z763N8vrz3798HJbuGe/z798eas9+/wBLFDrn7Pbs/wC4jCy7HUnohw7N2GRYuWrG71WFPR7LAuzhWEMvFrqb2HiSyLNa0nCuVi5Fuso09dudPNK9V5zw/wCkeoaXryXCad8lqzFc+Kk4MuOZjtF6/BmlZtHzjzVtHf5xLPvhb7XntE+D2zr5Oi/E/qPV1MWWmTLxm/s15TS28dbRa2vnjkMeznrhydvLeMGfDbyzMVtWfWIsftAPYLdRug+r5B1U7b9nsup/TvWxvbHY8QyMeGTzXQ4FJVuX7tmmFaxqbjEw4VlOsMLW1u4+HCt3Iu1pauXKxe6+8CeR4LFscp05ly8nx2KLZcmpasW3cGP52mvw61+NSkd5+tx960jvafSZXteyT71vo3xW3+I6D8ZtHS6G6x3Zx6en1DhzXw9M8tt+WK4seWdrJmnjtjYtEVi2zuxjzbFophpE5KUiOxkY9/Fv38XJs3MfJxr1zHyLF6Erd6xfszlbu2btudKSt3LdyMoThKlJRlGsa0pWlaI92ratrVtE1tWZrasxMTW0T2mJifWJiY7TE+sSuGxZcWfFjz4clMuHNjplxZcdovjy4slYvjyY71ma3pekxatqzMWrMTEzEvE/HseWxfvY16zk4925YyMe7bv2L1qcrd2zetTpctXbdyNaShctzjGcJxrSUZUpWlaVpR+1tNbRaszW1Zi1bRPaYmJ7xMTHrExPrEx8peGXFjzY8mHNjplxZaXxZcWSsXx5MeSs1vjvS0TW1L1ma2raJi1ZmJiYlPG9hx337Dun6CZXS3n2xt5fVHopYxdVeybtylc/f8P8Y8NTuciHq+vEllW9J66Qj8T6BS5P1TlKVZ0eCXXOTqjgb8Xv5IvynC1ritaZ/pmfT+tjDmtHf+tm8YO/aO/w+8+szM6qPvQ/ZV0/AjxXwdddJadtfoXxMy59/Hgx0mNTieou+W3Icbht2/8A4iuvflO1rT5Z25pTtWsVjeazeq4AAAAAAAAAdMdwvRnjncD0Y6idIuUYeNma3mvGNpqrX0qFJ28Pa3MW5LTbKNK+PFzW7SOJnW6/V68ePmlaeaPjdQcPr8/w3IcTtUrfHu62XFHmjvFMs1mcOT8/HlimSPo71jv3j0ZJ8IPEjmfCPxJ6P8Q+C2c2tu9M85o8hk+Bby32NCmeleS0pn1+s3dG2xq39O/lyz27T2mKyTrj0n5D0M6t8/6T8pxcjE3HCOTbPSXI5NuVq7kYmPkz/M3P9EoxrSGx10sXOtVpT0yt5EJRrWNaVVqc3xWxwfLb/FbVbUzaOzlwT5omJtWtp+Hk7T29MmOa3j7lo7ejdy8L+v8Ah/FHw+6S6/4LYw7HHdUcJo8nS2C8ZMeLYzYa/Vur5om0TbT3Iz6uSO/eL4rRPaYmHVL5bvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACa97vb2Zz6V9GN73Mc001cbmPVul3WcTpm4/wsvXcJwdhH1XPhXo/Eh+a2brMbY4mTGlul3BvxrCs7VykqzP8AADo6eL4bP1Lu4fLuct3xakXr2tj0qZI7z2mO8fFvirkpaO3elvTvE951nPe8+0hXrvxJ4rwS6a5GM/Tnh9OPe5+dbN59fd6n2tS3lp58c+S34H627n09nBabzj2sU+aK3p5YkdJEqagAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASVfdqZf+Ef1ij+HpVly/m5Dxmn9KR/s3/wBUXMR/2Kv/ABjV/wCVSx76mP8AqM+HNv8A6e68f+h+bn/Emhpkta4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF+94/wC6CvHOnfTvte0GwnY2fNci3zfmeNauyhclxzAzaR4/T9LlCVLd7a6vZW70ZVnC7bp6JRpTz5jL7RXU31Nx/H9Ma+Sa5d20bu7WLTEzrY7/AOp/lMek5cWSLRPeJj07Lx/cz+Bscz1h1j458tp1y6XTOG/THTWbJji9K8xt6025efr4tXz49De07Y7Vitsd580W79u0OhEFsYgPq6PR7bku51fHtDr8vbbrdZ+Lq9VrMGxdyc3P2GdfhjYmJi49mM7t6/kX7kLVq1bhKc5yjGMa1rSj24MGXZzYtfBjvlz5slMWLFjrNr5Ml7RWlKVjvNrWtMRERHeZntDgcpyfH8Lx29y/Lbmvx/GcZqZ97f3tvLTBrampq4rZtjYz5sk1x4sWHFS18mS9orStZtaYiJlPP9k37LPg/aX010PUrqbxvVb/AK/8oxbe2ytln41MifDMHMx7f0bSYFq5KePDKtQ9eTeyqwnkWr2VK3Gdq5Yp6Z1eFPhfpdKcbg5Lk9fFn5/arGa2TJXzTpUvWPLgxxMzWLxHe1rdptE2mImJj01TPb99uzqj2gOtOV6K6I5nf4jwk4LPfj8OlqZpw16l2tbNf4/J7eSkUzWwZLeXDjwRauLJjwRea3plnzbtPq+pmlWSAAAAxj7qO0vo53d9NNz056scX1+1hl4OTb0m9rZjHccc2U7cq4ey1ubClLsZ4eT8PJjYufFxrk7fi7YuRlOMutdU9KcP1bxubjuV1seWL0tGHP5e2bXyTH1mTHePXvS3a0VnzVmY9azEzE5v8B/aA8RvZ66243rLoDndzj76+1hvyfFxlm3HczpVvH1TpbutaZx2ps4PPhtlp8PPSt+9MtLVrMV2feb2l9QuzbrjynpHzvByI2cHLuZfF97XHuWsHkfHci5OuDscC9Lzavwj6bmJfnZnONMrFvxr6JRrbjXt1j0pyHR/N7XE79LdqWm+rn8sxj2de0z5MmOflaI9aWmszHnraPT5RuG+zd4/9Ie0d4X8F4hdK7WGcm1r01+c4qM1L7XDcxhpWNrT2scdsmG1u9NjDXJWtpwZ8U97RMXtie6qz48ti/fxb9nJxr13HyMe5C9Yv2ZytXrN23Kk7d21chWM7dyEqUlCca0lGVKVpWlaP2trUtFqzNbVmLVtWZiazE94mJj1iYn1iYevLixZ8WTDmx0y4ctLY8uLJWt8eTHes1vS9LRNbUtWZratomJiZiY7J7XsUvaAWe7HoTZ6Yc32MJ9YujuBi6rayv3KfSuScap4jqd9Sla0pKdukrmsuW7dPVGGt+Ncp+jrKs7fBjr2vVfBxxm7kieY4fHXFl80/XbGt8sWf7XeO84piPWIxxafm1RPeY+yTk8AfFTJ1z0xp2r4c+I23n39CMWOfgcLzc955DiZmI71pea03cd7zFZtuzipM+Tyxu5ZqVjAAAAAAAAAAAAAAAAAAAAOIdQs61rOA842V+cYWNfw/kudenOVIwhaxNLm37k5Sl4pGMYW5VlKtfFKUrWvycTkLxi0N3Jae1ceps3tM/KIphvaZn86Idi6Q1cm91Z0vpYqzfLudRcJq4q1ibWtk2OS1sVK1iPWZta8RER6zM9o9VWh1Rybeb1N6i5lmVJ2svnfLsm1OlaVpK3f5BsLsJUrT5VpKM6VpWnyrSvlWBydovyXIXj5X3tu0dvl2tsZJj/C3rehsF9bono7WyRNcmv0t09gvWY7TW+LidTHaJifWJi1ZiYn5fJwVwXaQAG5z2Qfs1M7vY6n151z/Ey8ToR0422Le5FdpCtqnLdxixsZ9ji+NfuRlT6Ne+Lh120rMZXpa+/ft2L2Ne9N+GY/CTw3ydacn9Xb9b04PjstLbE9pr9V5qeXJXVraY/E270+L29fh2tFZrPa0Vt+8O9tXV9mXob8K3SefX2fFXrPj8+Ph8c3jJPT/G57ZdTLzubFS0T8bF5NmNCuWYpXbxYr5MebH3xXnqcN4XxTp7xvVcR4VodbxvjekxLODrNRqsaGLiYuNYhSFuEYQp5nLxTzO5clO5OVaynOUq1rWdenpanH62LU0sGPW1sFK48WLFWK1rWsdojtHzn7cz3mZ9Zlqj9SdS891fzW/wBQ9S8ru81zPJ7GTa3uQ381s+xnzZbTa1ptae1a9/StKRXHSIita1iIhyhynwwAAH8XbVu/buWb1uF6zehO1dtXYRuW7tu5GsLlu5bnSsZwnGtYzhKlYyjWtK0rStaPyYiYmJiJiYmJiY7xMT6TExPpMTHpMT83lS98V6ZMd7Y8mO1b48lLTS9L0mLUvS1Zi1bVtEWrasxNZiJiYmEWD23HspNPsePbbuw7deKW9duNJZlndVuH6HErWxtdfblWmRyrCwbNKzs5GBjShe2dceP0aGBg3sm5Zty+JkIveNXhXhya+Xqvp7VjHmw1m/K6eCszGXHEz5tqmOI7xbHXtOXy/Wxjpa01j1svd92N7e3I6fMcf4A+MXP33OO5PJGr0D1FyuxEZNDctWJw8DtbWTtXJh280Wx6MZrRnvt7WPDTLePJiRCq0rStaVp4rStaVpX66Vp8q0r/AAIkthmJiY7xPeJ9YmPlMfbfgNnvshO4rK7de+DpRtb2wuY3Guc7SnT/AJHg/ErDG2X91Vq9pNHHKp5p6o4W72WHm2vnTxdsxrX5eaMmeEnUNunutuKy2yTXW3ssaGzTv2rk+qothwef9BmyUvH3YQe94b4O4PGL2YOvuPxadM/N9LaP4buG2vJ58+l+AOTHyfKTg9J7Ts8Zp7Gtk7R3nHktEevZYtRlSUaSjWkoypSUZUr5pWlaeaVpWnyrStPnStProsM+fyadMxMTMTExMTMTEx2mJj0mJifWJifSYn5P0fgAAAAAAAACH37xj2gx4/yzhXdjxDU1hruVxtcT6izxLFZUhvMS1chrN1myt09OPYu6+xrNVCdykYXMn0x9dbk6RrEX2h+kY19vS6q1MXbHtdtTkZpX5Z6RMYs+SY9K1nHXFhiZ7d7do7zMtiT3OPtDTy/T/U3gD1DyEW3OAtk6g6OrsZYrNuL2MlLb3GasXnvmy03Mu7v2rSZtTD3maxSvdFrRhXqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMxuw3tg5B3b9zfTXpJqMS7e1WZu8fa8uzqWp3MXWcY1Pr2GwuZtyNPRj2s6OLTV2rtyUY/Sc2zGlZSlGMu39C9M7HVnUvG8ThpM4r565dy/aZri1cXfJkm8x+JjJ5YxRMzH12SsfNHP2q/HHiPZ98EetPEHkdjHj39bjM2h07qzkrTPu85yHl1NOmtSfrsuTVnPO/kpStp+Bq5bTEVra0WVvDOI6LgPEuNcJ4zhWtfx/iei1PHdNh2oRhGxrdNg2Ndhwr6KRpK5THx7fxLlaeq5P1TlWsq1qsg09TBoamtpa1Ix6+pgxa+GkREeXHhx1x0j0+c+Wsd5+cz6y0rupOoOU6s6g5vqbm9m+5y/P8AK7/Mcls5LWtbLu8ltZdzZtHmmZrSc2a/kpE+Wle1axEREOSuS+IAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACSf7tVL/AMJbq/H8PSbOl/NyPi9P+/8AAkd7N8/7JOXj6fwJvP8A5zqwpc99RH/UU8Op/wDrB1o/b4XnZ/xJpKZTWqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV2XtkusmV1i7+Osd6uRLI1HBc7D4Px6dZ1nGmrwMS1spRjTzWkaU2G0zqVpSlPn5r99Xt4w8xfl+vOYmbebFo3po689+8Rix1jJMR+yZb9/l6tw33cPhxg8OfZO8OccYow8h1TrbPVHMVisVmd7b2L6VbW9O8zOno6vrMzMx2/OatGME6wEhD3fjtExOsvcNuOunMdPb2HDejOPau6a3mWvXhZ3M8yFyuFOFfl5ytDcrrtnbj5rHzchW5CUa+K5+8A+kqcz1Bm5zcwxk0+GrE4YvHel9y8TNJj/hYJ+Hljv8ATMd4mFRPvcPaF2PDfwf47ws6c5G+n1J4lZsmPkr62Ty7Or01r2pG1S0evbBy1I3NG89ontS3ktFoTh6UpSlKUpSlKUpSlKU8UpSnypSlKfKlKU+VKU+pNpq/TMzMzMzMzPeZn1mZn5zM/TMv0fgAAAADRf7eDtBxuvfatndV+N6a3kdROifxORQy7FrzlZXD7VYX+RWci5T5yxtZrLOfn2o+Y+m7cnKvqpXwwh459I157pfJyuthi3I8L32IvWPr7acTFtitp+muLFGTJEfRMytK91V7Q+bwo8eNXoHmuSvh6P8AE7ycPbXy5P8AU+DqK8WxcNlw0n0rm3t3JqamS0d/NSla9o+aBvWlaVrStPFafKtK/XSv4KoLNq75/IBlz2Qd1nK+znuI4L1k45lZEcDWbPHweX6y1WdYbniOddjjb7ClZjX03MiWrvZlMKc4XPgZM43IwlWnivbOiuqdvo/qHR5jWtaMeLLWm5jjv2zal5iuenaPnacU38kzE+W09+yPntP+AvA+0b4PdU+G/M4cU7e9o5trp3evFYtxvUOrSc/E7UZLR3phrvY9edmtbV+Lhrak2iJ7p0+n9r92E7LU6vY5HXDQ6/Iz9fh5l/AyK0jfwr2Tj2713EvUrONfiY9ycrU/MY+ZQrXxTz4Thw+LnQeTFiyW5zXx2vjpe2O3fzUtasTNJ+7WZmJ/Oas/I+7w9q/S5De08Xhfyu3i1dvY18W3h9cWzjw5r48exjmKzHkzUrGSvrPpaPV9L++49gf7vnG/8qP+tez+az0D+X+t++4f9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACCvtcewOlK1+75xv5fglHz/AP8AU/ms9Bfl/rf9P1z+h8+1nP8A/ifmf2p/yGsb2jntx+3u90H5x0s7ZOR7DmvUXnum2HE8rcV02ywNJodDu7FzWbvJhm5Fm3Yzsq/qsnMs4ccbJpKxkSs35wuW6VhLGniL429P24Le4vpnYybvI7+HJqXyzhyY8GvgzROLPbz2iK3tbFa9aeS31tpi0949Jm97GvuvPF7H4q9LdeeN3DanTXR3SnI6nP6/HRyWnt8ny3LcZlpu8XgtrYclsurr4t/DrZNmc+Dy5sNcmKl6XmLRDJu3bl67cvXZyuXbs53blyVfMp3LkqynOVfvylKtZVr9+taodTMzMzMzMzMzMz85mfWZn7sy2R6UpjpTHjrFKY61pSlY7VrSsRWtax9EViIiI+iIfw/HkA5Nwvie255zDi3CdDZlkbvl/ItLxnU2YxrOtzY73ZY2rwoemPitaSycq1Svzp8q/XT63J0tTLvberpYKzbNt7GHWxViO/fJnyVxUjt+ivD4nUvP8f0r07zvU3LZa4eM6e4fk+b5DLa0VimlxWlm3tm3efSJjDgvMfP1+iVmX2Xdu3G+1ztv6YdI+P63HwL+k43hZHIbtuzS3kZ3ItlGWx21/Mn+ru3rOXl3cSEp1rWNjHtW/NaQosn6N6e1umOnOM4nXxVx2w62O2xMR2tfYyR8TLa8/OZi95pEz3mK1iO/aIaTHtKeMXNeOnjN1x4g8vu5tvFyfNbWHh8d8k3w6nDaU10+Pxa1fxOPHk19fHsXrWIi2XLe8x3tLKd2hgkAAAAB8/barXb3V7HS7fDsbDVbfBy9bssHJh68fMwM6xcxcvFvQ+XqtX8e7ctXKeaVrGVfFaV+b15cWPPiyYc1K5MWbHfFlx2jvW+PJWa3paPpi1ZmJ+5Ll6G/ucXvafJ8fsZdTf4/a193S2sNvLl19rVy0z6+fHb6L4suOmSs9pjzVjvEq4H2n3azldpvd51J4JYxJY/Et7srnL+D3/h1tWcnRbykMy9DGjWlKfA1+1vZ+st+PPiOHSla1r8611+JnS9+lOreS0a08upnyTt6M9u0WwZu17RWP7HHlnJij9A3MPYd8dsHj/7PPRfVWXYrl6g4rSp071Ri88XyYOU4vza+K2e3ee+Xc0Meru3me3edjv2jv2a9WP0vXKeDb+fFOa8P5TblKFzjXKeP7+3OHn1QnpttibGEo+Pn6oyxqVp4+fmlPHzcrSzzq7uptRPadba188THzicOWmSJ/wDFfC6o4mvP9M9RcFesXpzXBcvxN627TW1eR4/Y07Vt39O0xmmJ7+naVpV0f3n903SbphyP4nxa77p7wvcTuer1VnPZcc1uZOsq/fl670vV5+fq8+fms94jP9U8Vxmx37/H4/TzTPfv3nJrY7z6/b7z6/daKviJxf4Cdf8AXHDRT4ccT1f1Lxtadu0Vrpczu61YiP7Hy448vb07dpj0divounAAAAAAAAAMbO7rt8493QdvPU3ozyDDtZUeVcazoaaV30Rri8kwbddhxzKpdlTzbhZ3eLgXL9YyhWdmM4VlSkq1db6t4DX6n6f5PhtikW+qta/wZnt9bs44+Jr2iZ+URmpjm3bt3iJjv2lmj2e/F3l/A3xg6H8SeI2MmC3A81q25KuObT9UcLtX+o+ZwTSvpe2TjM+1XFExby5ZraKzMdlZj1K4DvulvP8AmHTvk2Lew95w3kW249sLV61OxKV7V5t7EpkQt3KUl8DKhajk48/nG5Yu27kJShKkq1scjoZ+M39vj9ms0z6exl18kTE172xXtTzRE/1tu3mrPymsxMTMN2novqziuuuk+nesOEz49ji+pOH4/mNPJiyVy1rj3tbHsfBtekzX4uC15w5q+lqZcd6WitomI4Q4Ts4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACb57v52Y3ujHQra9w/NdNXD5z1lhW1x+Obj1tZus4Lj5kJ41IwuxpONrd3dfg7jGvxjGtzFvw9EpW5+azW8A+jrcNweXqHdwzTe5iO2vF6zF8WjW/evaJ9e2ecePNW3aO9LR27xPdrD+9u9pPH4k+Keh4P8ATPJRsdLeG9oycvOtmjJrb3VWbWtXNM2xzNZycZj29rjs2K1reTPit5orevaJDiQSn8AAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEkn3auX/AITvV2P/AOSDYy/m5NxOn9KRns4T/sm5eP8AsPkn9ra1P+VTD76eP+od4ez9rxE04/XnhOe/xJp6ZjWlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfzOcbcJXJ1pGEI1lKVfqpGNPNa1/epSnkme0TM/KPWXlWtr2rWsTNrTFaxHzmZntEftqsruD5Fm8s659XOQbGdbmZsOoXK63Z1rWtZUxtxl4dqvmta1r+k49un1/eVfdQbF9vnOW2Mk975OQ2+8/oc16R/4tYb2PhFw+twHhb4fcRp1imvqdIcBGOsR2iJzcdr7OT0jt/wBczXl08+QyKAsBPYT9KMTpz2BdPuQWsaNrK6p7Lbc7yr1YRpdu1uXoaCNKzpSk626U0NKxjKtaUlWVafX5T38DuKpx3QXH54rEW5TJl3rz27TMzMa8d57d+3bBHb9v6WpN70/r7Y6y9rTq7iL57ZMHQejx3SuDHF7Tjx+THbl7TFe81i8zysxa1YjvERE/JuUZhVwAAAAAAOLc54rgc64Zyvhe0hC5reV8e3HHs6FyFLluWJuMC/gZEZwlStJRravzpWNaVpWlfHhxd7Vpvae1pZYice3r5te8THePJmx2x27x9PpaX3el+e2+lupOB6l0bWpu8BzHHcxqWpaa2rscdt4tvDNbR2msxfFXtMesfNVudZ+K3+D9W+pXEciz9HuaDm/JddGzSnppCxZ2uVXFpSP3qVxpWa0p96laKw+Z1baPLclqWr5Z193ZxxH2qxlt5P8AxZhvS+G3PYuqPD/ovqDDk+LTlumOF3LZO/ebZcmhg+PMz9MxnjJEz9Mx3dZvmu7AAAAAAAAAAAAAAAAAAAAAAAAAANsPsU+k+F1Z9oH0hwNtiwydPxmHIuX5VZxjONnN47x/Z7jS3PTKkqeqO1wMasJePMZUpKlaVp5ZV8GOKpyvX3EY8tYth1o2Nu/eImIvr6+XNgntPf8A67jr8vWO3dAX3l/X+z0B7I/iHt8fntg5Hm7cN07g8lprOTW5nl9LjuTp5omJ7TobWeLR37WiZie8T2mw3WBtQEAAAAAABE/95n6Y40cDt46w2saNMy7l7bp7k5ELdKS+jY9ra8ht0uyjHzWlb2ZSNJTr48+mNPvURW9pTjKxj6e5eKx55vm4+1oiPxNYy7Ed/Tv+Kv8AbX6e5L64z22/GDw6yZ5+p8evx/WGDDa8zHxs2TR4e846zPaO2PX7zFY+XeZ+lEnRQbAgC0C7Ns29sO1foDk36Vjdl0s4darSv10jj6bFsQ/k9FuPj97wsz6OvOTpbgbW+f4F6cfrVw0rH+Du0cvaP1sep48eLWDFMTSvXnUd4mPl3y8lny2/X897d/u92SzsrCgAAAAAAAAACFn7w92f2+nHWHjPc5xLV1s8b6r27On5lLGs/pONzLWYc7Fi/KNqNIY+Pk6bXYfqncp4vZt2VfiVnP0oae0F0jHHcvrdTamLtrcrFcO55a+ldzFSa1tPb0rW2HHT1mPrrzPr3lsr+5+9oi/Wfh1zfgh1Bvxl5noG+TkenK5sn9MzdNb2xXLlxROSZtmy4OS3Nny1pP1mtjr9ZFaeZGzRyXQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3/Z59qu+7ve6Pp10v1+Jfu8esbbH5FzjPt2pXMfV8X0865mRPMrSlY2rGxyrONp6TnWNPjbC3SNfVWNHdfD/pbP1b1Px3GY6WnXrlrsb2SI71xauGfPabz8orktWuGJnt9dkj6UYfa+8eeK9nnwL6y653NjHTl8vH5uH6X1LZIpm3ud5Gsa2GutEzE3y6eHLm5Ga1iZ+HqXmY8sTKyc4vxvT8O43oeJ8ew7Wv0fGtPrNDqMKzGkbeLrdThWMDCsRpSlPPwsbHtQrKvmUqx8yrWta1WOauth09bBqa9Ix4NbDjwYaVjtFceKlcdK/rVrEfdaXXOczyPUfM8tz/L7F9vlOa5Ld5XkdnJMzfPu8hs5dvayzM/Lz5st7do9I79oiIh9173ygAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASQ/drJeO6Xq3H8PRvZ18fwco4l8/5P6Ui/Zwn/ZPy0fb4fL+9taimX308f9Qnw+t/9ZGjH7fBdQT/AIv+nZNVTNa0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0tlYlk6/Nx4VrSd/Fv2oVj9dJTtyjGtPr+fmtPvPDLWb471j52raI/PmPRydPLXBt62a8RNcWfFktE+sTWl4tMT+fEKrLqtCtvqj1Jt1rWtYc+5jCta/XWseRbGNa1/f80+arnlY7cnyUT8439yP2tjI3w+grRfoXou8ekW6T6ctEfai3D6cx/hcBcB2wBZH+ykuYV32ePaxc1//icunuT8H50r9XKeQxufOny/wtJ/wfV95Yx4WTSfD7pecf4j8D7eX9ba2In9/u0xPb3ps4/bA8d6bf8A8Yr1fh+J6THz4LiJp6T6/wC1zX8/5thLICIQAAAAAACsR74ZY0+7fr9LElSWPXqJt/hyj48V8RsUn48fL5XKSp/DRWf1tNZ6s56aetfwRzdv/F7/AL/dvAezBXNX2ffCauxE1zR0dx3nifn88s1+f26eWf12Krq7PAAAAAAAAAAAAAAAAAAAAAAAAAADfH7vJexLffZZtX60pk3+CcojhU80p5nb0W5nfp4rStZfpNJV/Q1pWn1180Z09n6aR1xEW/FW0dmKfrYc02/ehVT73/FsX9lfJkxR3wYuquCnZntM9q35bja4vWJ7R/TZr84/an5ztU5Gq6AAAAAAAjfe8qXsSHbB0XtX/T9JvdVthTD8ypSXrhoKTvemNa+ZfpFJ0rSlK+KfP6qVR09pCaR0zw0W7ea3K5Ip+fGCJt2+39bE/wCFc17lfHsW8cfEq+LzfBx9Bak7PaszHltys1x+aY9K9ss1+fpM+nz7IVCGTZeeWxZuZN+zj2Y1nev3bdm1Cn1zuXZ0hCNP35SlSlP4X7Ws2tWtY72tMViPtzM9oj9eZeGXJTDiyZslorjxY75Mlp+VaUrNrWn7kViZ/WWj3bBp66Dty6F6qtPEsbpNwCtynj01jdv8X1mRdjWlfqrG5dlGv4a08/fWd9MYfqfp3g8X014rQmfn87auK0/P7s9mi7448j+C3jJ4p78fic/iB1bFZ794mmLnd7DS0T9q1MdZj7ku9X3GLAAAAAAAAAAGHPfp2zabuy7X+qHSTYYkL+1z9BlbXil+luEsnG5PpKR2+nt405xl8KufnYOPgX5UpT1Y+Rcj5p5806f1301h6r6Y5PiclItlya98urbt9dXZwx8XDFZ7T2+JkpXHb/g2lIz2UvG3kfAHxy6G8QdTYti0NTlsGhz+Lz2jDm4PlPNx3I3zVrMeeNTV2s23iie/bLhpbtPbtNabyzjO34XyjkXEN9jTw91xjd7TQbXGuRrGVnYajNv4GXDxL5+KX7E/TX50lHxWla0rSqt/b1sultbGpnrNM2rny6+Wsx2muTDe2O8f/wB1Z7fbj1bqvAc3x/UvB8P1DxOeuzxnOcZo8toZ6Wi1cupyGti2te3ePpnFlr5o9Jie8TETEw4+4764AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc97AzsyvdCO3fL648z030PqD1tpHM130yxWGdquDW78Z6uxarKMa/Rd7bxNdvbc/TWVYXrfpn6K+Kze8B+jZ4Lp6/N7uHychzX1+Pz17XxaMWicVY79vrc8UxZ4nt/XR2ns1bvexe0lj8VfGHX8Lum+R+qOkfDGba259T5Ytrb/VN8U138uSKzMfH4u+xucVevftFsdu9fNHeN/TPSpgAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEj33a2X/hWdWYf/kW20v5uVcPp/D99In2cZ/2VcrH/YbLP/nWp3/xKaffTR/1BPD+3/1maEf+gOop/wASa2me1nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYj3w8DyOmXdv194RlY1cS/pOoe19ePKPorb/ADShj7ePmNaU8euOfGf7/q8+a+fKtDrbQtxnVnPaNq+S2DkMvesx27fEiuWPT7sZO/6/dvAezB1Xi639n7wm6nwZo2MXJ9H8f5c0W80X+orZeOt6957+W2pNPn6eXtPyYqurM8AJ8HsDusuB1K7E+OcOhk2/zR6Q8h23Cb2HW7SuRHErHF31nK+DWXrjj3bu8u2oXKRpblctXI0lWUZUpO7wH5jHyXQ2tpxaPicTsZdK1O/10V+tzxfy/OKzOeaxPymaz6+ktT/3sPhvtdFe1PzHUVsN/qPxD4fQ6nxbEUn4U54tn4nLgnJEeWc1KcXjvakz560vSZiItEzu4ZqVjgAAAAAOC9Tuca7pn065z1C29y1a1vCeKb/lOdO9Olu3TG0WsytlepKda0pSlbeNKn10r+CvlweT3sfG8dvchlmIx6Wpn2rzae0eXBitkt3nvH0Vl2nojpfc626x6X6Q4+mTJu9Tc/xPBatcdZvf43K72DSxzWsRPeYvmiftfbVb/VXk9zmvUzn/AC25erkV5FzHkW3t3q19XrsZu1yr2N4l9+MceVqMa/8ARpRWJymzO7yW/tzbzfVG5sZot9ut8t7V/W8sxEfcb0nQnB06Z6K6S6fpj+DHDdO8Px18fbt5curoYMWfvH0TOauS0x9EzLgLgO1gAAAAAAAAAAAAAAAAAAAAAAAAANknslOtWH0I78uhvLtleja1u23WXwXJpcn6LNbvPdfk8Qwrl2vmNPFjL3Nq7Gsq0jGUaSl8qVZG8KOapwXXXB7eSe2PNmvo27z2r338dtSk2/Q2zRMT9ExHeeyGHvAvDPY8VfZS8UuntLHN93j+M1+qsE0r5ssU6T28PUOzXHHrMzl1+NyY5iImZi3aPVY5QnG5GM4SjOE4xnCca0lGUZUpWMoyp5pWMqVpWlaVrStK+aLEomJjvE94n1iY+Ux9tpr2ralrUtE1tWZratomLVtWe0xMT6xMTExMT6xPo/ofgAAAAACIR7y71j1+y5X0I6HYWXbyMnQ67O5/tLVm5SdMPKz7u20drGyaRrWlrIli27GRG3c9Nytm7buen0SjWsSfaR5jHk2uC4Sl4tbBjyb+WsT38lsk5cEVt9EWmsVt2n17TE/KYbDXuUfDnc0uA8VfFDZ174cPK7mr0lo5MlZrOzg1MfH8pfNgmYib4a575cNr171jJS1JnzVtERXkXV7zsrozoLvKur/SrjNi1K/d5D1H4PpLdqMayrclteTavBpDxSlfPqrf8fyvpcPgna5fi9asTadjkdLBERHeZnLs4qdu3/2nS/EjlcfBeHnXnN5ckYsfEdG9T8nfJMxWKV0OE3tqbd5+XaMXePurSTguonx/hHDtDch8O5pOK8e1E7fjx6J63UYeFKHj73plZrHx+8s80cM6+lp4JjtOHV18Mx9qceGlO363laLPVPIV5bqfqPlaW89OT57l+Qrf+yru8hsbNbf/AGoyxP67lTlPggAAAAAAAAAAINPt/OzyHRDuLweu3FNZ9F4N1vhC/nxxrNLeBrOaYOJXHzcG36Y0/Tdhi62e5v1lOVZXsydaVpStI0hF499IRwnUWPndXF5NHm4ib+WvbHi3cdPLfHHaPxWSmOc1u8zMzeZ+5G0Z7pb2i7+J/g5t+FfP7vx+qfC+98WpObJ59ve6Z2tiM2tt372/2vT2N2vG4orWsVxa9ImJmJmY/rAi2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnv7NrtN3feB3U9PunmLh3rvFdPssflfPs+Fr4tjXca012mTWmXSsZRpY2ewt4WnlWtY187CnprSXirvfhz0pm6u6p4/j60mdTDlrtchkiO9cethnzfXek/W5ckY8M//AMxFH2z/AB+4z2d/Afq/rDPs46c9yOlm4DpLUtfyZdzm+SpOCPqee8TOXR077PJV7RMf6knvEx3hZF6DR6rjGj0/HNHh2ddptDq8DTanAx4+mzh67WYtrCwsa1H51pCxjWLVqPmta+I081rX5rF9fBi1cGHWwUrjw4MWPDipWO1aY8VIpSsR9qtaxEfchpi8tym/znKcjzPKbOTc5Llt7b5Lf2ss+bJs7m9nybOznvP02y5st727do729IiH1nufPAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABI392ul/4WfVWP4eiW5l/NyzhtP6f86RHs4/1V8p+kub+Naam330sf8Awf8AoK3/ANZ3HR/+H+o5TYU0GsyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgue8I9v9/pp3e4nVbAw5x0PWTjeHt8vPparC1c5Xg387A2GJ8TxSM7tnVYWquy+da0jej5Qf8f8AgLcb1dXlcdJjBzOvTNfJ2mKzt47Xx5Kd/lNoxUxWnt9FobSvuiPFvF1r7PGx0FtbFZ5Xw45rZ47X1ZvFslOA28WrtamxNe8zWmTf2d/HX6Jtjt2aCmB1sYDeL7C3vOxO2vucj035ntKYfTvrdXA4zeu5Fz0Ymq5VK9csaHL9Va0hYjnZ+Vh4ubkXf0q3jWaSnK3GNZs2eB/WVOm+po47cy+Tj+b+Hq2m09qYtqZmuC/f5Vi97UrktPeIrXvPbt3Vfe9L9m3Y8afBC3WfTej9U9Y+GEbfOY6YaebY3+Brjpl5bX7RE2yzq6mDZz62Gn1982Wa1i8zFU9C3ct3rdu7anC5auwjct3LcqThctzjSUJwlGtYyhONaSjKla0rStK0rWlU64mJiJiYmJiJiY+UxPrEx9yYapV6Xx3vjyVtTJS1qXpeJrel6zNbVtWYia2raJi0TETExMTHd/b9eIAAAACPJ7f7vTwOkHQXH7cOIbq3DqL1fhC5vbGLep9M0/BbeVW1lTvwjKtKWN/TH2mplG5GkqRhKUa080qj7499Z4+I4KvTmpmiOR5eInPWsx58WjF/LebRE+ldjy5cU94ifSey3/3Sns1bXiH4r5vGbqLjL36O8O7XpxWXPjn6m5Hqq+D4mCmK0xEzl4icujyFbVnt3tWJ7/JCCQpbPID6+g0O35Ru9Txzj+vyttvN7scPU6jWYVm5kZefsdhkW8XDxMaxajO5dv5GRdt2rVuEZSnOcYxpWtaUe3BgzbWfFra+O2XPnyUxYcVIm18mTJaK0pWsd5m1rTERER3mZfP5bleO4PjOQ5nltzBx/F8Vp7PIchvbWSmHX1NPUw3z7Oxny5JrTHiw4cd8l72tFa1rMzMRDeTwT3ezvd5bxnV8g3NzhHD8naYtnMhpdju9bm5uPYyLcLtmmVXH2luli/WE6fFxrtuF6zOlYXI0lStGbtHwA6229bFsZZ0tS2WsXjDkz4r3rW0RMeby5Y8tu0+tZiLVnvEx3Vd9Ve959mLp/m97iONr1P1Fh0c+XWvyenxm7raubLhvbHk+BGbRvOXF5qz8PNS1seWva1JmJhzH87kd437benn/AG7F/thy/wCd36x/trj/APwlP8865/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o5p87qu2fmvaT1j5F0U5/ma3P5NxqmJXNyNVONzCnTMxLGZb+FOF7IjXxbyIxl4uV/RUqxH1T03u9J8xscNv3x32dbyee2KYmn19K3jtMWtE+lo+n5rE/Afxs6Z9oHw44bxM6S193V4Xmp2I1sO/S1Nms62xl1r+etseKY73w2mO9I9JiWOLrrMgAAAAAAAAAAD6Go2ufotrrN3qsm5h7TT7DC2uty7VfTdxc/X5NrLw8m1WtK+LljIs27sK+K+JRpXxV7MWXJgy4s+K00y4clMuO8fOmTHaL0tH3a2iJj7sOJyGhqcpob3Gb+Gmzo8jp7Ohu6+SO+PPqbmG+vsYbxExM0y4cl6WjvHetp9Vjl7MTvI4z3j9sHDOUYmdY/u44frcLiHULT/FpXKwd5qca1Ys5M4SrW5O3stb+Z+wlfjStr4+XO1Ssaw9EbEfDPrDW6w6Z09ml6/Vunjpp8hi797Uz4axWLTE+sxkx/DyTPy815j6O0aa/twezjzfs5eOXUvBbGrl/Cv1FubPUXSHI+Ttg2uL5DNfLkw0tWIpS2lu/VenXFMxk+Fr1vMTFvNOxZkNDoAAAABwbqZ1E4v0m4Dy3qPzPZY2q41w7Q7Pf7TKyb1uxGuPrMO9l1xrMrlaUuZeXWz9Hw7EaSuZGTctWbUJ3JxjXg8lyGrxOht8ju5K4tbTwZc+W9piv1uOlr+Wvf53v28tKx62tMViJmYh2nono7nfEDqzp/ozprSzb/ADXUfK6PE6GDBivlmM29s49eM2StImaa+v8AE+NsZbdqYcNL5Mlq0ra0Vpnev3Jbvuv7k+p3WfbXrlcTke+vWuPYkqzpawePay1Z1ept2bc61la+kYeFZy78Pl/vi/dr6Y+fTSt7rPqPP1V1HyfMZbTNNjPMa9J+VNfHFcWKKxPy81KVvaPpta0+nfs3VfZn8F+M8AvBbojw14/HSNjhuJx35jYiKzfa5jdyZN7kL5L19MnwtnZya+K0f9ZxY47z27zim6sz025exR7eL/Xvvk4DkZeBLM4r0vt5PPeSXqW/XDCu63Fy7vGr061pWkPXyPH19uNa0r+ir4pWlfFWWfBjp63Pdb6Fr45vq8XFt/Znt3ik463nWmfojvsVxx+ur595j4wY/Cf2XercWvtxr891zbB0nw2KbeW2zj3c+CnN469pibeXhsu3eYiflE94mFhMn+1DQAAAAAAAAAAAGv8A9pj2pa3u67Teo3T/AOiQucs02qyeW8HzI2qXczF32gjHafRcKlaS8Xt1jYVzTV/QyrWGbKkaUlWladB8SelcfVvSnI8f5Inbw4rbeleI81659ePi+SkfbzVpOH5TPa8xHaZ7pbexN497vs9eP/RvV31RanAclv4en+qNa1/JrZ+K5abaPx9qe8f0rjM21Tko9Y7W1ome9e8TW87nUbDQbfa6LbY1zD2ul2WdqdliXaVjdxc/XZV3DzMe5GtKVjOzkWbludK0pWko1pVXTmxZNfNlwZazTLhyXxZaT865Mdppes/drasxP5zc143kNTluO0OV4/NXY0OT0tXkNLYpMTTPqbuDHs62akxMxNcuHJS9ZiZiYtExL5r1uaAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/aUrWtKUpWta1pSlKfXWtflSlP361CZiImZntEeszPyiPtync+wd7Mbvbz22T6vcx1H0TqN1vja3NuuVZ9ObquFVnG5pMSzOsYy+ibrEsaze1pL1V9d2PplSP6FOXwL6Nnp7pyeX3MXk5Hm4jNHmj6/Fpd++CkT2j6zNSuLP+fMfnNVv3q/tJ4/F/xpr4edOch9UdG+F85ONv8DJ5tbf6mik05TYyV7zH1Rxuxl3uL7x5Y8tJ7xM/XN7zOaqsAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEjL3a+X/AIXfVSP4ehm7l/Ny/hVP6apDezj/AFW8pH/YPP8Av7en/wAinH30kf8Aweug7f8A1pcZH7fTvU0/4k2ZNJrKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANPPtse0zI7m+z3kG245r45fPOjlczn2grC38TIu6rBsWsvlGFYtw8XcjJy9Vra2cSxCs5VvzpSFucpeK4h8aOlLdS9IbGXWxxff4fz7+D072tipFbbNIiPrrWvix9qRHf675RPdYr7svx/w+CPtF8Rx/M7dtfpTxHjW6T5aJv5MNN/ay5NfgtrLe3fHhw6+/uRk2Mt4rWMVZm961r3V+N21dsXbti9bnavWbk7V21cjWFy3dtyrC5bnCVKSjOEqVjKMqUrGtK0rSlaIDTE1ma2iYmJmJifSYmJ7TEx9ExPpLbgx5KZaUy471yY8lK5Md6TFq3peItS9bR3i1bVmJrMekxMTDxvx5vPjZOThZFjLw797Fysa7bv42Tj3J2b9i9alSdu9Zu26xnbuW50pKE4SpKMqUlGtK0pV+1talq3paa2rMWraszFq2ie8TEx6xMT6xMesS9WfBh2cOXX2MWPPgz474s2HNSuTFlxZKzW+PJjvE1vS9Zmtq2iYtEzEx2TWvY4+1u471p4rx/tu7geR4Wn6t8exrOq4fyjb5FvBxOda21CkcPBycrInDEpyKzKk8SzbhOzXPt0wrNnFllSncvTO8H/FjX5nV1+nOf2KYeW16xi09rLaKU3sUR2pS1rdqfVEfiYiJr548la0m0zM6z/vG/d98x4ac9y/jP4R8Ntcl4fcvmvv9R8Fx+G2zsdK7uS8zs7WHBhrbYnh8kTXYy5L1yRq3nZy5c9cEVpjkbRlSUaSjWkoypSUZUr5pWlaeaVpWnyrStPnStProkT8/kptmJiZiYmJiZiYmO0xMekxMT6xMT84fo/AAAGCXfh37dI+xjpZseX802mFsOa52FkQ4RwOxlQnuN9tZwlawZ3cGzKWZa1McusKZebW3bsws28ivx7dbU5R6N1z13xPRHF5Nvcy0ybt6WjS0YtE5s+WYmKTNKz564vP281+0ViIt9dHaZSo9lX2UPEH2pOu9Pp3prS2tPprV2cNup+q8uC1eO4nQrauTZrTayVjWychbXi06+r57ZbZL4u2K8XrFq8TuL6/8/7murvLusHUfa5Gz5BynZXcmNu7clKxq8ClfRhazBt1lKNjFxbMY0pbt+Iyu1uXa+Z3JVrX31Dz2/1Ly23y/I5bZdjayTaIme9cWP5UxUj5VpWv0R6d+8/OZluA+DnhL0l4JeHvT3h10ZoYdHiOC0seCb0pEZd7bmPNs721eIi2XPnyzaZvf66McUxx2rSsR0e+IyeAlk+wl9mLkQv6vvH64aD02PTcudIeL7XH9M7koxlZry7Nx70aXYUtZNblNVblSzOGTgQypVu2bsIpV+BvhnaLYusObwfW9pniNXLXtM+k1+q71mO/paZ+FH1va2PzfXVmFA3vUfbfw2xb3s4+F/LebN5qV8ROd0M3mrSJmuSOntbNjnyWm+GKzv3rOSt8O1bBHw8lJsln0pSlKUpSlKUp4pSnypSlPqpSn3qUStUATMzMzM95n1mZ+cz9uQAAAAAAAAAAFfN7cuv/ANId1d+X1Q0FP4f+AdZXzT+fx/DRAPxu+yBy37B/AYm3P7rn8iB4e/o+W/W/123v/wB7UAxGsRAAAAAAAAAAAAZ9+zz77+fdiXWvXc50N29s+Dbq9j63qHxC5O5XD3WkuypZv5Vq3Cca29prrU65mDft/OWRjY9u/byLFJWJ988Puud/obmse9gmcujmmuLkNSZmaZsEz2teIiY7ZccT56Wj52rWLRaseWYm+197KvSftUeGe50ty1Mej1TxmPLu9H9RUrSNnjeTx1nJiwZL2rMX0Ny9Y19rFeO1cObNfFbDlmMtbCHty7lekndN010nU/pFynXch0u1xbdzMw7GVZntdBn+PGTqt3gUlTK1+Zj3KVpS3l2bEr9iVnKtQrYyLUpT+6d6k4nqjjcHJ8TtY9jDlrE3pW8TlwZP67Fmp+Kx3rP0XrWbV8t4jy2iZ1EfGTwV8QfAnrXk+h/EPgdzh+T0M96a2zlwZK6HLasT3w7/ABm3MTg3NbLTt3vr5MtcWWMmC9vi4r1jvx95icAAB8bkPItFxPS7LkXJdtr9FotRiXs7Z7ba5djBwMLFx7crt6/k5WTctWLNuEIyrWVycafL63p2NjBqYcmxs5seDBhpN8uXLeuPHSlY7za17TFYiI+mZfS4jh+U5/ktLh+F4/c5TlOQ2MerpaGhr5drb2tjLeKY8WHBgpfLkva1oiK0rMzM/JCT9sr7WCPc/t7/AG/dB9rmYvRnjefW3yjf487tifP9zg5PxKfBl+l1px7Ev27H0eMI1rm38WWTTJu4WRC1WFnjD4q/hmzW4Dgst6cPrZO21sVmazv5qW7/AFvymMFLRXy9o+vtWbea1LRDZu93B7AtvA3j8Xi54q6Gvn8Sea1IvwXEZq48tekeN2sEU/ptfr4nl9jFfL8WbWiNbFnjDOHHsYpvEexgBbw8+NjZGbk4+Hh2L2Vl5d+1jYuNj253r+RkX7kbVixZtW6SndvXrs427duEaznOUYxpWtaUeVa2vatKVm172ita1iZta1p7VrWI9ZmZmIiI9Zme0PVnz4dbDm2djLjwa+viyZ8+fNeuPFhw4qTky5cuS8xTHjx0ra972mK1rE2tMREyn3exU7ErnaR27W+a8zwIWerHWWzi8i3kb0IfTNDx+9bsV0/H6ThSni1dx8bF3F61P1XrOXm3rVyUawrbhPHwY6GnpPp6N3dxxXleYrXYzxaPr9fXmK/B1+/aPrbVrTNMT61ve0T2mJiNTX3l/tUU9oLxiv0z01tWydAeG2TPw3F2x2t9T8ty+O+WOR5eaWmf6ZjzZ8/HY8le2PJr62PJSLRaLzujZlVrAAAAAAAAAAAAPytKSpWMqUrGtK0rStKVpWlaeK0rSvyrStPlWlflWh8/m/YmYmJiZiYmJiYntMTHrExMesTE/KUCL26HZ7Ttw7qszqFxrW1xOnvW63XlGtpj2q0wtbyH0Vx93rpXaU9FMvOzsLP3MrUpeulvKrOkfh+mqCPjh0j+F3qm/Ia2PycfzUfVWPyx9Zj2O01z4+/y8970vm7TPftbv8m197rb2iv5svgNrdIc1uxsdX+GFo4LdnNkidnd4fzRm4zcjHM+adfV1dnV42Mla+Tz4PLNpv3hpFYVWcgAAAAAAAAAAAAAAAAAAAAAAAAAAAANh/sw+0Xb94PdbwThUcS9c4ZxfPx+ZdQM6Nuk7OFx/TXo37Nu/wCqMo1tbPbU12quR8er0Z1axrGtKSpkHwz6TzdXdVaOlFLTp6uSu5v3iO8U18NomInvExMZM3w8Ux9q/fvCH/twe0Jx/s6+AnVXU87GOnUnOaubpvpHVtfyZNnmOSxWx5L4e1q2jJpcfO5v0t37efViJifxM2PGn1Ou0Gp1mj0+JZwNTptfharWYOPH0WMPX6/Gt4mHi2Y+a+m1j41m3at081rSEKU81WJ4cWPBixYMNIx4sOOmLFjrHatMeOsUpWI+1WsREfchpp8hyG5y2/vcpyOxk2+Q5Lb2d/e2s0+bLs7m5mvsbOxlt6d8mbNkvkvPaO9rT6PovY4YAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAACRX7thLx3h9UYfh6D76v83MeEf96/yJC+zj/Vfyn6RZ/wCOaSnb30kd/Z06Ft9rxW4qPl9vpzqf07ptqabWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDKxcbOxsjDzLFrKxMqzcx8nGvwjcs37F2NYXbV23KlYzt3ISrGcZUrSUa1pWnh43pXJW1L1i9LxNbVtETW1ZjtMTE+kxMekxL24M+bVzYtnWy5MGxgyUy4c2K00yYsuO0Wpkx3rMWreloi1bRMTExExPdAA9sd7P3cdoPXzac24nqMiXRLqpn5G74xn2bU54uh3GRdnXaccyr0aVjC7C9SOfZnOsIzhsbdm3StbdUCvF/oHN0jz2Xd1MNvwF5S9s2tkiJmuDNaZ+Lr2n6Jie16zPaJjJFY9Yba3u5fa3472h/CfR6Z5/kMMeJvQmph4znNTJetc/K8dhpWNHmcGOZibY7Y/NqZK1i1q3075bzEXhptYeWOgPc1+xz9TmY+x1ebl67PxLsL+Lm4ORdxcvGvW5Unbu2MixOF21chKlJRnCcZRlSlaVpWjzx5MmK9cmK98eSkxal6Wml62ie8TW1ZiYmJ+UxPdx9vU1N/Xzae9ra+5qbGO2LPrbWHHnwZsd4mt8eXDlrbHkpaszFq2rMTEzEwkA9jvt8Ot/QbF1HA+4DX3Os3T3C+Bh4+6lcpic302HSkbUYW863WODm4eJGnxq27+tyc+95uwpkVrK36c99E+O/NcFXDoc/jnmOPp5aVzd4pu4aRER2i8dsd6V/FTFsdslu8x5vkqT9qH3T/hj4r5+R6r8JNynht1fs/F2c3GxSdjpfktmZtkta+raLbWtsbEz8Pz4t3Dq4+1LThiIv5pKPRf2v/Yd1pwdde1/WnR8Mz8yFumRruoNyPDqYF+VfErN3N5BXW41yEK1p5yIVpalTzWlflVI7hvFzoXmaY5x8zg08l+3mx8hMacY7fTW19icVZ7f2Uen2lLXiX7u/2q/DTa28e34acp1Lqa9rTh3OkKT1HO1ir6xkpq8RG7mpNoj/AGq0TePSJ9ZZfWu6rtlv24XrPcH0Yu2rkaTt3bfUvh87c41+qUJx29YyjX71aVrSrt9eqOmrRFq8/wANasx3iY5LTmJj7cT8b1hHjJ4D+NuK9seXwi8SceSkzW9L9FdRVvW0fOLVtx0TEx9MTES6j6le0Y7KelWNdyeTdxPTHKlZhKd3C4zyzR8o2UKRp6vTLX6XPy8uk60+cYVteqVK0rSnzp5+RyXiH0ZxdZts9Q8beaxM2prbeDayR2+iceHJe/f7nZkHov2OfaY68z0wcJ4O9cYK5LVrTa5vp/lOD0reae3mrucnqa+vNIn0taL9omJiZ9Gi/vE94v41ia/acS7Q+J39vtL0L+JTqPzLCz8PAxaTpKzXI1WhufmXnRzcevqvY1/LllYc5/CrKxchScZYQ6v9ofWpjy6nSOpbNltFqfgjuUyUx17+nmw68xiyRevzra/mpM9u9ZjvE2lezp7nLms+5o9Qe0P1Bi4/Rx2xZ7dGdN7OpsbeaaTXJGHf5ak72rbVzemPNi14wbFa+eK5aWmsxFm6xdcOqnX3mWz571a5puuacl2mRO/ezNrk+u3YpL5RsYeJajaxMOxbhSkI28axapWlKyn6pynKUX+Y5vlOe3Mm/wAtu5t3Zy2m03y27xX7VaUiIpSsR6RFax9ue8zMzex4deGHQfhP03pdKeH/AE1xvTXCaOKuLHraGHy3yzHrbLs7GS2TZ2ct7d7Wvmy3mJny18tYrWOqHynfQG/b2Pnsnt13Scq1fXXrbpNhqeg3GNnZytXrs2xcwr/UbZ4MreTDFxKX4Ru3OOwv/Bs5+fjw+FlRpmYeLmWsqxOtvPHhF4VZ+p9vFznNYMmHgtXLFsWPJWaTyOXHMWitYtEWnXi3aMl6x2vEXpS9b1ma1N+8T9vrjPArgd7ws8MuT1OQ8Vuc0cuDe3NXLTZxdG6W1W+C2fYnDa2PHzNsU5Mupq5rfEwWnW2c+tk18tYvOP0ul1XHNRrdDo8DF1en1GFj6/W67CtRsYuHh4tuNqxYs2oUpSMIQjSn35Sr5lOUpSlKs28OHFrYceDBjriw4aVx48dIitaUrHatYiPlER+3859WrzyXJb/Mchucrym3n3+R5DZy7e7ubOS2XPs7Oe83y5ct7d5m1rTM/RFY7VrEViIj6b2uCAAAAAAAAAAAr5vbl18+0O6u/vQ0FP4P+ANXX+nygH43fZA5b9g/gMTbo91z+Q/8Pfu25f7778NQDEaxAAAAAAAAAAAAABkx20d3nXztL5hj8x6K882vGr9L1qWy0/xI5Wi3WNCUfjYWy12TC7ZrayrVJWL17Gpj5lLUv0rJtzjCUeydN9W890puV3OF38utbvHxcPeL4M9Y+dMmO0THa0fWzavlvET6WhhPxq9nrwn9oDp3N054mdKaHN4px3rpcj5Jwcrxma1Z+Hs6W7hmmSL4Mkxlx4s/xtabx/TMN6zaJlS9rHvGPRLlWr12k7oeK7TpvyW1atY+Vyni+u2m/wCObLJ8UhC7a1OHa2ezwI3ZVj8e5lZkrVufxLv6C14pGUfS/tD8LtYseDqfVy8dsxEVvtauPLsa2S3yiYw0jLlx9/TzTa/aJ7z6R2UP+O/ucfE3gd7c5PwM57R604W975tfged3NHieZ0sMTNr0vyGxfR0tuaR5vhUwa0ZLx5Mf11+8zt54D7SXse6jYH5oafuT6VamzWEbnwuX8x0HEcvxLx4p9E32xwr9JU8/OFYeqnivmnyZb0PEbonkcfxMPUfF4qzHftt7mvqX/O8mfJS3f7cdu8K9OrPYv9qDo7a+o+R8Fuvd/J5pp5+nunOW6h1+9fnMbHE6e1imv2rRbtP23Kd7379l3Htdf2eZ3Q9C8qxjxrKdnU9T+GbbNnSlPPi1hYO5vZN2VfvRt25Vr9VKeXKz9d9G6+O2W/U3B2rWJmYxcnp5bz2+1THmte360S+DxXsoe0ry+5i0dfwM8U9fLmtFa5OQ6G6k4/WrM/Tk2dvjcWHHH25teIj6WufuA9v32W9KtZnY/TrN5B1g5dat3oY2q02sz9VqaX6xrGzeub7NwrmsyLELlYzu2rGRG5ct0rGE4ylSVMd8/wCPXRnFY8leOvscxuViYriw4smHF5u0+WZ2L45x2r39Zis95j5T694mP4S+6W9pbrzd1cvWOtxHhz09e+O2bf5Le1d/kJxRMWyY6cTrbNN3FltTvWl8uGaVvMTasxExMW7vZ9qv3Od6Wfl6zkPIZcG6aVvVrhdPOIXMjA1c7UJ+bV3aZVzIytlm5U4UhTJh9Pjg3K0r6cWMZVjWMPWnin1N1ne+LY2PqHje/wBZx+pNqYpiJ+ttlvNrZL2mI+uj4kUn1+s7T2XpezJ7Bngh7NOpr7vEcPHVPW0Y4+qesOoqYdvfre1e2THo4KYsGlrYK2m04bfUk7VImO+ebREtZNa1rWta1rWta+a1r861rX661r9+tWNU3Pl8n9W4TuzhatwlcuXJxhbhClZTnOdaRjCMaeaylKVaUjSlK1rWtKU+ZETMxERMzM9oiPWZmflER9My8bWrStr3tFaUrNrWtMRWtaxM2taZ9IiIiZmZ9IiO8pU3sXvZE7XY7fQd1fczxa7h6TBrb23S3gG6sVsX9plQp5wuUb3Bu0jl2MXHv+cvU4d6ONLIuY2Jmz+kYGRG3clH4N+EuXJmwdU9S6s0wUmMvF6Gava2W0R9ZtZ8doi1a1t9fipaK+by1vPmpaImh73lPvCdDT47lvAXwS52mxymzF9Drrq7jMsZcOjgtPba4Litqk2182xmxdtff2cVs9cNM+xrV+Dt4ZvSXbbt27VuFq1CFq1ahG3bt24xhbt24RpGEIQjSkYQhGlIxjGlIxjSlKUpSiWkRERERERERERER2iIj0iIiPSIiPlDXsve+S9smS1r3va173vabXve0za1rWtMza1pmZtaZmZmZmZ7y/t+vEAAAAAAAAAAAABq+9rf2iYvdr2i811WvwrV7nnTrDyue8JyqxjW9bydLZpl7nEt+PE709horGxwsexSVayyci3WEJTrSlcY+LPSVerOkt3FjpE7/HUtv6V+3rFsEefNWO3rab4K5KVrE+trR2iZTl9317Quf2fvaF6Z39zZyY+lOstjB0n1Pgi0xjvh5PJ9T8bsX+dMddTlcuns5ssxEVw4b+a1axMxXYZeJk4GXlYOZZuY2XhZF7Eyse9CVu7Yyce5Kzfs3bcqUlC5auwlCcJUpKMo1jWlK0rRXvelsd7Y71mt6WtS9ZiYmtqzMWrMT6xMTExMT6xLcN19jDt6+Da1stM2vs4cWxgzY7RfHlw5qVyYsuO9ZmtqZKWretqzMWrMTEzEvXeL3AAAAAAAAAAAAAAAAAAAAAAAAAAAP2MZTlGEI1lKcqRjGNK1lKUq+IxjSnzrWta0pSlPnWvyoREzPaI7zPpER85n7T8mYrE2tMRWImZmZiIiIjvMzM+kREeszPpEJ63sL+zGfbZ2w2OpXLtVTF6k9b4Y/JcqWRbpTL1vEL9Y3+PYNmdKUrTF2mut6rc3bc6zlTInT5wpT0UnZ4H9Gz030zXktvF5eS5uK7N5tH1+LUt2tr44+XauXHGLNMT3mLT9DVH96V7SdfGnxwy9FdP705+i/C+2XhcEYbzOvu9Q4u+LmNrJSZmJz6O7bf42l6xWJw1n0t38zeCzYrAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABIl92xl/4ZXU+Pn6+gXIa+P4OZ8Fp/m+aQns4/1Y8n+kOx/HdH/3qevfRx/8G/oef/rZ4iP2+muqZ/xJuaajWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdB9yvbh007qeknJuj/VPT2tnoOQYd63j5cYQpsdHs/hy+hbnU5MoTrj52BkfCybXqjcsXblm3DJsX7VK26/B6k6d43qnidniOUwxl19ikxW8REZMGXt9Zmw2mJ8uTHbtaveJrMxEWravoyx4K+MvW3gP4gcJ4idCcjfR5fiNnHfNr2tadLlNLzx9U8byGGtq/G1drD8TDk8tqZaVyWthy4sna8V63fx2EdV+xbqvncR5hr8vZcH2uRfyuCc6sY1yuo32rlcn8OxcyrdJY2Pt8Ska28zX3LkMmMKWsqti3YybNa1/9edCcr0Pyt9Tcx3yaOW1raO9Ws/B2MXee1ZtH1tcte3a2OZi3btbyxW1e+3p7J/tX9A+1L0Dq9Q9O7mvpdT6GHFg6q6Vy56xyPE70Up58tMF5rmzcfsTaL6+3SlsFrfEwRltkwZe2BjoqVgAAD6Mdxt4RpCG02MIxpSkYxzsmMY0p9VKRpdpSlKfepSnh7IzZojtGXLER8ojJaIj9bu4duO4+0za2jp2tM95tbWwzMzPzmZmneZ+7L0rt69kXJXb925euy+crl25K5clXx48ynOspV+VKU+da/KjwmZtPe0zM/bmZmf25cnHjx4qRjxY6YqV/E0x1rSlfzq1iIj9aHjfjzAASFfZE+yB3HcpuNV157hNJstL0Q1OZay9Bx7MtTwM3qJl4ko34R+HkW6ZNON1vUtWcvLsQtRy7cczGxM23kW6ytyA8JfCPN1Jmxc71Bgy4eExXi+vr3icd+QvTtaPS0eaNfzdq2vWI88RetbxaO8VC+8J94fx3grx2/4U+EPJ6XJ+KHIa2TX5bl9fJXb1ujtfPFsVrebFecM818Ob5NfXy2vOva2vnz618N4i82XjPGOP8M0Or4xxbUYGh0Glw7OBq9Vrce3i4eHi48KQt2rVq3SlKUpSnmUq+ZzlWs5ylKVa1mjrauvp4MWrq4ceDXw0rjxYsdYrSlKx2iIiP/3zPeZ9Zay3N85y/UnK73Oc9yO3yvLclsZNve393NbPs7OxltNr5MmS8zMzMz6VjtWsRFaxFYiI+8975QAAAAAAAAAAACvm9uX+yHdXfq/UaD6v/wCQav6/wV/o8VQD8bvsgct+wfwGJt0e65/If+Hv6Ll/vvvtQDEaxAAAAAAAAAAAAAAAAAAAB7ut1uw3GwwtTqcHL2e02WVYwdfrsDHu5ebnZmVdjYxsTExbELl7IyMi9OFqzZtQncu3JxhCMpSpSvnjx5M2SmLFS+TLkvWmPHSs3ve95itaUrWJm1rTMREREzMz2hxtzd0+O1Nnf5Da19LR0sGXa29zbzY9fW1dbBS2XNsbGfLamLDhxY62yZMmS1aUpWbWmIiZS9fZM+xPxeIU473E92mix9jvrtrH3PCelewhSuNppSjG7gbTk9mMvjXM+zPxmWdfcnj0s3I49vMxbsKXrdyW3hT4L11PqfqHqzBXJnmtc2lxeT8ThmY70ybVYnvOSs9rxjma+WYrW9ZjzROvN7f3vM8/UP4M+Dvs/crl0+Jpkzcb1P15p2/p3JVi0029Hg8sx8Ompkr318u5SuaclLZb62fHacdqSkMbGx8PHs4mJYs42LjWoWMfHsW4WrNizajSFu1atW6Rhbt24RpGEI0pGMaUpSlKUSdrWtK1pSsVrWIrWtYiK1rEdoiIj0iIj0iI9IUW5s2bYy5M+xlyZ8+a9subNlvbJly5L2m18mTJeZte97TNrWtMzMzMzMy8zyesAAAAAAAAAAAAAB47tq1ftXLF63C7ZvW52rtq5Gk7dy1cjWFy3OMqVjKE4VrGUa0rSUa1pWnir8mItE1tETExMTE+sTEx2mJj6YmPSXnjvfFemXHe2PJjvW+O9Jmt6XpMWreto7TW1bRE1mJiYmImPVXu+2Z7Prvar3cckztJr5Y3Tzq7K/z3idy3CsrFi/sb0vzfwrl6FPhW71d/Da37GNWlucMStuVLdYUpOsAPGLpG3S3VmzfDj8vH8tNt7UmImYrbJP8Aqik2+UW+PGW1a+kxTtPbt6tu/wB277ROPx59nzhdbk9uM3V/h7XF0n1BS9orly4tOkfgTs0x2+vvj/Am2hiy54m9bbEXibRfvWNRrE6wYAAAAAAAAAAAAAAAAAAAAAAAAAABsp9lX2fbTvB7r+FcavYd65wPhGZj836gZtIUlZx9Np78LmHjTrOMoTpn7qWrwb1nxKdcbKuypSNKeuOR/C3pHL1d1Vpa1qTOho3ru8hft9bXDitHkrPeJifiZpxUmPWfLaZ9I9Yhb7ePtFaPs7eAXU3N49nHTqvqfXy9MdI6s3mMmbkuRxWps56xWa3r9ScZG9tY8netYzYMdZme/lmxi1uuwdRrsDU6zFs4Ot1eFi67X4WPH0WMTBwrEMbExrMPn6bVixat2rcfP6GEKU+8sOx46YcePFirFMeKlceOlY7VpSlYrStY+iK1iIiPtQ04t3c2uR3NvkN7Pk2d3e2c+5ubOWfNl2NrZy3zbGfJb+uyZct75Lz9NrTL3Xm4wAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAJD/u2Uv/DR6mR/D2/cjl/NzXglP6apBezj/Vnyf6n9j+O6P/Kp+99FH/wauiJ+j+a7w0f/AIY6rn/Em8prNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0D3I9tPSbup6Y7zpZ1c43i7zR7fFv28XMrbhHa6LPnbrHG22nzPTWeNm4d74eRapKlzGu3LUI5WPfteq3X4PUfTfFdU8Zn4vltaufBlpaKX7RGXBkmPrcuG/zrek9rR371mYiLVtHeGWfBjxr8QPAfrfi+u/D3ms/F8px2fFfPrRe1tDldSt4nNx/I63eK5tbYx+fFkms0z0pkvODNiyTF4hD9+vsXe4ftNzNpzHgmuz+r3SCWTdu4e341r72w5DosWs61+DvtNgRvZvw8W3WNy9tYYWNgUtVlWtY/Au1pCnrvwa6h6Uvl3NHHk5fiJtM0za2O2TYwV7/ic+HHE37Vj1nLFK4/L3+Xlls7+yj7ynwf8f8AX0enOqtzU8PPESuHHj2OO5rbx6nD8rn8sR8TiuS27Y9bz57xamPQts5tv4kRERMZKQ0wXLdyzcuWbsJ2rtqc7d23cjWFy3chKsZwnCVKSjOEqVjKMqUrGVK0rSlaMOTExMxMTExMxMTHaYmPSYmJ9YmJ9JifksmpemSlMmO1b471rel6TFqXpaItW1bRMxatqzE1mJmJiYmJ7P4fjyAAAAeS1au37tuzZtzvXrs427Vq3GU7ly5OtIwhCEaVlKcpVpSMY0rWta0pSnl+xE2mK1iZmZ7RERMzMz8oiI9ZmftQ8cmSmKl8mS9cePHWb3ve0VpSlY72ta1piK1rETMzMxER6yk9+yY9iptOe5PHO4ruu0N/XcIjKxtuFdMNjbnibDkFbUviY+15LjT9Obh6+V6MZY2BcjhZF63ZrflO7jZNmiTHhT4MZd+2v1D1Vgtj0u9culxmSJpk2JrPeuXZrPa9MczETXHPktaImZma2hR57f3vMNHpTDzPg74B8ri3Op5rl4/qbrjTvXY0+HjJWaZtDhM9Ztq7O5GK0xm2622cOK2T4Va482DJKYNpdLqOOarA0eh1uHqNPq8W1ha7W6+xbxsPDxbEaQtWbFm1GMIQjSn3qeZSrWcqylKUqy6w4cOtix4MGOmHDirFMePHWK0pWsdoitY7REf4fnPq12uS5LkOY39vlOV3NnkOR38+TZ3N3by3z7Ozny2818uXLeZta0z9ue1YiK1iKxER9N7XBAAAAAAAAAAAAAV83ty/2Q7q78vH6DQfy/8AAOs+f9H8iAfjd9kDlv2D+AxNuj3XP5D/AMPf0XLfrf677/8A+/8AXagGI1iAAAAAAAAAAAAAAAAAADlfCOD8s6kcq0nCeD6HZcl5RyLOsa7UabU4l/NzcrJv3Iwp6bGNbu3KWrVJVu5F6sPh49iFy9dlG3CUqcrS0tvkdrBpaWDLs7Wxkrjw4cVLXve1p7elaxM9o+dp7dq1iZn0h8HqfqjgOjOB5PqfqjldLhOC4fVy7nIclyGxi1dbXw4qTafNlzXpScl5jyYccW8+XLauOkWvasTNu9lR7G7iva/r9T1q6+6/W8u627HDtZun0eVas5en6eQyLVPRS3bp8S1l76tmcq3ci7dv2cT40YW8exm49bsZp+Fvg9q9MUxczz2PFt81kpF8OC8Vvi4+LR6do9Yvn7T3m0zaKd4iK1vWZayHt6e8d57xy2+Q8NPCbb3enfDHT2L63I8rgyZNfkesLYb/AF03vPkya/FfErWMeKlMWTY+Ha1suXWzRSd/1KUjSkY0pGMaUpGNKUpSlKU8UpSlPlSlKfKlKfKlGe/l8lSszMzMzMzMzMzMz3mZn1mZmfWZmfWZn5v0fgAAAAAAAAAAAAAAADT17ans/j3R9pO/3eh18cnqH0cpe51xu5bt0rfv67At1ryLDnKlPXcs29FLaZVqzSVPOTGMo0lKtI1xD4zdIR1P0nnz4McW5Dh4tva8xH11sdI/1RSZ+c1jBOW8Vj52iPSe6xX3aPtEz4Ge0FxPGctt2w9IeI84uleape0/Cw7m3eI4fZrWfraZL8rXRwZMsxPbBa0TMR6xX3XITtTnauQlbuW5yhchOlYzhOFaxlCUa+KxlGVK0lStKVpWlaV+aAsxMTMTExMT2mJ9JiY+cTH0TDbhrat61vS1b0vWLUvWYtW1bRE1tW0d4mtomJiYntMT3h/I8gAAAAAAAAAAAAAAAAAAAAAAAAH927dy9ct2rUJ3Lt2cbdu3bjWc7lycqRhCEY0rKU5yrSMY0pWta1pSlK1q/YiZmIiJmZmIiIjvMzPpEREeszM/KHje9MdLZMlq0pStr3vaYrWlKxNrWtae0VrWImZmZiIiJmfRPz9iN2Xy7XO1rXcz5TroWOpXWu1i8v3Fy5CH0jX8czYRyON661OlPXbtZOorq8/Lx7kpShm0l6qW6xrbjPLwV6NnpjpfHubWPy8lzUV3M0zEebHr3jza2OJ+cRbD8LJes95i/eJ7THZqZe869pSPHTx13OmuC3LZeivDLJsdO8dSlrfB2+Z1rTh5ndvWZ8t74eQje1dfNSK1trdu03ifPO6JmVWsAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQ17tnXx3r9SqeflXt65L/AD/3b8CSB9nKf9mnJR9vp/Z/e3tBUF76GP8A4M3RU/a8X+E/f6Y6rTfk12sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GVi4ubYu4ubjWMvFvwlbvY2VZt5Fi9blSsZQu2bsZ27kJRrWkozjWNaVrStK0q8bVres0vWt62iYtW0RasxPpMTExMTEx84mHtwZ8+tlx59bNl18+K0XxZsGS+LLjvWe9b48mOa3paJ9YtW0TE+sS1l903sjezPunhlZ+96f2+AcxyviVuc16eVs6fbzrKn6GM8LJtZ2g9MJ+qfqjqI3ZSnL1zl8vGNeqPCbo7qiL5M+hGhuX7993j+2HNPePTvS0X1+0T6+mGJ9fmm34Fe8H9pLwItg1OK6tv1b05g8kU6Z6wjJyXH18s/XTXaw5Nblu9q9q9rchNKxWPLWvr30PdYvdq+q+s2WTldFOsvHeSaSUp1w9TyvCrhby1Gla+imTs439brLspU8UrW1i26UrSta/KtKMGcv7OHK4slr8NzOvs4fXyYtqnkzxH0ebJ5sWKZ/OrC1Xw599P0DvaeHX8TPDfmOF5OsV+qOQ4HZjZ4vJMxEW+Bozj3d6kVnvP9Mz2mY7RHqwa5r7Bv2iHEfjX8bpzxnkmut+r0Zen53xa9kXfT5rX06y3s72bTzGlK08wr58+Kea0q6Ru+BfiFqd7V47W2ccfK+He1ZtPb/wCSjLa/53olF0z71j2Puofh4s3WXN8LuX7ebX5HpXnceHH37R67ttLHrT2mZie1vSI7z6TDGjc+y577NHdrZyu3jnuRKk/h+rW6bP2VusvPjzS5h4t2FY/f9VK+nx8/LrWbwx64wTMW6f3rdpiO+LDkyx6/dpSWbON9uf2V+UxxkweMPSeGs183bd5LV0rxHbv2mmzmx2i30RXt3mfSIcn4v7I7v85Zet2Nf0E5BhTu1jSkt7ctaK3Gsvq9dzaUxoQ/f9VaePv+HK1vCbr3bmK4+B2KTP055jBEfnzl8vb7v2vpfD5z3g3smdP475dzxX4jZrjiZmOKpflbzEd/xNNGc1rfL07RPf6GcHST3dTvI5jexrnU3e8E6UYM5W53pXdrr+X5FbFa0rOkLfH9rOtu7WPmkaXIV9MvHqjXxWju3E+zz1huWrPJ59Hisc9pnvlx7l/L9MRGDLPa3b5d4mIn5oweIPvivZw6cx5q9EcV1V1/tVreuOMeht9O4PixExWbX5bRrF8cW7ebyWjvHfyz8m/Ds09iJ2sdrG11vNuR2c7rJ1EwfhZGPtOZRxL2j02wh483tJqMTD18JWq1jGVLe4psq0l5r5pTxSmd+jvBXpfpfLj3dmt+Y5Gna1cu5FLYMOSP67BhrSkdp+fbN8T1VP8AtIe878d/HfQ3emeGyanhv0dtefDm0em52MfK8lqW79sXJ8jsbO3at47zE346dLvXtHb6W5yzZs41m3j49m1YsWYRt2bNm3C1ZtW4UpGFu3bhSMIQjGlKRhGNIxpSlKUpRmOIisRWsRWsRERERERER8oiI9IiPoiFbWTLkzZL5c2S+XLkta+TLkvbJkyXtPe173tM2ta0zM2taZmZnvM93lfrwAAAAAAAAAAAAAAV83ty/wBkO6u/On6jQfyf8A6z5V/f+/8AwVogH43fZA5b9g/gMTbo91z+Q/8AD39Hy36/+u+9/wDuagGI1iAAAAAAAAAAAAAAAAAD7fGuP7PlvI+P8V0tiuTueTbvVcf1ONStKVyNnuc/H1uBYpWVaUpW7lZNq35rWlKerzWtKPdra+Xb2NfVwV82bZzYtfDX+yy5slceOv697RH675nNcvo9P8Ny3Pcnl+BxvCcZv8vyGbtM/B0eN1cu5t5e0d5n4eDDkv2iJme3aE/b2XvssOmXZbwfVc45NiYnMeuvKdViZ+75Hsca1ds8Xjm49u7TRcdsSt0piwxrUowysm7XIy7mZLKlbyYY8rVm3PTwy8LuN6M0sW7s0puc5s4q5M+zkrExq/ErE/A169vrYrHaLWnzXm83mLRXyxGph7cvt39b+0t1Rv8AS/CbGfpvws4Lf2NTjOF0816ZOdtrZr0nleYzVvM57Z71m2DBjjDgprV14vhtmrky33DsvK6QAAAAAAAAAAAAAAAAAHq5+DibPBzNbsMe3l4GwxMjBzcW9H1WcnEy7M8fJx7sf+dbvWbk7c4/fjKtPvvDJSmWl8eSsXx5KWpes+sWpeJrasx9q1ZmJ+5L36u1saO1rbupmvr7ennw7Wtnxz5cmDY18lcuHNjt9F8eSlb0n6LViVc/7V3tJzu0ju653xzGw7lnhHOc3I53wXKrb+HYyNZvLv0vY4+PSkYxpZ1m6v5+ttR+ulvEj85ePVWvPxU6Tv0n1bva9KTGlvXtvaN+3atseefPkrX0j0xZrZMcR9qjcb9gf2gdb2gvZ76V5rPsUydT9La2HpXqnBF/Plxb3F4/qfTzZpmZmcm9xuLU3clu/ab57fL5NaLGyawAAAAAAAAAAAAAAAAAAAAAAAADaN7JHs42Hd53Y8S1+dhXLvTzptkY/O+e5UoeLNcLV37dNXgwuXIytXL2TvbuqjfxqUnclhSvz9FIUrcjk7wn6PydXdV6mO9Jnj+NtXf37TH1s0xWj4WPvPpM2zzii1fWZp5p7dvVBj3gntG6ns8+APUO3q7NKdYdaYc3SnSmCLd8kbW/iv8AV+1alZjJTHg4rHv2xZu9aV2a4q+abTFbWJOHh4uvxMXAwbFrFwsHGsYeJi2Y0hZxsXGtRs49i1Cnyhas2oQt240+UYRpSnyosIpSuOlMdKxSlK1pStY7VrWsRWtYj6IiIiIj6Ihp6bOxn29jPt7WW+fZ2s2XY2M+W03y5s+e9smbLktPra+TJa172n1m1pmfm9l5PSAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQp7tvLx3tdRaf8AS7fuS0/9teCVoz/7Oc9uteQ+7wGzH7e7oKhffP17+zJ0dP8AY+LvCT/+Geq4/wAKcImy1gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfN7cv9kO6vfxNB/7g1aAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagGI1iAAAAAAAAAAAAAAAAADLXsR1+Ds+8LtzxdhZpfx6dXeB5FLdaeaVv43JdZkY8q0r5pWkL9u3KtK/Kvh2vobHTL1f07TJXzV/BfQt2n7ddnHas/rWiJR/wDap3NrR9nXxkz6eScWafDzqvDN4ntMYs/CbuHNET3jtNsV7Vifo791nFSlKUpSlKUpSlKUpSnilKU+VKUpT5UpSnypSn1LLWkRMzMzMzMzM95mfWZmfnMz9My/R+AAAAAAAAAAAAAAAAAAANGft3OzuXcR2u3OqHFtZ9K6g9DrkuQ2Potn4mdtOKSnKzutdOfplWmHrMbNzd7KlPTWk8Wtay8eaMIeOfSE9Q9MTyerj83IcJM7FfLXvfLq9+2bHM+vamOt7557ev1k+v0LR/dWe0XHg/46U6G53ejB0h4oUjh8vx8nl1dDn60jJxm5WveInZ3c+vq8VWZ7/W54iK9/VAz+r60Fm1iAAAAAAAAAAAAAAAAAAAAAAAA8tmzdyb1nHx7c71+/dt2bNm1CVy5du3Z0hbt24RpWU53JyjGEI0rKUq0pSla1pR+1rNrRWsTa1pitaxHeZmZ7RERHrMzPpER85eGTJjw48mbLemLFipfJlyZLRSmPHSs2ve97TFa0pWJta1piKxEzMxELA72LfZn/ALlPtS0m75Jr7VjqT1js4nOOSXpQh8fF1OytUyuN62lfFbtj0aS7rZ5uLcl6oZ1u5Wdu3ONYRnz4NdHfhV6VwZ9jHEcjzFab2zMxHmriyV82tj+3X+kzjm9ZnvF4nvETHaNR73lXtI/ze/HvlOM4Xbvl6L8OMmx0vwuKt7fCz7+lknBzW7MR2x5fNyePdrrZ617W1b18tr1t5rbhWXldYAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQb7t7L097nPqf9LoHySlPyz4NX/wCf8jP3s6f1a7/6Q7P8d0VRXvm47+zH0n9zxZ4Sf/w31TH+NOLTaavgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAD5W90ut5JpNvx7c4tvN1O91mfp9nh3o+q1k4GyxbuHmWJ0+XmN3HvXIV8VpXxL5VpX5vVnwY9nBm181Yvhz4smHLSfWLY8lZpes/cmszDn8Vye7wvJ8fzHG5763IcXvavI6OxjntfBt6WfHs6+Ws/2WPNjpePo7x6q2z2kPavte0fuv6ldN72NdhxvP3OVyjhWZW1W1i5fHt/KO1s2MKvikbljUXc2enrKNZVpcwpxnWs6SVy+IvS+XpPqrkuOtWY1sma21pX7dq3188xlitPomMM3nF6fTT19e7c/9jLx30PaD8A+ius8Welua1OOw8F1NrRki+fX5jiazoZMuzHmm1MnI49avIxFojvTZrMR5Zhge6MlUAAAAAAAAAAAAAAAAAAAAAAA2w+x67Ncvu27sOM3NtgTvdOOlN2xzvmt+5CsbGRHXX7UNNrbN+dPhTyp7zI1V+9i0pcuTwYZEq26W/VOOVPCLo6/VnVWtObHNuO4qa727aY+tt8O0RhxxafrZt8e2K1qeszSLT27d5iAvvFPaQ1/Z98Aubrx+1XH1n17jy9K9MYqXicuG25ivbkd3JirPxKYK8Xh38OPYny0ptWxV803mtLWGOPj2MTHsYmLZt4+Ni2bWPj2LMKW7VixZhG3Zs2oRpSMLdu3GMIQjSlIxjSlKUpRYFWtaVrSsRWtaxWtYjtFa1jtEREekRERERH0Q1Bc2bLsZsuxnyXy58+S+bNlyWm2TLly2m+TJe095te97Ta1pmZm0zM+svM8nrAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABII93Cl6e97nH/ndB+SR/n5hwj/4f96M++zr/VtvfpFs/wAc0lR3vl47+zF0v9zxV4Wf/wAO9Tx/j/xJyCbbV4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAABHn94I7Pp9Ye37U9wPE9XXI5l0Wu2o7z6JY+Lm7HhexzK413HhatRrduUwM/Z/mnkXfTP4WLi3JTrC1brKkfvH3pGeX4DF1BqYvNucLMRnile98mnkv5ZrER6z8PJl+Lae09q0nv2iO8W+e6N9omnh14uch4R8/vRh6c8S8d54v6oy/D1tLqXT14z0zWvefJSdvU0fqHFj71+JnzUisWvaImD+hQ2fAAAAAAAAAAAAAAAAAAAAAAHnxcbIzcnHw8SzcyMrLv2cbGx7MJXLt/Iv3I2rNm1bjSsp3LtycYQhGlZSlKlKUrWtH7Wtr2rSsTa1rRWtYjvNrWntEREeszMzERH0y9WfPh1sObZ2MlMODXxZM+bLktFMeLDipOTJkva0xFaUpW1rWmYitYmZntCwp9jl2aWu0ntO43f3uDatdSOrOPh885fk1hD49rF21n6Zx3WV8+buPLD0eRr7OdiylGsc6zclctwuUrGlgPhB0dHSfSmtOekRyPK1pv7du310Vy18+vj9fWs0wWx1vT0+vrMzHf0jUM9417SF/aB8fuaxcVtZMnRnh/l2OlOncPmtOLJn4/L9T8xux2mMeauzymHcyauesT31ctIre1J7ztoZWV/gAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAkB+7jSpTvf5l/53Qzkcafw/3W8Mr/Qz37O/9W25+kmx+/t6UKkvfKR39mDpz7ninws//h7qaP8AGnKputXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAABxnmnEtNz3iPJeFcixbeZo+VaLa8f2uNcjGdLmDt8G/gZHppOMo0uRtX5StT8VrbuUjOPiUaVcbd1MO/qbOlsUi+DawZdfLWY7xNMtLUt8+/ae1p7T9E+r7fTXUHJdKdQcJ1Nw+e+tynA8rocvoZqWtWabXH7WLaw+aazEzScmKtb179rUm1Z9JlWid8nbZve1Hua6o9H9vi3LGFp+Q5Wfxq/8OdMbK4zufRt9J9Gv1828muLrc/FxMmdqcqRyrN63OkJxlCNbnW3TefpXqXk+HzVmtMOxa+tbtPltrZu2bB5bfK3kx5KUtMd+14mJ9YmG657L3jTxXj54I9C+IvHZ6ZdnkuHwavNYvPWc2Dm+N83H8p8fFHa+H4+7q59jDW9Ym2DJjvWbVmLTiQ6mkCAAAAAAAAAAAAAAAAAAAAA2++xj7ML/AHX91mi3O+18sjpn0euWebctndhKOPnZeHct29Hq7N+VPhSy47jK1mfcxvM7lzCx78q2/h0lKmXPBzo23VXVODNnxzbjeHmu7tzMfW5L0mIwYotPpN4zWxZJr6zNKzPbsrx95J7SeHwC8BeV43ituuLrbxFpl6Y6epS0WzauDZpe/Kb+XFHfJXXnjsG7qUz9q0ps5sURfz9qzYL2bNrHtWrFi3CzYs24WbNm1GMLdq1bjSFu3bhGlIwhCEaRhGNKRjGlKUpSlE+4iKxFaxEVrERERHaIiI7RER9ERHpENRjJkvlyXy5b2yZcl7ZMmS9pte972m173tMzNrWtM2taZmZmZmZ7y8j9eAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN/vu5da074eWU8/quiPI6f+1fDq/0M9ezx/Vtt/pLsfxrTVLe+Qjv7L/Afc8T+Gn9rgepP+VObTeauAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/AOLoPs/qkA/G77IHLfsH8BibdHuufyH/AIefouX++++1AsRrEAAAAAAAAAAAAAAAAAGX/YJ/jk9uX42eE/aHXu3dBf1Y9Ofpto/xjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAjQe8S9n8+edKuLd0nEdV8Xf9MZ4+g5xLFs+q7k8S2ebOxh5U7dqPxb+Rj7jZYcJ3q+v4WFal6qRhCsoxt9oTpGd/i9XqfUxd8/GeXBvTWve1tTJea0t2iO9rVzZaRM+vakTMxERMrr/c8+0RXpXrznvArqDf8AJxPW9MvLdL1z5fLjwdQaOtGXZwVvknyYsObjdPYtTHHk+JtXjtNr2iswxkOWySAAAAAAAAAAAAAAAAAAAA9rCwsrY5uJr8Gxcyc3PysfCw8azGs7uRlZV2FjHsWoRpWU7l27chbhGNK1lKVKUpWtXlSlsl6Y6Vm18lq0pWI7za1pitaxEeszMzEREfOXo2dnBp62xubWWmDW1cGXZ2M2S0Ux4cGDHbLmy5LWmK1pjx1te1pmIrWJmZiIWIHsiezfH7Qu03imFt8O1b6idTMXD55zbL+HSORSe5sfTtJrLtJUrdsXNXpsrCwcvGlWPpy8a5WduNylaRsF8Jejq9I9KatM1IjkeTrTf3b9u1onNHxMOKe/rWcWG9KXr6fX1nvHeGn37wr2js3tDeP/AD+1x+zkv0d0Tn2OlOmMHnmcM043JGrye9SYnyZab3Ja+zta+aInvr56xS80nvO05lFBIAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG/X3dGXp75OS0/6XRbkUf/AGo4hX/v/P8AeZ59nme3W2z+k2xH/nOp/jVN++Mr39l3hZ/sfEvhp/8AQXUX+PsnRpvtWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAHAeqfTzQ9WenXNem/JsWxmaXmnG9xx7Mt5FuN2Fqmzwb+Jby4wlSVPjYd27DKsS8V9F6zCdKVrGjgcpx+DleO3eO2aVvh3dbNr3i0RMR8XHakW7TEx3pMxes9p7WiJ+h2zoTrDlugOsemus+Ez5dfk+mua47l9a+G847XnR2sWe+va1Zifh7OOlsGWO8ebHktWZ9VZV3V9BuRdtHX7qb0a5Jh3sTJ4hybPx9d8aNaVydBlXPp/H8ukvHpnXJ02Vg3p1j8qTuSjWkZUrGla3VPBbHTfP8nw+zSaW1NnJXH3/rsF5+Jgv3+U+bDalp7fTP0T6N27wG8VuH8bPCXojxI4XYx7GDqLhNXNufDmJjBy2Cv1Ly+vNe/evwOSwbWKsT860iYmYmJnHp19l4AAAAAAAAAAAAAAAAAABuZ9id2W3O6bum1fL+Sa6uT0y6LXLXL+R1v25UxNnt7ErdrR6i3er4t1y7OyzNft5WPVKc8bDu1rbrb9VWYvBfo23VHVGLc2Mfm4zhprt7E2j6zLmrMRgwxb5eeuS+PN5fppSfTt3Vu+8z9pWngT4E7/T3C7kYet/EuuTp3hoxXj6o0eOyxbJyvIXxR3v9T5dLX2+PjL2itc+xSItF/LCf7CELUIW7cI27duMYW7cI0hCEIUpGEIRjSkYxjGlIxjGlKRpSlKUpSiesRERERERERERER2iIj0iIiPSIiPlDUrta17Wve1r3vabXvaZta1rTM2ta0zM2taZmZmZmZmZmZ7v6frxAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABvw93Wl475t/T/pdG+RU/wDabiVf/gzv7PU/7N9iPt8PsftRs6n/ALlT/viY7+y5xP3PEjhp/wDQnUEf4/8AEnUJwtWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAABFV9407Qa7PScK7teIajzkaT4HEOpU8Oz4pLAyL1y3qOQbG54rKd2mXf1ektVpKkaWqW6VhWtPUi37Q/SPxMOl1Zp4frsPl1OSmkfPHa0xh2Mk9u82i9sWCPXt5e0dvRfJ7m/wBoeNLlOpvZ+6i5D+k8p8XqLomuxk7zXbw4635HiNOveIrjnBj3uUvExMzfzzFu3aqIiiW2FAAAAAAAAAAAAAAAAAAHvazXZu42Wv1Gtx7mXsdrnYmuwMW1Gs7uTm51+3i4uPahGlZSuXr923bhGNK1lKVKUpWtXnix3zZMeHHWb5Mt6Y8dIjvNr3tFa1iI+c2tMREfblxt3c1uO09vkN3NTX09HV2Nzbz5JiuPDrauK+fPmvaZiK0x4qXvaZmIitZmZ7LFj2UfZ1hdnnahw3judh24c/53h4nOOeZsrVLeXPYbqx9P1+syKV/RWrmk1uXj6q9a8R/TcOUrkfiearC/Cvo+nSHSunr5KRG/vUpvb1+3a/xM8fEx4rfTE4cd64rR6fXU9Y7tOr2+PaM2vaL8fOo+Y1di9ukuldjY6X6U1ov59eunxmT6k297DMTMZKcnu6+bfx5O9v6XsRFLeTtDZkyUhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADfV7u3Xx30bmn/S6P8ip/wC0nFK/0M6+z3PbrjN93h9mP/OdSf8AEqj98LHf2W+N+54icPP/AKG56P8AGnXJxtWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAB1B196P8c699HeoXSTlOHjZuq5txjaaekcqHrt4uwvY1yWp2NKeafpmt2cMTOtVr5j8THj6oyp5pX5HPcRrc9xHIcTtUrfFu62XD9fHeKZLVmcWT8/HlimSPu1j0lkTwn8ROY8KPEbpDxB4LZza2/wBMc5o8jM4LeW+fTx56RyGnM/2G7o22NXJ8p8ma3aYntMVknXvo/wAj6CdYeoXSPlWJk4e34RybZ6escu3W1eytfZybktTsawrGNKW9nrJYmfarGNIytZEJR+VaK1Od4jY4Ll+Q4napambS2cuHteO1rY62n4WTt2j0y4ppkjt6drR2buXhR4icN4r+HXSHiFwOxh2OO6o4TS5KJwXi+PBt5MNY5DTi0Tb67R3q7GpkiZmYvhtE+sS6hfJZCAAAAAAAAAAAAAAAAAbufYb9lku5nudxepHKNfXI6adD5w5Js6ZFmssDccl9ELOl00rnilKZOLfz8XexhGcZShr6+qkoeqlc1eCXRn4ZepqcltY5txvCTGzl80fWZtntEYcMz9Fq2vXP2iYmYp9rurH96H7SseCXgfn6M4PcjD1r4oVtw2jOHJFdrjuF81svJclFO/ecGfFq5+LtaazEX247TFu0xPejGMIxhCNIxjSkYxjSkYxjGnikY0p4pSlKUpSlKUpSlKeKJ3RERHaI7RHpER8oj7TVAmZtM2tMzaZmZmZmZmZnvMzM+szM+szPrMv0fgAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAADfJ7vBXx307T9/pLyCn/tDxev8AQzp7Ps9uuMv3eJ2I/b2NVVR74KO/ss6U/a8QeHn/ANEc7H+NO0TkarwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/2Cf45Pbl+NnhP2h17t3QX9WPTn6baP8AGMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAACIb7xp2hU1W/4T3acQ1HoxN7GzxDqPcw7NZU/NPHtXY6re58oUlSzbrh2Nbp7dyXw7c70oR81uS+cSvaI6R+FsaXVepi7Uz+XT5HyV7/ANNrExiz5O34mPJXHhifSJntHz+ewv7m72hp3+J6n9n/AKh5DzbHFTl6i6MrsZIifqHNkpbkOL1ItMTlvGzl3eRvSPNeuOLWiIpHaIrKLi+EAAAAAAAAAAAAAAAB9LTanP3+31Wi1WPcy9putjharXYlqNZXcnO2GTaxMSxbjTzWs71+9btxpT66yo9mHFkz5cWDFWb5c2SmLHSPWbXyWilKx92bTEOHyPIanE8fvcpv5qa+jxuns7+5sZJitMGrp4b7GxlvM+kVx4sd72n7USscPZedoWu7O+1HgnCr2JbjzflGBjcy57nytfDzb+63tuWzta7M+UfFzQYubb0tKUjGtaYVKz9U/Mq2I+GPSOPo/pXR0rUj6t2sddzfyTHa9s2ePixjv8vXBW8Ye3aPxHr3n1abPtze0Pue0Z4+dVdTY9i9umOC283TfSepGSb62LjOKvGlk3dbvM/Wctn1rclMza3rszFe1e1Y2LMhocgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAA3v+7yy9PfXm08+PV0p5BT+H/h7jXyZy9n6e3XN/u8VsR/5fWn/ABKrPe/R39ljW+517xE/+iubj/H/AIk7lOZqtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f/i6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGX/YJ/jk9uX42eE/aHXu3dBf1Y9Ofpto/wAYxo8e1j+Rx8ZP1AdTfenbWbKyppHAAAAAAAAAAAAAAAAAAAAAAAAMdu6/oHx7ua7fupvRnkWHZyrPLuM51jVyu0hT6LyDEhTP4/lRuy8VtRsbnFwbl2UZR9VqE4Sr6JSo691VwOv1LwHJcNsUrau3rXrj839bsUj4mvbv6dormrSZ9fWImJ9GYvAPxZ5jwR8XOiPEnh9nJr5Onub1cu/GPzT8fiNi06nL680r3jJOXjc+1THE1t5clq2rHmiFZZ1R6eb/AKT9ROZ9N+T4t7E3nC+Sbfjufbv2Z2JXLmrzr+JHKtwuUjWuPmW7UcrGuU8wu2Ltu5blKEoyrWtyfH5+K5Hd43ZramfS2c2vki0TWZnFe1ItET/W3iItWflNZiYmY9W7Z0N1fxPX3R/TXWfB58WxxfUvC8dzOpfFkrlilN/VxbE4L2pMxGbXtktgzUntamXHeloi1ZiOBuC7UAAAAAAAAAAAAAAA3rewj7LadxfcpTq9yzW/SunHQycdzdhlWfXr91y69Zjj6nU3Jen1Uv4NNha31n0Th+j10fXWUfVCWcfA3oz8MXUkcvt4vPxvBz8aYvHfHm27RFcWKfTv5scZI2K9pj1x+vePSasvepe0rPg54Kz4e9P7vwOs/FKJ43HbBk8u5xnT2PJbLyHIUjv2nFtTqX4nJ5q2+t257RFu1ong0pSlKUpSlKUpSlKUp4pSlPlSlKU+VKUp8qUp9Sc7VVmZmZmZmZme8zPrMzPzmZ+mZfo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAb2Pd6peO+2/T/pdLt/T+becbr4/zf5mcfZ/nt1zb7vGbEf8AltdVj73qvf2Vsc/2PXXET8v+xnM/tfa/XTwE52qqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/ABjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAAAAhh+8Sdn8eA9VuK90fEtV8Hj3U+Njj/Nq4tn9LxuX6zBnaw8uduzGkcXGyNNrcWFy9cjGF7Pu1p8St25SNYb+0H0jGhyur1PqYu2vycRg3fJX0rt46TFLzEfia2w46xNpjtN5+feezZM9z17RFuregee8C+od/4nMdDTl5fpmNjL9fm6d3tut9jXrfLM2z58PI7ue1MdLTbHq4/SkY6eaI0aN66wAAAAAAAAAAAAAB9fQaPZcn3um45psa5mbffbTX6bWYlqNZXMjP2eVaw8SzGlPNfNy/etw/BTz5r8ntwYMmznw6+Gs3y58uPDipHrNsmW8UpWPz7WiHz+W5TS4Ti+S5nks1Nbj+K0dvkt7YyTFaYdTSwZNnYy2mflFMWO9v1u0eqyD9mp2kars67Ven/TuOLbpy/ca3H5XzzYStUt5uVyHexltLuDmVjSMZS0MM78xbVYxj+k4cPVWc/M5WLeG/SeLpDpbQ4/yx9V5sddreyTHa9tjPE5Zx39I7zgi/wI7R8qR859WmX7avtBb/ALRnjz1b1jOe89O8du5uA6U1IvN9bBw/FWjRpta0TNprXlrav4J5Im0x8TZt5YrHasZ/O+olgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAA3pe73y8d9/8bpnv4/8Arnj1f6P52cPAH+rn8/jc/wDDa8/4lWvvd47+yr+d1txE/wDo3mP+VPGToaqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAADEbvm7a9J3XdsnVDpDtcS3fz9tx7Kz+M3/AEQrkYvJdP6Ntpvo9yUZVtVy8/Bx8O/KPisse/chWVKSrWnUuuOnMHVXTXJ8RlrFsmXXvfWt2+ups4f6bh8s/R5slK0t9utpjvHzSE9lzxp5TwD8buhvEPQ2LYtXj+XwanN4vNaMOfhOR83H8l8alZiMka+ptZtnFW3eIzYqW7TMRCtF5lxTccF5byXhnIMa5h7viu923Htrj3YStyt52nzr+vyqUjP5+it7HnW3L5xnCsZRrWNaVrW7uaubR29nT2KzTNq58uvlrMTExfDktjt6T9Hes9vtx6t1rpznuO6p4DhepOIzU2OM57itDmNDNS1bxfU5HVxbeCZmvp5ox5qxePSa2iazETExHGnGfaAAAAAAAAAAAAAb8/YJ9lsOvvcRf648v1n0rp70Pn9OxbWVZpc1+65plY8cfXa676o+ZVwMfY13dqVucKRyNfbpKUvFbcs8eBPRkc91Dbm9vH5uP4T6+sXjvjzbt6xXHjmJ9e+OuT49Zj5Xxx3+1NTvvXvaVt4TeD2Lwv6d3fgdX+KFY1c98GTybfGdNYM05dzdp2ntFdvNp/gZkretpnDt3mKx3i8Tpfq+pOBq0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/AFb8D96N1GaRsXZgAAAAAAAAAAAAAAAAN5nu+kvT34Wv/O6c76P8+20Vf6Gb/AH+rqP0uz/wuCVXPvc47+ypk+51lxM/+j+Vj/GnmJ0tU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAEHf3gXs9h0Y7hNZ1+4pq6YvCetcLf5qxxbNLeDrOa6/CrYycWFIwp4u7LD1lzcZE5yn68jKuVpKPqpFCbx86RjhuoMXPauLyaXNRHxYrXtjx7uOnltSPT55KYpzW7zPe15bQPukPaJt4k+EO94S8/vfH6m8Mr5PqCc+Wb7e90zt7MZcGe3e098elsb1OOw1rWvlw4KRMW7TaY97AC3cAAAAAAAAAAAB93i/G9tzDkmh4pocW7m7rke412k1eLZhKdy/nbTLtYWLbpGPz8VvXoeqVfFIx8ylWlKVrT36utl3NnBq4KzfNs5seDFSI7zbJlvFKx+3Md5+iPWfR8rnOZ4/p3huV57lc9NbjeG47c5Te2MlorTFqaOvk2c95mfTvGPHbtHztbtWImZiFkp7OvtO03Z32t9POl+LjW48myNVj8j5zn1txjmZnJ95GW1zsXLnCMI3fzFu513T406R/8WxLdKynX9HWxnw86Uw9IdL8fxdaxGzbFXY3snaPPfaz98t6XmO3m+BN5w1nt+JpHrPznTA9sTx95L2i/HXrDrrPnvPCYd/Nw3S2pF7W1tbg+LtGjq59atptakcnTVpyOasz/t2xeYrWPrYznd4RbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABvH935l4788Sn/AEunu+p/600fhm7wC/q6r+l+f9/LhhV773CO/spbE/a6w4mf/MeU/wDcnop1NUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8AF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAABgZ7SPtV1Xd12odSunF3Ftz5PrtPkcp4Rn0s/FzMLkOgpDa27GDSsZ0pe3NjCuaWVawlX4WfP0+mXiVOi+I3S2Lq3pXkuOmsTtY8NtrRydu96bGDtlitPn65q0nDPpP1t57eqVnsYePO/7Pfj70V1njz3rwe3yOHgup9Scnw9ba4flpto3y7c96zOLjcuzTkoiLV+v1a9+9e9Zrbt5ptjxzdbfj24xrmHttFtM/T7TDu0rG7i7HWZd3Czce5GvzpOxk2LluVK/VKNVc2fDk182bXzVmmXBlyYctJ+dMmK80vWfu1tWYn85ufcXyWnzPG8dy/HZ6bPH8ro6nI6OxjmJpn097Bj2dbNSY9Jrlw5aXrMfOLQ+W9TnAAAAAAAAAAAJCPsA+yyHW3r1n9wnMtZXI4J0UnKWlt5dmksLcc2zcWmPjY04zjWt2Gvwdhe2dq7arGNvNwrVJXPVGtuuf/AXo2Ob52/UG5j82jws98MWr3pm3b08taT3j1jHTJOSJjt2vSI7+kwqI97R7S1vDHwo1PCHpzejD1V4mViOSvr5Zrtcd0xrZ5zZ81ZpPbHfb2tTFpXpkibX1tq81p2mLxOHTZavwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN4Hu/8vT3662n/S4Fvaf+stNX+jz/ACM1+Ak/7O8Ufb0c/wC9kwqwfe2R39lHd/4PVnFT/wCZclH+NPYTtaooAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAAAD8rSlaVpWlK0rStK0rTzStK/KtK0r8q0rT5VpX6x+xMxMTEzExPeJj0mJj5TE/RMIGXt3Oz2Hbv3SXep3F9b9D6fdcbdeRYsMazWODq+UQt1sbrArd8VpXL2WXhZ+8nblOsvTlVlGMYeKUgr45dIfhe6nnk9bH5OP5uPqikVj+l4tqI8ubH3/ALPLemTPMTMz2t9EdobWXurvaKt4w+BWPofnN36o6u8L7/gPntmyRO1vcHa/xeM24x9+8a+lr7Opxdb1rFfNgiJmbd5nRqwitFAAAAAAAAAAcl4bxPc875ZxvhnHcS7m7zlO71mh1eNZtzuzuZu1zLOFY8xhStaW4TvUndnXxG3ajO5OUYRrKnJ09TNvbetp69Jvn2s+LBirWJmZvlvWlfSPoibd5n5RHeZmIh8XqPn+N6V4DmepOY2MerxfBcZvctv58l64601tDWybOXta0xE3tTHNcdY72vktWlYm1oibKbsG7WdH2g9sfTnpHrca1Dc4unx9xzHNpG3XIzeU7mNdpuIX71uNKX4a/OzcnAw5VrP04li1Ck50pSVbHug+l8HSPTXHcTipEZq4a5ty/aPNfazR8XNFpj8VGPJe2Ok+valYjvPzaWXtY+O3Ke0P439ZeIO7nvbjc/I5uO6c1ptf4OtwPGzGhx1sWO8zOK23q62Hb2KxFe+xlyWmte/ljM13FG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG7r2AkvT376f/zuD72P8PnP1H/wZq8Bf6vMP/aOx/6+FWN72ivf2UOSn+x6o4qf/NeQ/wDenvJ3NUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8AF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAABrM9rF2jYXdv2jc60OHhWrvOuBYOTzvg2ZWMa3rGdo7P0va41r/nXZ7DR2djg2bFPVWd/Jh8OFblYsa+KvSdOrOkt7BSkTvaFLb+lftHmrfBHny1j6ZnJgrkx1r9NrR2jv2Ta9gP2g9n2ffaE6W5XZ2cmPpXqzawdKdU68WmMWXU5TJ8DQz5P63HXT5TJp7WXLPby4sNvNaKd1dHm4eVrszL1+dYu4ubg5N/DzMa/CVq9j5WLdnYyLF63OkZ27tm7Cdu5CcaShONYypStK0V53pbHe+O9ZrelrUvW0TFq2rM1tWYn1iYmJiYn1iY7S3GNbYwbmvr7erlpn1trDi2NfPitF8ebBnpXLhy471ma3pkx2relqzMWrMTEzEvWeL3AAAAAAAAAJGfu+fZdb6t9Z9x3L8z1Vb/D+j054fFYZdmlcbZ812GJTHpOlu9CtMrGwdZn5l6F61T02NjjWqVuUuQ9CQ/gD0bHLczm6k3MXm0+ImaasXr9Zl3clPL37WjtetMWS9omI+tyUj17x2U4e909pS/h94a8d4J9N7/wuo/EatNnnra+Sfj6PTGnsfGmnnx2idfPt72rrY7Y8kxbLp5rzFJpfzJsqaLWWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABu19gRLx38aH/wA7hm8j/wDfmsr/AEM0eA/9Xmv/ANp5/wD18Ssr3ssd/ZO5b7nUvFT+1rb/AO180+NPBqeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAAAAD+Llu3et3LN2ELtq7Cdu7buRpOFy3ONYzhOEqVjKE41rGUZUrSVK1pWlaVfkxFomtoiYmJiYn1iYmO0xMfTEx6S8qXvjvTJjtamSlq3pekzW9L1mLVtW0TE1tW0RNZiYmJiJie6vr9tN2fS7We7ff7fQa+eN076xfH53xicIVnYxs7Pu1ryLCuXYUras3rm+jtcrHxK1hOOHWEoW/hUpJATxl6Q/Cv1ZsZdfHNeP5jzb+rMR3rW+Sf9UUmY9K2nP8W1aT2nydpiOzbl92p7RMeO3s+8Tx/Lblc/WHhz8LpTnK3tFcubV1af6zbNMdp8+THTiZ0MGbPHmrOzFq2tF5msafmI1iIAAAAAAADlvAuF7zqNzXivBONYl7O3vLt9q+P6zHsWbl+dcraZlnEt3JW7VKypZsfFrfyLlfELVi3cu3JRhCUqcvR08/I7mro61Jvn28+LXxVrE2nz5bxSJmI/ra9/NaflFYmZmIju+B1X1LxfR3TXO9Vc1sYtXiun+J3+X3s2XJTFWMGhrZNi9K2vMROXL8P4WGkd7ZMt6UpW1rRWbLTse7Y+P9pHbZ036OaXFs2c7UaTGzuU5UKW5Xc7lW2jXZ76d2/bp+n2rG0zMzHw5SlP0YkLVuMqxjStbIeiemdfpPpzjuHwUiL4sFcm1aO0zfayx8XPM2/rorlvetJnv2pER3aVHtQeN/L+0H409aeI/JZ8mTU5HlM2rwOC03jHq8Dx8xo8TWmK/pivl0dfXzbFYrXzZ7XtasWmWW7tiPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN1/sDa+O/rjdP+lxDeU/8AvrW1/oZn8CP6vNb7upn/APWxqzvewx39k3mvudQ8XP8A5Ddj/Gn0p4tTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/APF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/AMPP0XL/AH332oFiNYgAAAAAAAAAAAAAAAAAy/7BP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAGor2zfZ9Z7qe0fkuw0mvjk9ROkVu/zzid2EYUvX8bXW5V3+Fcn4pcu2fzBntb9jHjOnqzI2qxjOdaRriXxj6QjqnpPZyYMcW5DiItv6kxEea1ccf6opM/OY+BOW1a/Tft29Z7TYT7tv2ir+A/tBcLqcpt2w9H+IdsXSnP47WtOPFm3Lx+BG1SvrSmT8FaaGLLmmv1uvbJFrVr3tFe/ct3LNy5ZvW52rtqc7d21chKFy3chKsZ27kJUpKE4SpWM4SpSUZUrStKVpWiAUxMTMTExMTMTEx2mJj0mJifWJifSYn5Nu2l6ZKUyY71yY8la3pelotS9LRFq3paszW1bVmJraJmJiYmJmJfw/HkAAAAAAAko+70dl1vqV1V3/AHS811PxuMdK53dTweOZZ/SM7mOfi0x7+Zbt3o1t5mJh6rN2Nv4tuM4Y+xtW6VnG9bpGkjvZ/wCjY5Llc/U+7i76vFzOLS88fW5NzJXy2vET6XpTFfJHeO8VyRH9dEQpb9757Sl+iuguJ8CemuQjHznXlcfI9UTr5e+XV6b1M85sWte+OfNrbGzv62necd7Vtl08l58k4795mjplNasAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG6j2CUvT3+cVp8v0XFd3T/wDf6/6mZvAie3Xur93Vzx/42P8Axq0vevV7+yZz0/2PPcXP/ktv/wByfgnk1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/ALBP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAHrZmHi7DDy8DNsW8rCzsa/h5eNdj6rWRi5NqdnIsXY/863dtTnbnH78ZVo8b0rkpfHesWpetqXrPytW0TW1Z+5MTMT9x7tbYz6exg29XLfBs6ubFsa+bHPlyYc+C9cuLLS30Xx5K1vWfotESrrPa19o2V2k93fN9Lg4d21wbqDl5XPeEZVbfpsXcLeXqZu1xbHilIxt63dZOdr7NutKSpZxY1p6qfoq16+K/SV+k+rd3DjpaNHkL239K0x2rNM8+fLSvpERXHmtfHWPtV+mPVuJe7+9oPB7QPs9dMcntbFL9U9Ia+DpPqfBFvNlx7PF451uP2MveZta+7xmHV28l+8xOTPb5T3rGsNjNOAAAAAABzfprwHf9UufcQ6d8XxL2bvuY8g1fH9dYsWbl+dL2yy7WNXInbt0lL4GLbuTycifikbVi1cu3JRhCUqc3jdDPym/p8dq0tfPubGLXx1rWbT5sl4r5piO8+WkTNrT8orEzMxEd3WOtOrOJ6F6T6h6w53YxavE9OcRvcvu5cuSmKs49LXyZoxVveYr8XPelcGGvfvfLkpSsTa0RNl92adtnG+1Dt16b9GOPYlmxd47ocS7yLIt+ic8/lOxh+aPIsmd+FPN+3Lc5WdTFrKU/RjfDtxl6Y0WR9HdN63SnT3HcNr0is6+Ck7Fo7d8m1kj4mxaZj5xOa1/L3me1e0RPZpRe0h40c14++MXWniTzGxky05jls+Ph8NvPWurwWnb6j4fDXFb0xXjjtfV+PFa18+bz3tHmmWUbtDBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAADdF7Bifp7/uHU/6XGt3H/8Ae4Vf6GZPAr+r3T+7r5v8NJ/xK1/etR39krqP079ua4yf/E2o7/vp+yejUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAAAABpB9un2d17ju1jK6jcY1v0rqH0PuS5Pg/RrNJ5+141Wssfd6udysZeMLX4mbm72UY+iXxMPz6q08xrhTxw6Q/DF0vfkdbF5+Q4SfqnH5Y75Mut3mubFM/RTHS+TPPb170/PhZ57rT2i48GvHfB0bzm78Do/xQpHB7Xx8k11dDm+1cvGb9axMd9nbz6utxdZtFo8mx2iIn66IEtaVpWtK08Vp8q0r9dK/gqgk2vPn8gAAAAAEm/wB3g7L7XOeoXJO6/m2o+Noensr+h6eUzLPi1lcqzcemPnbWxC9H0ZmJi6zK2eFW5CNyFjPhH9FG9bpSklvZ86Nje5DZ6q3cPfBx/mwcf56+ltq9fLfLWJ9L1rivlp3iJiLx9uPSkX3wXtKZOl+kOF8AumOQjHyvWEYuW6wnXyd8mDgNXN8bV0Mtsc+bX2NjewaOz5LTS2XUtP1tsd57zKUwmuCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADc57B2vj2gHCKefHq4/uqfw/osSvj/MzH4Fz/s90vu6+aP8A1Z/xK2/erR39knqef7Hl+Mn97Yj/AKSn+J6tSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAAHzd1p9dyDT7XQ7fFtZuq3WuzdVssO9T1WsrA2ONdxMzHuUpWlawvY965bl4rSviVfFaV+b15sOPYw5cGWsXxZsd8WSlvWL48lZpes/ctWZifz3N43kNziOR0OV47PfV3+M3Nbf0tnHPbJr7enmpsa+ak+va2LNjpeveJjvWO8TCt29pd2pbPtF7suo/T6WNdhxXc7fK5dwjMra+Hi5Og5BcjtY4mDWkYxnY0l/Onpa1p6q0nhSpOUpUrWtdHiT0tl6S6r5Lj5rMaubLbb0r9u1LYNifi+TH6R3rgtknD3/wCB85lucexT496PtC+AHRnV9c2O3O8bx+Dp7qjW+J59jBy3D0nQtsbX10zXLymLVryfafLE12YmtYr2hgE6ElmAAAA7C6T9NuRdYOpHCumXFMS/m77mvItZoMG1j2p352652VbtX8uVu3GUvgYOPW7mZE/Hpt2LFy5OtIRlWn0OK47Y5fkdLjdWlr593Yxa9IrE2mPiXitrzEd58uOsze0/RWszPpDqPX3WfD+HfRnU3W/P7GLW4npnh97ltrJmyVxVvGpgvkxa9b2mI+LtZox62GvfvfLlpSsTa0RNmN2ldvHGe1rt/wCnHRjjGHYxrfFePYUNzes0jKufyTMt/TuRZ0rtPMrsMndZOdeseqUqW7NyFu36YRjGlkvSfT2t0vwHHcNrUrWNXXpGa1e39M2bx59i8z85i2a2Sa+vpWYiO0NJv2gfGDm/Hbxb6z8Suc2cufJz3L7NuNx5JtEanC6151uH1Yxz2jHbDxuHVx5e1azfJW17d7TMskHY2GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAblvYRSrT2gPAqU/52k3Ma/weMev9DMXgZPbr3R+7hyx/6v8AiVv+9Tjv7I/Vn3OU4yf4aP8AGsAk9mpOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/ABjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj8+8Adn0+tXbnr+u/FdX9I5r0Rv28jaSxLFbuw2fC9hkyw8nBjbhSU7lvBztnHbXpxhWVqxiTnKdLUJUYD8e+kZ5rp3Hzurj827wlotlmte+TLp5LeS1IiO8zGO+T4tp7elaT3ntC3D3SftE18NPGTb8Kue3vg9M+J+K+HRjYyxj1NLqXUwRs4Nm17zFaX2tXRnj8dZtFcmXYrEVm9olBtQjbRAAAACUb7u12XQ5Py3k3dzzfT1uaniX0njfTP6ZYlS3f3+RCmNtN7ieulLeVYxsK7tdTOVKXIWsvz49N2FKxk77PfRsbO3s9W7uHvi1PNrcZ56+ls9o8uXPTv6WitJy4pn1itvtTCjD3w3tKX4Pp/g/Z86Y5Lyb/UPwea63+pstZvi4nDb4+jxWz5Z8+DLn2aaHIViZpbJr/wBljvMTMLS7a6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAANyHsJ5en2gnTz6/0Wp3NPl9/wDQWfr/AM7MHgdP+z/j/u4c3/6VcfvT47+yN1h9zkONn/xsn/KsCE+GpGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/wDi6D7P6pAPxu+yBy37B/AYm3R7rn8h/wCHn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/2Cf45Pbl+NnhP2h17t3QX9WPTn6baP8Yxo8e1j+Rx8ZP1AdTfenbWbKyppHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOO8v4tp+b8V5Hw7f4tvM0vKNJtNDtMa7CM43cHbYV7ByaUpKlaUnS1flK3Px6oTpGca0lGlacfb1cO7q7GnsVi+HawZcGWsxExNMtLY7ek/T2tPafon1h9jp7neR6Y53huouJz31uT4Pk9HltDNS1qzTa4/ZxbWCZmsxM1nJirF6/K1JtW0TEzCtL78O2bd9pvc/1Q6RbTFuWddruQZW14tkUtz+jZXF95WO40kcbIrStvJrha7PxcLKnanP4eVYu27npuRlGlbvXXTWfpTqbk+Iy1mMePYtl1bdp8ttXP/TsMVt8rTTHetLTEz2tWYn1iW6v7KvjZxfj/wCB3Q3iHoZ6Zdzd4jBo87i89fj4Od4vzcdyk5sUdr4Y2dzUz7WCt618+vlx3p3paJnD11FIkAB2h0W6Vck639VeCdKeJYeRm73nHI9bo8W3i2pXrtmxk34/T870RjLzb12BHJz71axrGNnHuSl8qVfT4bitnm+V0OK1KWvn3tnHgrFY801i1v6Zft9rHji2S32orMz6Oj+JXXnC+GPQfVXXvUGxh1uK6Y4bc5TPfPeMePJlw4rfUmr5pmva+5t2w6uKImJtkzVrHrMLMvtg6DcY7aOhfTno1xXDsYuFw7jmBh59yxHxTP3tyzHI32ylKv6KVdht7ubl/OviNL3phSMKUjSyfpngtXpvg+O4fVpWtNPXx0yTX/rmeY82fJ+yZpvf7nm9O0ejSY8cfFbnPGzxT6y8SOe2MufZ6j5nb2dWmWZmdTiqZJw8TpVr8qxqcdj1tee3racXmtNrTMz36+8xMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADcV7CyXj2g3Tan/S124p9f4LVuv8AL9TL/gfPbr/jfu4s8fvQro96XXv7IvWk/wBju8bPy/8AlL/tfa/XWByfLUeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/8AxdB9n9UgH43fZA5b9g/gMTbo91z+Q/8ADz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/7BP8AHJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGv94g7P7nUXpBxnuf4lq6XuRdKJ2dNzOWLZ9WRlcO2mZPHx79bVmPxcm/i7nY4PxLtaXK2MG1OsvRZtylGOPtB9IzyPEa3U2pi77PFTXDueWO9r6eS81rby1jva1c2WnefXy0j17VjvF0nufPaIp0d4ic34HdQb3w+H6+rl5HpqufL5cWDqTR1ozZsUZMk/Dw4c/G6e15ccTSMm1krEea94iYW6GrZUAASr/d1OzKGz2vK+7zm+m+JiaumTxXpbXNs19EthKUcfb8j18q0pS58C1TbaK56qzhGc5+IUnGM6Sl9nno6MuXb6t3cPemLzanF+evpOSe1c2zjn6YrHxcE/OO8z6d4UM++K9pG2jocB7PPTHJeTY35w8911GtkjzRp1icvHcLuViZmnxMn1BytO0Vtata97TSZiZdKWbXtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQy/eZf1/e3X8WfK/8A3/qkOvaU/H7p79LNr+MY2yN7kz7E3jF+rbgfvTvIzaNi7IAAAAAAAAAAAAAAAABuE9hjXx7Qjpf+/h7in/3vSv8AQy74IfZA4v7tM3/q9/8AErs96RHf2Q+ufubPHT/5aY/x/wCJYKJ9tRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA09uT0X6sXe/Dn3KcLp3zTacd5Rg6XO0u61PGdzs9ZmWbGrxMC7G3nYOFfxvjW8jDvxnYrdpejGNJ1hSEoyrBbxu4blZ6539qnH7mXX2qYcmHNi1s2TFeIxUpMRelLV80WpaPL379o79u0w2sfddeJXQOP2Vek+C2esemtHmOD2+T1eT4zf5vjdHe1smXe2NvHa+rtbOLP8K+HZxTXLFJx2mZrFvNWYjTn9yXqr+5n1B/Izkf9msP/gVyn5W7/wC49j/NrGf5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/8AuPY/zZ/NA6D/ADbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf8AZp+BXKflbv8A7j2P82fzQOg/zbdI/wB8nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/AHHsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P82fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/wDcex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/wA2fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/wCzT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/ALj2P82fzQOg/wA23SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/AGafgVyn5W7/AO49j/Nn80DoP823SP8AfJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/wBx7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/+49j/Nn80DoP823SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f8A3Hsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P8ANn80DoP823SP98nDfy0+5L1V/cz6g/kZyP8As0/ArlPyt3/3Hsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/wC49j/Nn80DoP8ANt0j/fJw38tZrezu6E9ZN13k9A5YfTDnsbGp6h8b3ezzMriW+xMHX6zU7TG2GblZubkYFvGxbVvGxrsoyv3YUnOlLcPVOVI17p4e8HzGbrHgZpxm95cPI62fLe2pnpjx4sOWuS973tjitYitZ9bTHefSPX0Rn9sLxU8OOM9nDxYjY646Utl5Do/meM0dbB1BxWfa293f0s2prYNbWw7d82fJfNmxxNcVLTWsze3asTKyBWKtM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwfqZwHRdUun/MenfJcWzmaTmXHdtx7PtX7cbsIW9nhXsWORGE6Sj8bFuXYZNifitbd61bnH9FGjg8noYOU4/c47ZpW+Dc182veLRExEZaWpFu0/TSZi1Z+i0RPzh2jorqzleherunOsOFz5Nfk+m+Z4/l9TJivbHa19Hax7E4bWrMT8PYpS2DLXvEWx5L1n0mVZh3cdv3IO2DuF6m9GeQ4l7FnxXkmdDUSuxrT6VxzOuV2HHcqNz9Rdle0uVg3LtYV8RuylGVIypWNK2OrOA2OmeoOT4fYpas6uzkjDMxP12vefia9on5T5sNsczMfTPae0+jdq9n3xc4jxx8IOiPEniNjHnpz/AAurbka45j+kczq1+pOYwTT8VSMXJYNqlItHrStbRNqzFpxudcZmdt9B+kHJevfV/p90i4jh5Gbu+c8k1+mtW8aNJ3rGFcu0u7XPpGtJUrDW6u3mbC55jKnw8afmlfqfW4PiNnneX0OI1KWvn3tnHhiK+s1pM98uT6Y7Y8UXyT6T6VY/8VPEPhfCjw86u8QuoNjDrcX0twu3yWS+e01x5dmlJx6GpMxMTFt3eya+pTtMT581fWPms0u3Xolxft26L9Pej3EcLGw9Xwvjet1l6WLD0QzttHGtz3W1nSvzrd2m1ll59z6o0nkSpCMI0pGllHT3C6vT3DcfxGpStMWnrY8VvLHaMmaKxObLP3cuWb5J+jvae0RHo0k/GLxN53xh8S+sPEXqHaz7O91NzW7vY4z2i1tXj7ZrV43Qr29Ph6OhXX1KfOZphrNrWt3tPdb7TGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIZ7yT0p6kco6s9vnLuL8H5VyXj2JwTk+pzdpx/QbXc4uDsb26wb9nEzbuuxMmGLdvWce7dtRvyt1nCFaxpWnzRJ9o3iuR2uW6f29bR2tnXpobOG+XX18uamPJOalq0vbHW0Um1a2mIt27xHdsMe5g696M4Pw/wDF3p/nOqOB4XmM/VXB7+ro8vy2hxuxt6ePjNrHl2NbHuZ8Ns+PFky0x5LYovFbWiJmJRm/uS9Vf3M+oP5Gcj/s1Gz8CuU/K3f/AHHsf5tdl/NA6D/Nt0j/AHycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/8Acex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/zZ/NA6D/Nt0j/fJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/ANx7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/+49j/ADZ/NA6D/Nt0j/fJw38tPuS9Vf3M+oP5Gcj/ALNPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/8AuPY/zZ/NA6D/ADbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf8AZp+BXKflbv8A7j2P82fzQOg/zbdI/wB8nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/AHHsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P82fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/wDcex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/wA2fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/wCzT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/ALj2P82fzQOg/wA23SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/AGafgVyn5W7/AO49j/Nn80DoP823SP8AfJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/wBx7H+bP5oHQf5tukf75OG/lrcX7Dboz1Ys99vB+S5nTvmmr4/xvV7XN3O523Gd1q9Zh2ZwtY0IXM7OwrGL8e5dyLfox6XfjThSdyMKwtzrTL/gjw/Kx1zo7N+P3MevrYst82bLrZsWKlZiKx3vela+aZtHavfzTHeYjtE9q5/eieJHQOT2VuqOF1+semt7l+Z3+P1eN43Q5vjd7e2ctbZM1rU1dXZy5/hUx4r+fNOP4VbTStrRa9YmeYnU1TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx9px3j+8rbrutFp9xWzStLNdprMLYVtUr5rWluuXYvVhSta1rWkfH11/C9OXXwZ+3xsGHN5fl8XHTJ2/O89Z7frPo6PMctxcXjjOU5HjoyzE5I0d3Z1IyTHbtN418uPzzHaO3m79u0Pkfc+4F+0jiH5Nab+pPV9QaP9pan7mw/wCQ+h+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Un3PuBftI4h+TWm/qR9QaP9pan7mw/5B+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Un3PuBftI4h+TWm/qR9QaP9pan7mw/5B+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Uvo63ivF9Nfrlafjeh1WTWNYVyNbp9fg36wr5pWNbuLj2rlY1pWtKxrLxXzX5fN7MerrYbebDr4MVu3bzY8OOlu32u9axPZw93nec5LFGDkeZ5XfwxaLRh3eR29rFFo+Vox582SkWjtHae3eO3zfee98oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFk94y7QLm84zwvu04fqazy+MfB4l1Jnh2fr1GTduW9Vv9hOkfVO5bzbuq0tuVJeI2awpWHiPqRf8AaH6RnPraXVeni731vLqclNI/6zaZjFsZJ+czF5xYY9fSO0dvpXte5w9oinF831L7P/UXIRXW5z4vUHRddjJ8uRwY633+J1KzMRSmTWx7/J3jt3tli0+bvPZECRHbDyWZ7un2YwlHlfd/zfTUnStMrifSyudYpWkJwu0x91yXXT8UlS7Gtra6G5WUpQrC5c8W/V4nSVns9dGxP1V1dvYe/wCK1OL89flMT5c2zjnt6THbLgn17dpn079pigT3xftJWieA9nfpjkpr2nB1B139S5fW9bY5zcbwm5XvMTS0ZNDlaRWIt5qU727d6zLMSsUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPnbLT6nc2aY241eu2uPGXrjY2WDjZ1mM6UrSk6Wsq1dhSXitaeqkfPitaefFavXkw4s0eXNix5a/Py5KVvHf7fa0TDmaXI8hxuWc3Hb25oZprNZy6Wzn1cs1mYmazkwXx3mszETMTPbvET29HwfufcC/aRxD8mtN/Uno+oNH+0tT9zYf8AIfV/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KX19Xx3j+jrclpdFp9PW9SlL1dXrMLX1u0p9VLlcSxZrOlPvUl58Pbi19fB3nDgw4Zn5zixUx9/z/ACVjv+u+fvcxy3KRSOT5TkeRjH3nHG9vbO3GOZ+c0jYy5PJ37z38vZ9h7nzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHU/XPpNx7rn0i6g9J+UYePm6jnHGNppJwyoeu1j5mRjTrrM/0/fua7ZQxM+15pWlLuPCsoypSsa/K5zidfnOI5Ditqlb4d3Wy4Zi0d4re1Z+Fk7d49ceSKZI+jvWPSXfvC3r/mPC3xC6R6/4LYza3I9L85o8nW2C3lyZtbFmrG9qd/7Dd0rZ9TJ27T5M1u0xPaYrobPYt1gu95Me0qvFeQx30uoV7Qxyp6zIj6+HWNpcrXldLtbFMb6FPj9v804X/PwazlGx/ha0tK8o6H5eesI6TnV2PjzyE68WnHbvOnXLP+q4ny+XyTrx8WLfie/1vz9G41k9qXw6x+zjPtA/g9w9uJr0hi5a2Cu7ht5eo8ujSI4CccZZzfVNeXvGlbF/tkUicv4iJusWug3R7i/QLpDwDpHxDCxsLTcI41q9NSmLb+HDNz8fFtU2u1nH71/a7H6TsMjxSMa3smfpjGPiNLDOC4jW4HiNDidSlaYdLWxYfrY7RfJWkfFyzH9llyebJb6O9p7RDTp8VvEXnPFjxD6t8QeodnNs8l1PzW9yU/Hv5762pmz3nQ0K2/3LQ0/gaeH1mYxYaRNrT6z24+sx6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA43/cbxD+6CnLP7leN/3VRs1x48m/MPWf3QRsVh8Otim5+i/mjSzW3+grbpk+isP0Pp8fJxvqPU+qPqv6l1vqqI8sbPwMX1RFe3by/G8vxO3b07ebt29Pk+z+GPqH8CJ6f/AAe5n8AZyfGnhPwU3vwInLFvPGWeN+P9Rzki313n+D5vN9d37+rkjkvjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.cs b/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.cs new file mode 100644 index 0000000..2d17dc1 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828111146_Added_IsCurrentVersion_Field_In_Document_Attachment.cs @@ -0,0 +1,212 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_IsCurrentVersion_Field_In_Document_Attachment : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsCurrentVersion", + table: "DocumentAttachments", + type: "tinyint(1)", + nullable: false, + defaultValue: false); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1227)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1217)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1308)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1293)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1300)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1289)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1275)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1391)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1284)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1388)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1384)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1305)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1297)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "IsCurrentVersion", + table: "DocumentAttachments"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7895)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7887)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7995)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7975)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7984)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7971)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7958)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8008)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7966)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8004)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8000)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7991)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7980)); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.Designer.cs new file mode 100644 index 0000000..3b02ecb --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.Designer.cs @@ -0,0 +1,5447 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable")] + partial class Modified_UpdatedAt_And_VerifiedAt_To_Nullable + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8981), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8988), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9028), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9034), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9038), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9042), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9046), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9051), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9055), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9059), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9063), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9068), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9072), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1U94Htf+1fs26iz6Uc+nyze85xsKznbPXcb1FczE1lvJpWVizl5sZ3KW8udukL1caVmMo2Ltm75rGdKMW9XeLnS3R/ITxW/O3n3q0i+THrYfPTFFvxMXvEz2vMdp8sxE+WYt8pTy9nf3d/jx7R/R1evuk6cBxXS2fZy6ujuc1yEa+xvZMExGXJr6tq0m+vS/mx/HjJNZy0yU7RNJYVZ3vIfahZ9X0Hp31DzfHn0/EjTF8/g8+dbd8ef8377pd/aL6Wr+I47kL/nx5Pt/bxz9z9tJjV9zJ4+ZO31V1j0frd/n5JnP2/a3ad/+n63D833lnoFZ9X0HoZzbN8fqa3OSWMTz/lcbu+HEv7SHAx38nB7t/td9mtO/7etPZ2LV9yr4s5O31V4pdMa3f5+Thcux2/a5rH3/APc4fne83dNLPq+g9r3Kc3x58fE6lYWJ6vwfquE3vHn9/wCr/RxL+0txte/k6Y2r/a78lSv+HRn/AAuxavuRetsnb6q8c+B1u/z8nRW1sdv2up8ff9v/AJXD9h7zvp7lPGs7StvjVpStPVldWMDJpKvmviXphwWxWlPHj5ea18/f+84WT2mMUx/S+lMtZ/4XK47fr9o0Y/a7y7Fqe4/5Gk9932gePzxMxPbB0BtYJiPTvHe3VWXvPfv69v1vpcOyPeauQSlWuN21WLUPP6GN3nNm7WlPn4pWseN2/Nfq+9T/AOPFt7SmeZny9N1iPo770T/g14djw+5I4itYjP415clvpmnS2THE/nRPNX7fty+dc95l5pXz8Lt110Pwevl0Jfz+NHH97734f3vHqn2k936Onsfb7u3H+LA5lPcmdNR/tnjHu2/Q9PWr3/W/BSf8P7b0bnvMHUStP0vt/wBNCv8A53JaT/0amPn/ADPCfaS5CflwGGP+6e//ALJyqe5P6Pjt5/Fzk7fb8vCeXv8Ar/V8/wCD9t6Vz3l3qpX/AAXQfjsP428nP/RgxeE+0jyn0cFr/r55+f61HJp7lLoOPxfitzNv0PFVr+t2nbt/hejc95Y6x18/D6I8Vh+D1bO7P+f/AHvT9/8Azfv+fXPtIcx9HC6sfn5Jn/8ATDlU9yr4cR+L8T+ft+h0cdf/AG0/9PpeKHvK/Wmlf0zopxKVPNflHYXY18fg81tS/n8fyVfn88hzP08Lqf8AhJj/ABS9lvcreGkx9Z4mdQ1n7c6eO0d/zviV/wAL3bfvLfVqn+F6F8Zl+H0bicf9OHL/AOX4avOPaR5aPnwetP7NMf8A6P8Ap9txr+5T8Ppj6zxS5us/R5uNpb9vtsVe9b95f6lU8fF6BaKX4fTyGsf9Otk849pLkvp4HBP/AHR//wA/+Rxb+5Q6Kn8R4s8rX9Fw8W//AG2PT997tv3mPndP8J286qX8XlcY/wCnS1eyPaT3vp6fxT+dtdv/AGMuLf3JvSs9/J4wb9ftebgJt/g5Kr3rfvM/KqePiduGHP8AD6eaW4fw+PPH5POPaU2o+fTtJ/7siP2v9T/9PuOLf3JfAz+I8Ztmv6Lpq9v/APbw5Fge843LXj80u1nIyqU/VfRupWLi+f4PXw+/6fw/f/hcjH7S0x/tnS9rfb8vJUr/AIdOz5G37kSl+/1F47Ytf7Xx+i8+ft+f5eosPf8Ae7/cc0wveduEXfFM3tM5HiePFKyt9WcDJpX5U8ypGPArdaU8+fFK1rXx99zKe0xpT/tnSmxX7sctjt+99Qf43Wtn3IHU2PvOr7QHDbHzmK38P9vDMevpE2nqy8T6fOe0fnOYYPvMXRe94+n9vPMcLz+q+HzTFy/H+TxO15cyntJ8Nb8X0/uU/O3a3/wakOu7XuTvErH3+pfGDpza+15+mc+v3/b6gydv+Vy/B95M7Zr3j6d0n59hefr+HnQy/T+H9TprXn+ann6/k5lPaN6an8XxW/T7fa8X/wDYw65te5d8bcff6l6/6S2vtefUvr9/X7vJZO3o5jg+8b9md70/TuK9TMLz+q+HqJ5Vafh8emxa8uXT2iOj57efV5Kn2+2Gbfv9o/wOu7XubfaRx9/qXn+idn7Xn5CNfv8An98uTs5hg+8Q9gV6sfp1zqzhUr49Xw+BZOX6fw+PGZZ8+P5PLmU9oPoK34ueVp+doWv/AILQ67te589rTH3+paeH+z2+Xn6sw6/f8+Z18nbv+d9LuDi3tz/Z3cq+H6OqW50HxPH/ANlPHo6P0ea//hK5GylSH4a+fq+++vq+N/h7tdu3KZtfv/bWv8Dt+f5sk9mO+e91v7YXA+fzdC8by3k/KHmJ5TzfoPg6dfN+t9LJfiftMewzmdLUNN3TdHfpd6tKW9dmcz0+Nsa1lTzTziSypTp+D+GlaOyaviT0Ludvg9UcP55+WO+5hrk9f+B5pn/3+jCnP+xN7VvTc5Lcl4E+I31PjiZvua3TfI59OIifX/VFcEUn7f53aWUvDOrXTLqJa+PwXnfGOV2fT6viaPb4mfH0+PV582bkvl4+fn8DtGny3GcjXzaO9q7dft4MtMkfvSwT1J0B1t0ff4XVPS3OcBk79vJynH7Gpbv37du2Wkevf07OwYyjL5xlGVPwxrSv+ir6HeJ+U93UZiY+cTH58TH+F/Q/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5WtI081rSlKfXWtaUp/PUfsRM/KJn871df836sdNOmuLHN5/znjPEMSUayjkb7bYuvtVjTz5rSd+5Gninita/vUrV8/d5XjeNr59/e1tSk+vmz5aY4/btMO29MdA9a9aZ51uk+lub6h2KzFZw8Tx+fcyRMz2iJripae8zPZiBzP2pXYHwf4sNn3P9KthlWPNL2v0XKtTtdhblGvj0TxbWXCcZV+9Gvzq6jueKHQel5oydTcXkvX0tjwbWHLkiftTWLxPdIjpv2FPaz6n+HbS8DuvdTBl7Tj2+V4HkNDUvE/11c+TXtWax9M/Jj1uvbq+zt0vr9XUzkG09Hn/6l41TZerx5/UfC2UfV58fLx9f8rr+fxx8PcHfvyWxl7f7jrfE7/ndsjL/ABnusvbC5Py9uieI0fN2/HPm/qPy9+34rz6U9u3f1/Ol1lne8N+z3x6yjh7Dq1m1jWtPNenWVjwlWlfH6GVdhc80r96vjxWnir5t/aB8P69/Jk5a/b/sfasT+v8AEn9t3bV90D7XmWKzsanh9rRaIn+rHBmtET6+tY1Kdpj6Y7+k94/P49T3ivsX+N6K6/qnSz//ABv7kr1Zf/6vXSv/AO395x/54Xofzdpx8p5f7L6ln/B37vsT7nb2pPh+aNvoScn+5/hgx9v/AO/ydv3nJMD3hj2euTWMcvZ9WcGU60p8+nOVetxrX/p3KbG3SMafP9F4/k+fy5OP2gfD+3aL5OWxzP8A2OtaP15+JH+B8Tb90F7XuCJtr6Xh/tVr6+nWODHeY/4NJ07zM/c7uztL7dH2du69Hp6obvWevx/9dccprfT5+/P4uyr6fH3/AD86fgfSw+OHh7m7duTz4u/+7a/w/wBvvk9HSeS91r7YXGebzdD8XveXv+NvMzu+bt/Y/D04833O3zZEcM9qH2D85pahqe6DpRiZd/00ta7c8r1Ot2Nysv8AmxxLmXO5WVPqrT71XYdLxO6D3u0YupuKpe3yx5trFiyT+dSbzP8A72HupPYZ9rHpf4lt/wADevtjXxd5ybnG8ByG7p0iP662xTXrWK/amWXvC+qHTrqNiVz+Cc045yzCpGkq5Wi2mLsLNI1rSlJfEsTlHxWtaU8+frrR23S5TjuRp8TQ3dbbp/ZYMtckft1lHjqXobrHo3YjU6r6a5np/ZmZrGDldDPqZZtHrMeXLSs9/RzulaV+dK0rT8NK0r/oc91aYmPnEx+f6P0fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvn9uZ+yG9XPnX/B6D7/AP8AaHWfV+BAPxu+yBy37B/AYm3P7rj8iB4ffo+W++280/sRrEQAAAAAAAAAAAAAAAAAAAH927ly1L1Wrk7cqfVK3OUJU/ljWlf879iZie8TMT9uJ7T+3DxvSl48t6VvWfnW9YtE/rTEw5BreYcs0961kavk2+196zONy1PE22dZrCca+YypSF+kfNK/hpWj349zbw2i2LZz47RMTE0y3r6x8p9Ldv23ydzp3gORxZMO/wAJxW3jy1mmSmxx+rli1bfOJm+KZ9e8/KYllz0x9o73s9IJ2I8H7h+oGuwLVY0nqb+zpl6zJhD9TaybNy3S7O3StKV8Rvwr5p59TtvGeInWnETX6h6g38dI7d8VsvnxWiPlFqzHeY/OtH56PfXHsa+zL4h1y26o8H+kdzayeaa8hi0fqfdw2t874cuO3w63nvMd7YrR2mfRs66I+8V92HCb2LidXOK8J6o6SxKFLlcHEy+N8iyLdPHrpe3ORnbrGrcl8/E6aylI18foK+GS+F9obqvStWnLaulymCvbv8Ol9bYtH3c1r5qzPz9fhoQeJ3udfALqbHn2PD7nup+heUzRby/VWxr81w2G09/L8PjcWrxuaK1+ms7szMR+Kj6N13bp7fzs16wzw9V1HubboXyPKrbhK3ynJsZ3GLNZeI1le5VPH0+Lb/RefMZYnyp4+dfLM/T3j10fy/kxcjOXg9i0xExtWrfWjv6d52prhrHr/wAD0VneMfulvaP8Oq7O/wBGV4/xT4bBFrVvwODLq85kiO8xGPga5eRz3nt29Y2PWe/aPRug4J1G4J1P0GJyrp5y3Q8y45nRpPD3PHtjj7LX5EZU80raycec7c/NPn8qsyaPI6PJ69Nrj9vBua+SO9M2vkrkx2+n0tWZifRWx1V0d1V0Py2xwPWHAcr05zOraa7HG8vp5dLbw2ie0xfDmrW1e0+nrDmjmutAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBdQuqPTvpPoMjlPUrmfHeE8dxKVrkbjkezxtZg2vEay8SyMmcIUrWlK1pStfn4cDkOU47ide21yW5r6WvT8Vm2MtcVI9O/rNpj6Ha+kOhusOv+Ww8D0V03zHU/MbExGHjuG0c+9tZO8xWJriw0taY7zHeYj0ai+tvt7OxTpX9MweK8k3XVveY9blMe1w3Et3+P5dbfmlPTyWzPOx7cbkqUpCX0WfmNfV48U8VxLzXjv0Pxfnpq7Gbls9e8Vrp0ide3b/AOc1nJWIn6PrZ+2sJ8MvdRe1P159T7XPcNxnh9xeXyTlydSbF8XL68X7T68Jkrq57zWJnzR9UV7Wjy9+/rGnzrb7yb1u5BPLx+hXSTifAMadZ2bGVzTIv81yq2/NY0yIfQKcXpZuTjT4kISjP4UpUjKtz0+ZYj5r2jeb2JvXg+J1OPrPeItu2tu37fLzR8P6l8s9vWI9e3ftMz27rEvDH3LvhhxFNfN4qeIPUHV2evlyZMHTOHF0zr+ftFpw3+q552ctKz9Za1Zp8SImYivmiI1WdVvas9+XV+eTa5H3Acs1epyqzrd49xm/XU6Snr80/QYtyWZfjSMa1hD/AH1XxGtafOvzYu5TxT665ebRsc/t4sVu/fX1p+Fh9f8Agz57fL0j675J49BewX7Kfh3XDfhvCTp/e38EVinL83ijkOTny9vxWesa+KfNMRa39IjvaIn0+TBre885rybMv5/IOV8h2+Zkzrcv3s7bZt+V2dfrlKMr3o81/ejSjo+fe3dm9r7G1sZr2nva2TLe3ef17dv3ko+L6V6a4TXxanEcDxHH6+CsUxYtXj9bFFKx8oia4/NPb6O9plxWc53JVlOUpyr9cpyrKVf4a1rWtf5auLMzPrM95+3L7ta1rEVrWK1j5RWIiI/OiO0Q/kfoAAAD+oXJ25UnbnO3Kn1ShKsZU/grGtK0/nImY9YntP24flq1vE1vWtqz862iLRP58T3iXLdB1A5xxbMx9hx3l3ItPmYs6XMe/g7fNsytTjXzSsYxveiviv3qxrT95y8G/u6t65Nfb2MN6T3rOPNevafzot2/edf5XpLpfnNbLp8x0/w/I62es1y4trj9XLF6z84m04/NHf7cWifus5OlftW+/TpHcx4ce7gOWbXV43p+HoeT367bSypGtPFLmNblh35fKlaf+M0+Uq/h807vxfin11xM1jX5/by4q9u2DZn4uGe3y71jyW+5+K+lF3rv2CfZS8QqZrcv4ScBob2fzefluDxRoclHm795rmvXZxVnv69/gT6xH5zab0P95L658fu4eP146T8Q6gYVuUbN/J4TdyOE5lbFP0Eb1yWfLlMb1+EfE7tYwt0vzpKtKW/VSkcocJ7RvOa80rzvFanIUjtFraU20r+Xv280/E+qotaI9Z9I809/SEE/E/3L3hby+PZy+FXX3UPSOzeLZMWHqfHi6n1oyz9dOKkakcFbHitbvXH3tecdfL3m/aZnc70G9uv2K9Y6YWByLmOb0h5BkVt28jE57bs6/SWL12tKRt2eRZFzDsZVPVWkfXTEtfOvj0sx8F449D8x5MexuX4nYt2i1N+K48FbT8orsWmlb/a7xSPX6IVteKvusfan8OZ2dvh+ndXxD4jDF74djpO+Xb5PLjpEzN8nDYa7ObBPaJntOxf09e7bjw7nPD+oWiwuT8H5LpuV8e2Nul3B3Gjz7Gw1+XalSlaXLGRYnO3chWlaeJRrWlfLLOnvafIYKbOjs4drXyR5qZsGSuTHaJ+mLVmYmFfPUfS/UXSHK7PB9UcLyPA8xp3nHt8bymrl1NvXvE9pplw5a1vS0T84mHKnKfBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q99X6jQf+4NX9f7/wDR4QD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAAAAAAAAAA+r6gd5dHu5brx0C3djkHSHqjy3hGyszty9ep2d6Nm7C3Wla2LuPerds1sXI0rbuQhGFZW5SjSUa180+3xHUnO8DnrscRye3pZKzE98WWYiYiYnyzWe8eWe3aYiI7x9LF3iL4K+FXizxmXiPEPobp/qfSy1vXy8ho47ZaWtExGXHmxxTJGWkz56Wta0VvETNZjvEyWOyX3iWlu1q+Ed5PHqzn6rGHa6ocPxrtKUjKsbNq5vNBell3L06zrS5m7OO0xrNuEp3vo1I26xrJDov2hO0YtLrDX7/AImkcnqVn6e0RObBPnmZ7+t8kZaxET38sRClb2m/c8ze+91P7OHMRWO2XZydC9RZqTMzHfJkpxfLY416Y6+XvTV0baObJa1a44zzN4mJPfSHrZ0s688Qwed9JObaHnPF8+EJWtnodhj59m1dlCkp4uTXHuXI2cqxWtbd+xKVZWrkZQl86JM8RzXF87p03uJ3cG9q5IiYy4MlckRMx61t5ZmItX5Wjv6TEwo88Q/DPrvwp6i2ulfEHpjluluc1LWi+jy2nm1MmTHFprXPhjNSk5dfLHa+LLERF6TW0eku031HRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEvdN7QrtX7QMLI+6/1J1WJyWGPS/icG1F/G2XMM6Ny3SdmdjSRyLeVXHn6oevIpCUbcZ0nWNafKvSuqPEDpbpGlvwX5LFTZivmro4bVybl4mO8TXDFov5Z7x9d2nt37+qTXgT7IXjv7RGzh/md9F72xwts3wc/VPI4s2l05q2rea5K5eTtitg+LTy37YZtWb2rNYtE+sRku7j3iXrLz6Wfxrtg4ridKuO3fi4suV727d3fLMqzTzSGdqp2I6azo7860jP4WRj7L4cJStVlKtfXSNXVntCcxvzfW6Z1acVrz3rO3nmc23aPovi8sYYwzPaJ7Wrk7RMx6z6xd17PvuefDfpOupzXjjz2x17zFIpnjgOLpTjOn8OSe021d+uWeSycpipE2r58ObS89oreIiPrWg7qn3Adaetu6v8AIeq3UvlnN9tkVnW7lbra373q9dfNafBt1tWPH3qUrbrXx9+vzYI5TnuZ5rNbY5XktvdzW7+a+bLM9+/z9I7V7frLYOhPCXw18MuNxcR0F0V0/wBL8fhisY9fjNDFj8vljtE/Ev8AEy9/tz53T75DIgAAAAAAAAAAAABStaVpWla0rSvmlafKtK0+qtK/erQPn82QfRXur7he3jcWt30f6rct4ZlwuQncta/Z3pYeTCHj9IyMa9W5CVidKemcLfw61j8qSo+/wvVPUHT2aM/Ecrt6V4mJmMeW3ktEf1tq27x2nt2mI7fnsReJngN4Q+MHHX4zxF6C6f6l17VtWl9zRxxsYbW7/wBNxZ8cUvGWsz3ra/niJ+cSkC9qHvHHO+O0weO91fAcPmWBT4WNXm3CZXdNs8OxCtI1y9hqMmO7nusqVuP6ZSxl6+ly7KU6UjTxGmfelfaJ3tfya/VOhTcx+lfq3SmcOWlY/r8mG3xpzW7R6+W2PvMzPp8lSHj57mvpXmJ2uY8Berdnpvbnz5o6Z6nrj5LS2ctomfqfT5HBbjK8bgi8/WTl19yaUiKzNpjzTJI7Ye/ftd7vMCF/ov1L1W33NMeOTl8Q2N7H1/Ltfbl6aVlnaOuReyrEYynGFZT8U8yj8qeqiRnTPXnTHVuOLcNyWLLm8vmvqZJrj28cekd8mDzWtWImYjvP24Uw+OPsn+Ofs87dsXiV0Vv8fxs5rYdfqLSx5tzp3cvHm7V1eVjDjwZbTWs2ite/pFp7zEd2ZDuCOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdXv4mg8f/cDV/0oB+N32QOW/YP4DE26Pdc/kP8Aw8/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAAAAAAAAAAAADI3t27sevPaxzDC5n0Y59t+MZ+NdtyyddTIv3tLtseE6SuYOz19L1qN/EyI0rbvQtXLFyUJSpG7GtfNOxdPdVc70vt03OG382resxNscWtODLWJ7zTLj7xE0t8rRWazMT82G/GLwC8KvHfp3Z6a8Suk+P5zUzY71wbk4cWPk9DLas1ptaO58O9sWxhntfFbJTLStqxM0mPRMv9nh7bno73SfmF0y6zVwOlPWi/GxgY9zNzrVri3M9hOkYwrpr2RGxXX5uVcr8KzqJ39hfncpSUcivxaQjMPw+8auI6n+BxnMzj4vmbRXHWb3iNXcyT6R8G1or8O9p9K4ptktM+vm9Yhre+2B7sbxG8CvwU638N/qvr7w1xWy7eamtqZMnPdNalZm1o5LHhtljb1cGOPiZOQri1MVaTMTij4czO9uMoyjSUa0lGVKVjKlaVpWlfnStK0+VaVp9VWc/n8lV0xNZmtomJiZiYn0mJie0xMfRMT6S/R+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQO6zvo7b+zfj/5sdaee6/UbTJxrl/TcRw71jK5VvKwjWsaa7UfGt5N61WfiNy/CM42o+qdYypGtK9R6p646c6P1/jczv48WW1Zth1KWrbaz9v8Ac8Pmi1o7+k2iJ8sevaUiPAX2W/Gb2j+X/A7w06V2+Q0cOamLkuodnHlwcDxcWmPNO5yHw7YceSK95pitas5LdqRaJtEolnez7fLr/wBcMnZ8S7eLd7oj07u0u4ktlYyZ53ONtYpStmt+u2jDAxtfi51v1Xbmvlq792zS5G19LlW3Wc4o9aePHP8AN2y6nT8TwnHT3p8WtvPvZax6Tb4valcdMkd5nHOKZrExXzT2mZ2AfZl9074SeF+HR6g8X8mPxP6xx/D2I0suCur0vx+XvGSMUcfa+3m28+rfy0ptxvYseSaTk+BWLxWuhTkHJN/yrZ5W55LudlvNrm372TlZ+zy72Xk3r+RcldvXJXL05VpW5cnKVaR9MaVr4pSlKUpTBOxs59rLfNs5smfLe02vky3te1rWnvaZm0z859fT0WucTw3E8Do4ON4XjtPi9DVxY8GDU0dfHr4ceLFSMeOkUx1rExWlYrE2729PWZnvL4j0vpgAAAAAAAAAAAAAAAAAOR8W5fynhG5wuQ8Q3+145u9dkW8rC2WpzL2Hk4+Rar5t3IytSpSVY1+dKTjKP4aVcjV29rSzU2NTPl182O0XpkxXmlq2j5T3ifXt93u+NzvT3B9T8btcP1DxOhzPGbuG+Da0uQ18exgzYskdr0tW8TMRaPSZrNZ+1KQt2N+8BdYOlWVrOFd02Nf6s8GpSxhWuYY8543NdLajWMfpmfdnHOs721at0lCmJZxdbPxWE/pFfh1jKQHRHj3y/FWx6XVFbcto9q0rt1nybuGPpvkmYvXPER6RStcX0T5vT1qF9qH3SXh117g3upvAnPi8P+qe+XZv05mrXP0zyd581vqbUx1nVycVkveYvOxlz7tfS1fhfXxNZa/bn3V9Cu6zh1rm3RHnmp5frKQs12GHjZOP+bGjv34euOHu9dbvXruuzI+JRnYvVpOMoTpWnySv6d6p4PqnTjd4Tew7eLtX4lK2r8bBa0d/JmxxaZx3j1ia29YmJa/XjJ4DeKfgJ1HfpjxP6V5Dp7em2T6j2c2HN+B3KYsVvLbZ4zdvix49zWnvWa5cceWYtWfphkQ7Cw+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V7+JoP/AHBq/wCf/vRAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsYuVk4OTZzMPIvYuVjXIXsfIx7k7V6zdtypKFy3chWM4TjKlKxlGtK0rR5UvbHat6Wml6zFq2rMxasx8piY9YmHqz4MG1hy6+zix58GalseXDmpXJjyY7xNbUvS0TW1bRMxMTExMJK/stvbgci6WZem6Jd2+9zOSdO7tcbU8X6jZU5T2/EfVKFnEs767crO3m6SzXxYlfpXBrgY06ZN25kRxpxuSQ8MPGzY4u+HherM99njp8uLW5G0zObUmZitIzzPeMmCvpWZ/pfw6z55m3lmJpW9ur3YPD9ea/JeJ3s+cXrcL1jj+PyPO9G4KxTjuovLW2TYycVSkVvq8pkjvljF22o281fgY6YpzVmkxzjHJ9BzPQanlPFtthbzj+9wcfZanba6/bycLPwcq3G7YyMe/alKFy3chKkoyjWtK/eql/rbODc18O1q5aZ9fPjrlw5cdotTJS0d62raPSYmPpa5XN8Jy3TfLchwXO6GzxfL8VtZtLkOP3MV8GzqbWC848uHNiyRW9L0tWYmLREvuve+UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9DabTXaTW5242+bja7V6zFv52wz8y7Cxi4eJjW5XcjJyL060has2bcZTuTlWkYxjWta0pR68uXHgx3zZr1x4sVbXyZLzFaUpWO9rWtPpERHrMz8nL0dHc5Pd1eO4/Wzbu9u58Wrqamvjtlz7OxmvGPFhw46xNr5Ml7RWlaxMzMxEIw/tF/b56LhU910n7N7uu5NyS1LI1246sZUvpmg1l2Hqs37XGsbFuWqZ+VbuUrW1tI7H4NmcKxriXK180jP4h+PGDSnNxXR849nZjzY83LWnz4MUx6WjWrWYjJaJ+WWMnlrMdppPdeB7HPuneU6mpxvX/tHU3OE4XJGHc47oDBH1Ny27S3lyYsnN5s9Mk6mC9O0ZNCdP4uSt4mNikR3mJd1K6qdQusPK9nzbqXy3c8x5PuMm5lZ213OXcyb9y7dlWUvRGVaW7UKefTGNuEaUjSlK+frRS5LlOQ5fay7vJbebc2c1pvky5rzaZmftRPpEfRHaPk2AOiuhOkPDrgdHpjonp/jenOD47DTX1NDjdemDFTHSIiPNaIm+S09u82va095mY7Ov3AdtAAAAAAAAAAAAAAAAAAAAAAd29Ce4rrF22c213PujvNtvxDf6+7GdZYWRcphZ1mk4zuYmwxKThbyMW/6KRuwpW3OUfNI3I+a1fa4PqHmOnN3Hv8Pu5tTYxzE96WnyXr37zTJTvEWpbt2tHpMx8phjLxT8HfDnxo6Z3OkvEbpnj+ouI3KWr5dnDSdnVyTWa02NTYmtrYc+LzTOO0xekT281LR6Jn/s1/bY9Ne6WOm6UddZ6rpv1wu2rOLgZc8qGLxfnWXGNI3I6imVWk9fsp+K3reqll7G9etRyLtLsY2JUlMjw48aON6o+DxXOTi47m5iK47zaKa29aI7T8LzzE48k/ioxefJa0eaYmIhrZe2l7szrTwKnkuvvCyu/wBZ+GFL5M+3r1wWz850tr2tM0nkbYImm3pV9Mdt+uvp48eScWOcczliY32fX9TOyqEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur378NB4/f/4A1dP9NPH8iAfjd9kDlv2D+AxNuj3XP5D/AMPf0XL/AH332oFiNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfV9QN0vswPa39Q+y/ket6f8AUfL2PN+3/aZkbGbpb+RdubLh/wBKn4ntdBfnS/GljGuy+lZOBPHnXIt1yLVvIx63ITt5l8MvFjkOjdnHx/I2ybvAZbxW+G1pnLp+afXLr2nzR5azPmtjmszaPNWLV7xMVq+3H7vro/2lOG3erejdfT6Y8XNHXnLq8liw46aXUcYK966HLYqfCmcubHHwMO3XNWMNvhZL4s3ktW867pR1W4H1t4DxvqZ015Bg8m4dyrX29jqdrgXrV61ctyrK3esXa2p3I28rEyLd7Ey7FZVlYyrF6zL9FCqcXFcro81oa3J8bsU2dPaxxkxZcdotEx8prPaZiL0tE1vXv3raJrPrEtWLr7oLqrwy6s5ronrTiNrhOo+B3L6fIaG3iviyUvWIvjy44vWs319jDfHn18sViuXBkx5K/W2h2K+i6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6c67de+lnbf073PU/q7yrW8U4rprM5yyc/Js2LuflUjWtnXa63duW/pWfky8RsY8K1nOvnxSvjw+PznPcX05x+bk+W2serq4azM2yWiJyW+jHjiZjzZLT6VrHrLI3hX4Udd+M/WHG9DeHvA7nP89yWSta4NXDky49TB37ZNzcvjpf6n1MMd7ZM148tfpn1QcfaT+2G6td42823BOmmbtOm/QGxfli4ugxMm7b3PL7GPP0w2PJcuEcenwcy7CmdY1trFszwYysYt3Kyq2J3bsJfEfxe5bq/Pl0eNvl47ga28tcFLzGbbrWfTJs3iK/W3mPPXFFYmn1tZvfyzM7Q3sXe7r8P/AGcuL4/qrrXW0etPFnLirnz8tsYMd+N6dy5q97afC4LTm/pmvS06uXdvmyV2rVyZ8eDBGWtMelmtayrWUq1rKta1rWta1rWta+a1rWvzrWtfnWtfnWrDPz+ayuIiIiIiIiIiIiI7RER6RERHpERHyh+D9AAAAAAAAAAAAAAAAAAAAAAAAe1g52ZrMzG2Gvyr+FnYd63kYuXjXZ2b+PftSpO3dtXYVpKE4SpStK0r/meVL3x3rkx2tS9Ji1b1mYtW0fKYmPWJh6NrV1t3Xzam3gxbOrs474c+vnpXJizYrxNb48lLRNbVtE9piYSmfZS+29yOOfmD2+93u9u5unnXE0/Buq2bd8XdVGPpx8TT8ru3pSt3cT4fotYez+LhxxqWbWLcs5FzIjcjKDws8a7a3wOA6uzzfDPkw6PK3mInFEdq0w7c2ntNO3pTL3p5e0VtFptFoon9vX3YeHmfwV8XPZ44rHrclH1TyPVXQOtjicfIWt5suxyPAUxxW9Nib98mzo/D2LZpyZM9MmGmKaWlz6zZ6/da7B2+pzcbY6vZ4ljO1+fh3Y38XMw8q1G9jZOPehWsLtm/anC5buRrWM4SpKla0qlliy482OmbDeuTFlpW+PJSYtW9LR3rasx6TW0TExMfOGvhvaW3xu5tcfyGtm097R2MuruamxS2LPrbOC9sebBmx2iLY8uLJW1L0tETW0TEx3h7z2OKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5vbl+f74d1d/iaDx/B+YGs/p8oB+N32QOW/YP4DE26Pdc/kP/AA9/Rcv3/uvv/wCJqAYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANufsufag847GuoGNx3k+Rm8m6C8q2Fq1yvjE79yV3RXMj0WP7otDKXxYY+Rh1jav5WPWxchm4tq/jxlj3L/ANIhlnwx8Td7ojfrr7Nr7PA7WSI29abTNsE27V+qME+sVtTtE3r5Zi9YtWJra3mivj26PYb6X9qPpLNzHCYtbg/FfgdS+TgOcphpFOVx4fNl/AblYjyXy4dmJyY9fNGWk62fJizWrmpinDefH0r6pcG60cC431L6cb/B5Lw/leutbLUbXX37d+zct3PMLti5K1OcbeViZELuJl2KyrKxk2btqX6KFU7+L5TR5nQ1uS47PTZ1NrHGTFlx2i0TE/Os9pmIvS0TS9e/1tqzWfWJannXfQvVPhr1ZzXRPWfE7XCdRcBuZNLkNDbxXxZKXp2tTLSMlazfBsYrY8+vliIrlwZMeSv1todhPoOogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMRu8bvR6MdlPTDN6idWN7Yx8m/bu4/FOLWci1Hd8s3Pw7k7Gt1eNOsrtytaWrt7Iu27N/6Pi2L+RK3KFqVHUusOsuG6L4y/IcrnrW1omupq1tHx9vN2ny48VZ7zPym1pitvLWtrTHaEg/Zz9mvxJ9pjrjW6O6A4rLmw4r483P8AO5cOS3F9P8d56Vy7u/mr5cdPW9MeHHfJi+Nny4sUXrbJVAK75u/vrR3zdSc7lfPtrc1vEMHLybfC+Ba+9ehpuPailycMO3ctyuyjmbKeNSE9hm1hat5OZO/ftYuNCcLNuBnW/XnM9b8lk29/LOPUpe0aWhjtaMOvh7zFImO8+fLNe05L9oi15mYrWO1Y2z/Zc9k3w19lzovV4DpPQpudRbWvhv1N1Xt48duS5jkPJW2xel4pE62lXN5q6erFsl8OtXFiyZ89qTktgq6OlMAAAAAAAAAAAAAAAAAAAAAAAAAAA/YylGVJRrWMo1pKMo1rSUZUr5pWlafOlaV+dK0+dK/Oh8vk/JiJiYmImJiYmJjvExPpMTE+kxMekxPzSTvY4e15y+i+y0vbT3GbzIzume4y7Gt4HzHYZMpXeG5+RdpDH1mxvX5ShPT5NZ1sWJ1lj/AuRxbVZXKy/RSO8H/Fu/DZMPTfUWe2Tjc1649HcyWmZ08lp7VxZJt3icNu/aJmazWYrHefppd9437vTX8StLkvGvwb4vDq9bcdr5d3qvpzTwRFOpNTDjm2be08eKK2ryOGKRly1iuX4tJz5O1IjtE0HEysbOxcfNw79rJxMuzbyMbIszpcs37F6FLlq7anGtYzt3ISpKMqVrStK0rRMil65K1vS0WpesWras94tW0d4mJ+mJie8S1sNjBm1c+bW2cV8Gxr5L4c2HLWaZMWXHaa3x3rPaa3paJras+sTExL2Hk9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvm9uXTx7Q7q7+/DQV/9Qaun9CAfjd9kDlv2D+AxNuj3XP5D/w9+5blvvvvz/jagGI1iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADb77LP2oXNux/qDh8W5ZmZnIugXLNnYs8p49ev3JXOO3cqtvHpyTSTlW5bsXcGVLWRm48rM4ZeJayLEJY929TIt5c8L/E7d6J36au3e+xwO1lrG1rzae+vN+1fqnDM94rNPS16+WfPSLViazaLRXj7dnsNdMe0/0hs89wGvr8N4s8BpZcvA8xjw0inM48HmzTwvKVr8O+am1E5MWtm+LW2vsXw5bVzUxzhvPq6f8+4l1R4ZxzqBwXc4nIOKcq1eNt9LtcK7C9YycTKhSdKVlblOMb1mXqsZFr1VrZv27lqVfVCqeGhv6nKaevv6OamfV2sVc2HLSYmtqWjv84mY81Z71tHf620TWfWGpx1d0n1B0L1JzPSXVPG7HE8/wO9n4/k9DZx3x5cOxgtNZmIvWtrYslfLlw5PLEZMV6ZK+locxcx1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABif3jd4PSnsu6Qbfqn1P2tmxKMLmFxXj0L9u3tOVchnauXMTUay1P1Tu3Kxt3cnIlbtXq2MPGyciVusLUvHVesOr+K6N4jLynJ5Yj0mmrrxaIy7WxMTNcWKJ7zM9om1u0TNaVtbt2iWffZz9nbr32lPETjuhOh9DJlibU2ue5e2K99HgeHrkpTY5DeyV7Vx0i16YMMXvjjLs5sOKLRbJXvXo95neV1Z71urm36m9TNpc+h0ycrH4hxbHuXaari2gpdrHA1+NancnG5lxxYWaZ+ZSkKZeX8e/bs41u7THhX71j1hy3WfLZuS5LLPk81q6mrWZ+Fq68T2x46xMz3v5Ij4l/TzX81orWJ8sbfHs3ezh0B7M/h7x/RHROjX6onDgzdQ87mpSeQ53lvhxO1t58laVmmvOe2T6k1u9vqfX+FivkzXx/FtiK6mkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/qE525wuW5ShOEozhONaxlCca0lGUZU8VpKNaUrStPnStKVoRMxMTEzExPeJj0mJj5TE/RMPy1a3raloi1bRNbVtETW1bR2mJifSYmJmJifSY9Eun2HHtULm9hpuz/r/wAi+PuLdm3g9HeWbPK9N7Mx8O3WkOHZ079a/Sb9jCj6tXehctytYetuWZ2b8p/GhLPwS8UZzxh6R5/Y82aKxTiNvLbta9aR6aeSZ/FWrT1xTExMUxTE1tM92vf70P2EKcXbkfaJ8JOH+Fx18l9rxG6f0cEzj1s2xfvbqTVriiPg4suzMV38dqXjJs7lMlMuKtfh2lWpSqGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfxdB9/wD/ABf1f838H8v30A/G77IHLfsH8BibdHuufyH/AIe/ouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEmP2BntCdj0/6gU7SeqXILt/g/NpZFzplk7HIrS3xvk0YTzb2qjkXpVtw120jZyY42L4hcnts6HouypKNlJPwH8QMmhv8A4U+Uz2tpbs2njLZLemts9pvbF5rT2jHl7WitfSZy5I7T6xWaTvexeyHp9W9Iz7QPQvE0xdU9MRhp1vg08Pe/NcJNq62PfnFjiL23NG2XDOfP3tSuhqzFscTWcsTNUxWtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6m649aeCdvfS3l/VzqPtsfT8U4dqruyz8i/et2K37nrt4+Hg48rtaRrk52bfx8SxGlJVrdvx8QlX9DX5PN8zo9P8AF7fLcjlrh1dPFOTJa0xHmnvFaUr3+dr3tWlY9Z7z8p+Tv/hf4a9VeL3XXTvh70Zx+bkef6k36aWphxY75YxU8t8uxtZa0jvGHV1sWbYyz3iPJit3tWPWK7f2g/fd1C76utO05xyHJyNfwbT5OVr+nfD4XbtMLSaG1clZxb9y1KXpns8+xCOXsL1YQrXKyMikLduEvRSvjr/rnkOuOay72xa2PRw2tj4/TiZ8mDBEzFbTE/PLkrEXyW7R9da3aIj0jcK9kT2VukPZZ8NNDpfh8OLb6p5HBg2+sOorUpOzyfK3pGTPipkrHeujqZbW19TH5rdsGLF5r3tHnnAh0RK8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9fQb7bcX3eq5Foc7I1m50udjbLWZ+LclayMTMxLsbti9auQrGUZRnGnnxWnmlaxr8q1e3Bny6ufFsYL2x5sOSuTFkrMxal6T3rMTH2pj9f5Pn8txXH85xm/w/K6uHd43k9XNpb2pnpXJh2NbYpOPLjvS0TExatp+cek9pj1iFgZ7Ib2guH3rdBsXU8v2WPTrZ01xMPT82w53Y0yt5iWIUxcPlNq1KVbl2mfC1av7K7GlbdjMzbdmtaVlSlZ8+EvX9OtOCpi28lfwa42lMO7SZjz56VjyU2ojv3n4kRFskx6VveI7+rUg94Z7I2z7M3itn3+ndLNPhl1rsbPI9MbNaTODi9jLec+xwOS8R5Mf1JbJfFpUt2vl1ta2SImKy26stK9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfxdB5/J/V/0fw/0IB+N32QOW/YP4DE26Pdc/kP/AA9/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTcL5ZueB8u4zzXj2TLD3nE99qORanIhWVK2thps/H2OJKXolCVYfHx4UuRpKPrh6o1rSlXJ0tvNo7etu69ppn1M+HYxWjv6ZMOSuSnymPTzVjvHf1h8XqTgOO6q6e5zpnl8Ndji+f4nkOH5DDaKzGTU5LUy6exEeaLRFvhZreW0xPlt2nt6LMbsn7jNF3UdtHSvrFpsqN/I33GsPF5Dbrdjcv2OS6ektPvvjRjSlbVMnaYGXlWLc6eqmPetVrKfn1ysm6L6iwdUdN8Xy+G3mtn1qU2ImYm1dnDHws/mj5x5stLWrE+vltHz+bSb9prwb5XwI8bOvPDrksE4sPFc1sZ+IvFLUxZeF5Hy8jxXw7TMxknDo7evgy3rPac2O/pX8TGVjtLAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD1szMxdfiZWfm37WLhYONfzMvJvTpbs4+LjWpXsi/duSrSMLVm1Cdy5OVaUjCNZVr4o8b3rjpfJe0UpStr3tae1a1rE2taZ+iIiJmZ+iIe7W18+5sYNTVxXz7O1mxa+vgxVm+TNnz3rixYsdI7za+TJatKViJmbTER6ygke2p9pDkd1vVi90a6YbnJj0R6X7XJwbk8e/KOPzDlmB8bA2O2uUtypbvYOHkzz8TX183LeTjxsZca08xog14zeI1uquVtw/GZrRwvGZbY5mtpiu5tU82PJlmI9JpS05KU+cWrFbxLak92j7GWLwE6BxeJHXHHYZ8TuudDBtUrlx1tl6d6f2/h7enx9JtE3x7Wzhrq7G3H1l8OW2XXtE9plonYOWnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMu+yHuu5p2ddwXC+rnFc6/b1+Jn2ddy/UUuzjh73i+ZetR2GFmW4ypS5CzKFnOt/8742Hap58VrSvbeiuqtzpDn9PltXJaMdckY9vD3mKZ9a8x8Sl4+mK9q3j/hUhHv2nfAPpr2jPCPqXw95/VxX29jVybnTvITSs7HFc5rY7zqbOteYmaWyRbJq5Po+FsZJ7d+0xZM9JuqPEetPTnh/VHguxtbPi3NdFrd/qcm3OE5Rx9liWcuGPkUhWtLeXjxvRtZNmviVq7GUJUpWixrieU1OZ47U5PRyRl1d3Bjz4rRPeYrkpW8Vt9q9YtEWj6J7w0vOv+huoPDXrLqLoXqnTvo870zyu7xPIYb1tWs5tLYya9suGbRE3wZpxzfDkj62+Oa2iZiXYj6LpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdXv4ug+z+rQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAShPdzO7enGufc17UuVbSkddzm3kcs6f2r92tZf3Ra3Ct3NrrMaEpUjDH/MfXZ2wlGEayrflOVa+K1Sa9njqyNbf3eldrL2x70TtcfFp9fqjHSJy4qxM+lfg48mT0j8VMzKjf3yHs+zzfSfTXj3wOjNtzpa+Hp/q7Jhx9o/Afd2b00N3NNa97ZvwR3NXUi1p7Riisdu8R3mKJfNc8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHa9u57RHK6BdPLfbL0t28MbqZ1N1vq5hssS95zOLcNvw+NKzbrbnGWJstx4w7cfjer4upzsiULXmULsY9+OfiFbgePjpri80V5Lk8f+rMtLfX6unMeaax2/EZc31kes+uK9pivymLhvdW+x7g8WesL+N3XfH3zdEdEbs16c0tjH21ue6kxWnFGW8XiY2NLje+zefh9vJyGthi1/rZpaEdOUpylOcpTnOVZTnOtZSlKVa1lKUq1rWUpVrWta1rWta1rWtfKFczMzMzPeZ9ZmfnM/bls41rWta1rWK1rEVrWsRFa1iO0VrEdoiIiIiIiO0R6Q/kfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACV77vB3xfRsve9nPUDdebeZW/yTpNPNyPTSGTS/wDE3PG8Wl2Va38nNlmXdlYtWpQraxtddpS1ONKzhKj2fetvJbP0fv5vS/m2eJ89vlbzd82vTzT9da83nJWK9u1ccx2n5qDvfBey/wDHwcV7RvSXGdsmtGHhfECurhifNhnF5ON5rPOOIjFh1o16aWW94t8TPuY5+JWZitpbaWDX4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q9/F0H2f1aAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1eh/VfkPQ/q1wDqrxjLv4e24TyjUbyMse5W3PJw8PNs3Njr5Sj8/g7HApkYN+nivqtX508fN9ThOV2OE5bQ5XWvamXS2sOePLPabUpeJyY+/wBrJj81Lfbi0uh+J/QXEeJ/h/1b0Fzmvi2OP6n4LkeLtGakXph2NjWyU09uKz6fE09qcO1in6MmKsrODt+6w8e6+9GOnXV7jGXYzNVzfjGt29bmNKM7VjZSsRs7jBjKMpUrXX7a1mYU/NaVpKxWkqRr5pSyzgOX1+e4fj+W1b1vi3dbHl71mJiuSaxGbH6TP+15YvSfu1aRPi54dcv4T+JPWXh5zmvl1t/pfnN3jvJmrNcmXTrlnJx21MTEem3oZNbar2jtNcsdpmO0u432GOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQvc5154t2z9C+o3Wnl2VZxtZwnj2Tn2Ld6cYUzNrfnawNPhR9Vaer6VtcvDszpHzKluc5UpXw+F1Nzur01wfI8zt3rXFpa9slYtMR58tprjw09f7LLekT9yZn6GV/BDwp53xs8UujfDTp7Blzb3U3L4dTLfFWbTraGKuTb5LamYiYr8DQ19nJXv2ib1rX6VaT3Cdc+bdyHV/nHWHn2xyM/fcx3mdsaQv3pXo6zWzv3PzK02NWtfFMXUa+mNr8fxSnmzjQrLzXzVW71Bzm71Fy+9y+/ktkz7me+Ttae8Ysc2n4WGv/BxY/Ljr9uKxM+rdX8IfC3pnwZ8O+l/DnpPTw6nE9OcXq6c2xY4xzvbtcVPq/ks0R88/I7nxtzN3me2TNaI9Ozpd8ZkoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2X0c6ock6L9UOD9UeJZ9/W77hfIcDdYeTjzlC56bFz0ZdnzGtPMcnDuZGPKlfNPTdr8q/U+lw/J7HDcnpcnqXtjz6WxjzUtWZie1Z7Xr6fRak2rP57pXiN0PwviT0N1R0N1BqYt3iepeI2+M2cGasWp3y082vk7T9OHZphzV+Xrjj1hZndrnXvjnc10I6cdaeM37FzD5nxzXZ+fj49yNyGs3lcSxXdaico1r+m6zPnexLtK+mUZ2q0lGNaVpSyfpjntbqXguO5nWtWabmvjyZK1mJjFn8lfjYZmJn1xZJmk/T3j5R8mkt46eFHM+CXir1n4ac5iy02OmuZ3NTUzZqTS29xcbGWON5GtbR/te9qVx7GOY71mt4mtpj1d/vvsSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+b25fj++HdXvH/Q0Hn+H8wNX9X8nj+XygH43fZA5b9g/gMTbo91z+Q/8AD39Fy/b+6+//AI2oBiNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl++7k928t3xfnfajy3a0nncZuXOX9O7eTe9P/AuXcs12mlw4XJSrfvx2F7Z7e5S3Wnox6yrW36Y1mlv7O/Vk5tbe6V28ve+tM7fHxae39JvMTlw0ifxVoyWy5Z7T6V+jtHdrw++S9n2OM53pbx86f0Jrq83SnTvWN8GPzT+CeCmSNDk9m1YiMWK2nj0uPrN4nzZYrEX7zFUptKFRKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhre8Od61ebdQ+P9p3Bdz6+OcAljcg6iTwr/rsbHk2bgSu6/Wznal8OePg4Wyp9Kx5xnO3ssSlayhW36EPPaC6z+reQ1+lNHN31tDy7HITS3euTZvj82PH3ie01pTJ9fWe8xkpHrHbs2Pvc/8As0R0z0fy/j91Txvl5nq2M/EdH12cXly6fB623GPb3a0yV89M21taUzr5qzWt9LYmIraLxZGQRqXdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYXu4vdrK1kc/7TOU7Pzau2bnOunsMq96Ldj4eZCzvdRi0uSrS7k5+Vt458bVv0ypZw7taQlGFZRlT7O3Vfltv9KbWT0mJ3uPi1u0V7XiM+Knf52vfL8SIiY9K29J+agv3yvs/Rkw9Je0BwWj2yUy06W6wtgx+a+bz618vFchnmlYnHh1MHHzqWyX71nJsUjzRNoi0tZK9r9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1e/i6Dz+T+r/AKP4f6EA/G77IHLfsH8BibdHuufyH/h7+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZO9nPcLvu1zuO6XdZdHmXMSPGeTYMd5SEp0jkcZ2Vz8zOR2JRjKNJTnpMzPpZrKkqQvVhP0S9Ppr2bo/qDP0x1FxfMYLzWNbZpGftMx5tbLPwtmPT6Zw3yeXv8AKe09pYQ9ozwg4nx08GuuvDfldemxbm+E2p4ubRXvh5zSp9W8Nli0xM1rXk9fVnJFZibY4tXzR37xZm8B5rpOo/CeKc845kW8nScv4/qeRa27buRu0pi7fBsZ1q1OcKUjW7ZjfpavUpSnpuwnGtKVp4pZPobuHkdLU39e0Wwbevi2McxMW+ty0reImY+mvm7W+1MS0l+rOmuT6N6n5/pTmcN8HKdO8vyHD7uO9LY5+qOP2surkvWlu8xTJOL4mPvM96WrMTMT3cuct14AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiT3wdzfG+0rts6k9YN7mWrOfqdFk4XFcKt6FvK2fJ9n6NfqrWFbl5lkXMPIyo7LItW41n9Ew78/MIxlOPU+tupdbpTpzkeXz3rXJiwWpq0mYi2TZy9seKKR87TS14yWiPXy0n5R6xIH2YPBHmfaB8aOi/Dri9fJk1N/lMOzz2zGO18Gjwel5tvfybN47Vw12MWC2lhyXmK/VGxirEWmYpatL59zfkPUnmvKufcrzbmx5HzDf7bke4y7kpy+Jn7nPyNhlfDpOU5QsxvZE42bfrlS3apGFK1pGit7f3djkd3a39q85Njc2MuzmvPf1yZslsl+3fv2rFrT2j6I7Q3V+k+mOI6L6Z4HpPgNamnw3TvE8fw3G69K1jyanG6mLTwefyVrW2S2PDW2W/lib5JtaY7y4i4jsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIvtL64bvtz7ielHV/RZUsXI4jyzX5OVX4lbdq7rcys9dsYZHiUaStQw8y9e9Mq+n124Sr+pdh6U5vP071DxXL4LTW2pt47X9e0Tiv3x5It9ExFLzPafTvEMO+P/AIX8Z4yeD3X3h3yuCufD1DwG3hwR5Ivem7rxXc0rYu8TNb22dfHj7xHfy3tEfNZx8G5jpOofDOK8843kxzOP8x4/qeS6TKhKko5Gr3OFZz8G9GUflKlzHv25UrT5V8+afJZbo7mHkNPV3te0X19zXxbOG0T3i2LNSMlJ7x6T3raJaQ/VHTnJ9IdSc90rzWGdbl+nOX5DheT17RMWw73G7WXU2sUxPrE0zYr1mJ9Y7erlTlPggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1e/i6D7P6tAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE3j3e/u7udXegG87euUbGmRy7oreu39FG9e+JmZvCNpmRyYZV71S9Xpw9ttbmtsUjGkY2Me3H64pq+AHVs8twOfp/ayebb4W02wRM9730st/NF7d5me1MuScdflHlrDWJ97v7PVPD3xa4vxf4PT+D094mY6YeUnHj8mtrdUaOtbDfXx+WPL32OP0abuWZmbWzZrz8pSIEg1PoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEL7wF3p2us/XPV9u3CN1HM4H0buUvcilhZHxcPac8v4c7eT5lal8L16SzsM7T5WPP4koZePKsq25wrbpCnx86yjmecxdPaWbzaPDz32PJbvTLvWpMWnvHp3wxkyYb1nvMXrPftMdmzx7pL2ar+G3hbv+MXU/Gzr9V+JFJx8PXZw/D2NHpTFsVvgjy5K+fy8nk1NXksGavki2vliKxatvNMeFH1cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfV9QJ6vsEe5G/1u7NMfg+6zvpvKOiO3hxHMlK5WU4aHLplz4rYpblWU4RxdPr7dn1VlWM6+KxjCniKdfgR1Hbm+jq6OfJ8Ta4TLGpeZn1jXv551K9v+DhxxX7v3GqR71/wYxeGPtIZuqeM1fqXg/E/j7dRa1Yp2rbldedenPZZvEVrac/I7d8naKxNYntabT6t4bNqr4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur38TQef/ALgav+b5fw/h+/4pAPxu+yBy37B/AYm3R7rn8h/4e/ouX++++1AsRrEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGfXs1O6fZ9pXdp0z6hQyp2+MbTc43FOaYdbtbWJlaHkMpaieTmfOlK2tPezobePqrSlLmHGtZUpTzTvnhv1Rk6T6s43kItMa2XNXU3Kd+1LYNjvim1/o7YbXjNHf5TSJRO9tTwJ0vaB9n/rbo+2Ct+c0eNzc/0zsxji+xg5bh4ryFcOt9MZORx6tuOt27zNNm0REzPZZG6fbYG+1Gr3uqyIZer3Wuwdtrcq3WlbeTgbHGtZmHkQrStaVhex71u5GtK1pWMqVpWtFjGHLjz4sWfFaLYs2OmXHaPlbHkrF6Wj7k1mJj89picjobfFchvcXv4ba+9xu5taG7gvExfBt6ee+vsYbxMRMWx5sd6WiYiYms94fRexwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCPtHO7DS9n3ax1C6lZWZZtcp2Otv8AF+AYE70bN/Z8p29v6NbjiVl5lLI1mBczNzSEITlWGvnWtKRpWVOjeInVWHpDpfkOSvesbWTFbV0Mcz2tk2s0eWPJ9u2LHN83aIn0xylT7G3gFyftE+O/SHRWDWyZOC093FznVu3XHOTFpcFx1/jXnYiI7Vxb23XW43zWtWItuV9ZntWa3DknItxy7kO85TyDNu7Hecj2+x3m3zr8pTu5ey2uZezs7InKVa183sm/duVp58U9Xinyorm2djNt7Gfa2Lzkz7GXJnzZLTMzfJlvbJe09/t2tM/rtzzheH47p/iOL4LiNbHp8Xw3H6fF8dqYqxXHr6Whr49XVw1iIiO2PBipSJ7d57d59XxHpfTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb7Pd9u4v7lXd9e6U7bO+Fx/rXx/L0WBhSufDtz5hhXcPY67Kl5rWM629RgbezGHppKtbvmk6UpWNc7eAXUP4FdXTxeXJ21+a174MdO/aJ3KTTJjv8AdmMVM0du3ee/z+iaove5eDn4ffZ4x9e8fq/E5fwz5fX5Xb2Yp5716d2sezp7mvHaItWL8htcfkm3mmv9L7TWZmJidYnE1ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHiv3rONZu5GRchZsWbcrt67clSFu3bhSspznKvikYxjStZVrXxSlK1q/LWrWs2tMVrWJm0zPaIiPWZmftRDzx48mbJTFipbJly3rjx46RNr3veYrWtax3mbWmYiIj1mZam+6T2z3Zd2y5OXoK8zt9VOa4k7tm9xnp9l421t4WXarWk8PcbfDpn2dRk0rSla2snGrPxKNfT86MU9T+MnRvTVr4PqyOU3ad4trcfeuWKXie00zZafEjDb7lqzPy9PVP7wK92z7Snjbg1uX/AAtX6D6Z2K0yYub6v18+hfZ18kRNdnjuP2PqTJyGGfXtfDniszEx37w0Z9cfeTOuO+zMmz0E6TcO4Hq5ylbtXOdyy+Z7H4Xj0/Gt3tXlcWt2rsqeZwpPHnS3X00lSfivnCHN+0dzme9q8DxOno4p7xE7033Mvb5eaLYr6sVn6Y71nt8p7rRvC/3LvhdxWvhyeLHX/UfVe9WK3vj6VjX6a0vifP4eTFv4OdvkxxP1t/Lmr547+Wa94mNenKfbUe0R5NmXsuz1z2PGI3q1rTD4vh28HDs+a1r4s28y7sLkaU8+Keq7L6vvsf7XjN4hbN7XjnMmtE/1mtSKUj86L2yT++l9wXu0vY84TWx6+Tws0+ctj7d9jnNm+1sZO3b/AGy+vj1KW7/Oe1K/NwrD9rv7RnEyJX5d0/UTLpKXq+Bl3dZcsR+r9DGMNfblSPy+r11+uvzcOni14iUtM/ho5C/f+tvOKax+dEY4mP23Zdj3evsb7GKMUeBHR+vMR2+Lr496mWfn6za25esz6/PyxHy9HcvEfbqe0L4pdsXb/UbRcspZnCdbXLdHlbC1f9NaVrG9HB2+srKE/HiVI1jWtK1pStK/N9jU8cPEDVtWbcjg24rMT228F8kW7fRbyZsfeJ+n5d/z/VjfqH3Wfsg8/TLTF0by3T85K2rF+n+Vwal8Xm7/AF2Odrjt2ItXv9bMxbtPbvEtovQD3lSlK4Wq7jejEb07tbVvM5ZwDYz1+Hh0pWlLt+nG8vE3WZleY+ZUtQ2dqvn5eqrJ3Ae0f+IxdRcN3me0X29DJNKU+3P1Nema9/T17Rlj1QZ8Wvcr942t/wAG/EqcdafEvrcB1bpV29jYn1mmL8GtfY43XwevaJvfRvHb+tb4u2b2kHaH3Y/RcLpP1W093k2VGFYcK5Dex9Hy+UqxpWXw9Dk5Es67bjL1RpdjapGfolWlKUZ06a8RukuqvLTiuVwzs2j00tia4dvv9PbBa3xJjv8AKe3r9xVT42+xn7QvgD8fZ6/6C5HHwmCbebqXh8eblOnoiJ9PPyuDDGrS81mtpxzeZr5oiZZ0u8IsgAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAftK1jWko1rGUa0rGVK1pWlaV80rStPnStK/OlafOlT5fJ+TETExMRMTExMTHeJifSYmJ9JiY+cJ+XsPO76vcp2marhvI9l9M6hdFLlOHbut67T6Rn6a14v6DOtWJVrc+i4epy9bqZXfM4SyMaVKSjWvopPLwS6u/DJ0pi09jJ5+Q4WfqPP5pjzZMMfXa+Stfn5KYbYsUz6x5q/P6Gpn70H2eI8FvaA3+pOG0p1+kPE2k9ScZGOnfBqclePhctq5MtYin1Rs8hg3d+MflraMWaJ7TEead0rMytQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBZ9vh3l2evfcdjdFOHbemZ0+6IVnrsyuLfpcw9nzidiVvcX7kIVrCOVpL+TstFONZSrStmdJUjKlY0g9479Yxz3UVeF083n4/hJnHfyW70y7s17ZrTEenmwWtlwT8/xM9+0+jaX90/7N+Two8Gs3iZ1Hx863V3ifFdzXjPi8uxo9L1yxbjsVLWiLTg5TFg0uVrPaImMlfLNq9rToNYIWwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO1uhfUbadI+sPTfqTp8quFn8Q5dp9tDKjWsa2seGVGzn/oqSjWlJ4F7Jt1r5pSlJea+aeaV+pwnI5eJ5fjuRw3mmTU28OWLx3iYrFork+Xb547Wj9d0LxR6N0fEHw66z6L5LBGzqdRdPcjx9sExExfNbBbLqekxMT5dvHgv27evl7R6+q0I6Yc91HVLp1wfqRoZ0npedcV0fK9XKM6XKVwd7rsfZYv6ZGkaT/SciH6KlKUr9fiizbjN/FynHaXI4J74d7VwbWKe8T/S8+OuSnrH/BtDRt646U5DoXrHqjovlqzXk+lee5TgN+s1mkxt8VuZtLP9bPea/wBMw29Jme325c6c51YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjB3Vd3nRPs66dZfUXrJyjE1GN6L8NFooX7Nd9yfYWbdJU1+lwJS+Pl3PVO1S/OxavfRoXI3ZwrH5V6z1T1bwvSHHX5HmNqmGva0YMEWr8fZyRHpjw45nzWnvNfNNYt5YmJmJZx8BvZ58TfaM6xwdHeG/B7HI54tityvK2xZI4rg9TJeazt8ntRX4WvTtW84q5L4/jWpNK3ifWIRvfl7Y/uL7vNjueKcX2uT0s6M3L92xhcU0GRes7XcYMZ1+Fd5LtY3I/S70/1cY4mLr6WoVjanG5WNZShX114wdQ9XZM2rrZbcXw02mtNTXtMZc1O/pOzliYm0z84ilcfaO0THpPfZy9lP3cng57POnxvPc5oYeu/EmmLHl2uf5fDiyaHHbU1jz4+F4+aW+p8dfxNp2M+5OS0Tes0iYrGn29evZN25fyL12/fuyrO7evXJ3btydfrlcuTrKc5V+/KVa1r+FiK1rWmbWmbWn1mbTMzM/bmZ9ZWJY8ePDSuLFjpixUiK0x46VpSlY+Va0rEVrEfREREQ8T8eYAAAD6Wp3O30ObZ2Ok2efqc/HnC5ZzNdlXsTItztypKEo3bE4T/AEMqUrSla1p5+89mLNlwXjJhy5MWSsxNb472paJie8TE1mJ9JcLf47j+V1smnyelq7+pmramXW3MGLYw3raO1otjy1tWe8eny7/dbxexf25fcT27bfScS617LJ6ydIoXbGHk2trO5Tl3H8CtY2/iabawrcsTx8Ola5M8K9rMi/leLlmGTalcjOGbeh/G7qHp7Nh1OayW5jiImtLVyzP1Xr09I74csd6zWkfXTScVrW9Yi0TMTFX/ALUnuufB3xi4/k+oPDPSweG/iHbHl2MGTQrWenuX2o81/JyWhaKZaZtj0w12cW7hxYO9MlsN4patpo3bn3LdIO6jpzq+p3RzleByXQZ8IwzLOPfsy2Oj2NLcLl/U7nEtzncwc+xG5bnKxfpC5Kzds3vRSF2KZPTvUnEdUcdi5Ph9rHs4MkRF61tE5MGTtE2xZqxMzTJXvEzW3ae0xPbtMNavxk8FPETwI6z3uh/EfgNvhOW1LWvr5c2HJXT5TTm9qY9/jdi9K029TLNL1jLim1Iy0yY/NNsdnfb7zFAAAAAAAAAAAAACvl9uV+yHdXv4ug/l/wCL+r+r/R9/5/zIB+N32QOW/YP4DE26Pdc/kP8Aw9/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbR7Gvu6udq3d/xO1uc+eN0/6sXbHAOXWPiVjbrd2s62eO5FPNa27dbfIp6qt+5KEq/R4zj5j+qplbwe6tnpbq7UjNkmuhysxobde8xHmyz5de32omNicXmntP1sTCAHvHvZ7r48ezxz9+N1KZuregaZerensvkibxj0KfE5nFPaPPeL8PXfjFSLR2zTW3afWs2Flq7av2rV+zcjds3rcLtq7CtJQuWrkaTt3ISp8pRnGVJRrT5VpWlaLAYmLRFqzExMRMTHrExMd4mJ+mJj1hqE5Md8WS+LJW1MmO9seSlomLUvS01tW0T6xatomJifWJiYeR+vAAAAAAAAAAAAAAAAAAAAAAAAAAAABgV7STuv03aB2qdQ+o2Tl2rfKdtrcjinAcCd2Nm9suTbm3XGpTFlWvqrf1muuZu5pGEZSrHXy80pHzKnRPEbqrD0j0tyHI2vEbWXFbU0Mcz2nJs5o8keXv/XY8c3zdvXvGOfz0rvYw8AuS9ojx66Q6Nw6+S/A8fu4ef6t2645yY9Lg+Nv8eZ2IiPLGLd3KavGzNrVjvtx2mZ7Vmty3+92nJ95uOSbzLu5+53+0z9ztc2/Ks7uXsdnl3c3NyLkq1rWs72Tfu3JfP65VVz58+XZz5tnPecmbYy5M2W9p7zfJlvN72n7s2tM/rtzrieL0eE4vjuG4vXpqcbxOjqcboauKIrj19PRwY9bWw0iIiIriw4qUj7lXyXqfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBPsLesWX1X7B+B4W2yq5O56e7XdcNvxrKsq2NRq87IwuPWvFayrGlNbhRpSnnx+h/Q0pT5Unx4H8vfleg9GmW/mzaGXNp2jv3muHFe1NePt/7XSGpH70vw61+gvaw6r2ePwfB43q/Q43qTFPl8sZeQ3tXFs8xfvERE993atMz8/X1mZ9W49mBXGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAws76+9fpz2NdFNn1R5vOGw3GXTI13COJWsq3j7HlO/pbhSzi41JQuzpi493IxrmxyY2LscTGuVvXKUjT59M656047ojhcvKb0xkzX82PS1ItFcm1sdo7Ur6TPlrNqzktFZilZ809oSW9lj2Zusvaj8TNLoXpittPjtecO51P1BkwXzafBcTN7fE2M81tjr8fNTFmpp4bZaW2M9Ix0mbT6V7Xdf3b9X+8LqluepvVbkGRnXcu/O3o9BZuXYaXjWojcnPF1msxJ3btIQtfEncvXpzncvX7l256oQrC1bgB1V1Zy/V/KZuT5XYteb2mMGvEzGHWwxM+TFipMz2iO8zaZmZm0zPft2iNvHwD9n7w79nboXjeiOgeIw6uPXxVvynLZKY7cnzXIWpWufe3titKTa1/LWmPHWtKY8VMde1rxa9sX3WWcQAAAAAAAGaXZJ3w9XeyLqvq+fdP9pfyuP3snGscy4VlX71dRybSUueMvGlajcjDG2FMad76BnUjOmPk1tXb1jJt2/g17l0V1ty/RXK4t/j8tra82rXc0r2n4Ozg79r17d+1cnlmfh3iJ8tu0zFojyzGr2nPZg8Pfad6B3+kurtHFg5fHgz5em+psGLHHI8Jyc0mdfNXJNJtm1JzVx/VerM1nNhi+PHlwXv8SLDftU7n+mvdz0b431h6Y7WznavbWIY+319LsJ53Ht9atW552l2lqPiePl2PiW70IXYW53MS/j5FIUhejWtgfS3U3G9W8PrcxxmWt8WWPLmx+aJvr54iJvhyxHrW8d4tETETNLVt27TDUC8evA7rX2fPEfmvDrrfRyau/wAfltm4/c+HeurzHFZMl66vJ6OS31ubXy+S+K18dr1psYs2GbTbHbtke7GwyAAAAAAAAAAAAr5fblfsh3V75V/UaD+X/gDV/On733vv/Olf4KQD8bvsgct+wfwGJt0e65/If+Hv6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7OHmZWvy8XPwr9zGzMHJsZmJk2pem7j5WNdjesX7Uv+bctXYQuQl96UaV+88qXtjvTJS01vS1b0tHzrasxato+7ExEx916djXwbevn1dnFTPrbOHLr7GHJHmx5sGalseXFev00yY7WpaPprMwsXvZO92WH3Z9oPAuQ5WXavc14HhY3AecY0LnxJ42y0dquJq7t+VZVlW/sNFY12xvVl4rW5lSrSnitFhnhT1XTqvpHR2L3id3QpXQ3axPea5MEeTFNvp82TBXHkt3+mzTm9vzwA2PZ/8AaI6r4fBr5MfTPVezn6t6Wz3p5KZ9LlMnx97HiiIisYtPlcu5p44jv2pgrEz379tmLJSEwAAAAAAAAAAAAAAAAAAAAAAAAAAACCz7fLvEt9du5LH6LcR2/wBM4B0SjXX5dMW/SeHsea3cetNtkXYQlKFMrS3svY6OdPVWsa2Z0lSMqVog948dXxzvUdeG1M3n0OFj4d/JbvTJuzH9NtMRMx58FrZME/drPybS/unfZzv4VeC+bxL6h4/6n6t8TrRuYJz4prs6XTOPL/rfhpNoi04OSx4NPlKz27TGSs1maz3nQawQthAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATN/dnt9d2HQLuE0k7nqtcf6h8T+Db8/4L81dVv8AMufLzXx65Q9X1U+rz80xvZtzzk4HqDBM+mvyGp2j7XxcWxef25hrb++w4rHqeLHhDydaeXJy/R/UHxL/AE3+oN/iden0f1sWmPnPz+hJhSSUngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOOcv5ZoOCcX5BzPlWxx9Rxvi+o2G93m0ypwt4+BqtXi3czOy71ycowjbsY9m5cnWUqUpGNfm4+3t4NHV2NzayVxa2rhyZ8+S0xFaYsVZve8zMxHatYmZ9flD7PT3Act1VzvEdN8DpZuR5rneR1OK4vRwVtfNt7+9npr6uvjrWJta+XNkpSsREzMzHaJVzvtLe9/lXex3E8n5Zd2GTb6b8bzb+h6ccf+NOeNg6TCu3aVzblP0Nu/l5+Vcysj6TC1apXFnjWqQr8L4k68fEjrXa606h2du2S0cdrXtg47B5pmtMFJmPPPyi18lptbzRWv1s1jt6d53HPYq9mHgfZl8HuD4DHqYb9Z8zrYuV605f4Va59rlNnHSY1qfO+LX1MFMGH4NsmSYz0zZPNHn8lddjHqYYADZN2d+yt7ru8qeNt+GcQv8S6fXZUrPqHy3EyMDRXrVK+Jy09ciuJb3d234r67GLmQnSvppWtPVRkbpDwu6q6wmubT1LanHz8+Q26Wx4LR9M4Zt5YzzH01reJj9eEL/aL9vDwE9m+ufjupOocXUHV+OJivR/T+xh2+Vx3mO9a8jGKM9+Mpf8Arcuxr2rMd57eiQb0O92y6H6PX2bvX3qzzLnO3+HSUrfAaYXDddbu1p5rbuWdticpuXoQr4jWUL9v1+K1p6fPyz9wns48Jgx1nnuV3N7N2iZjQ8mnjifX0mMtNqbRHp8rR3VFeKHvovFDlNvJTwm8P+m+l+O801rfq2dnqTctSPTz0ycfs8DTFa3rMRbFfy94ie/b1zAw/YIez6xMCeDLivOMuUo0jTOy+Sa25nQ8f86N23x61a9Vf37NafvO308COgKUmn1Lu3nt2899nHN4+7ExrxHf8+so77PvYPa62Nqu1Xnultetbd/qXX4Tcrq2/wCDal+Yvea/nZIn7roTqp7uN2k8h1OTXpdzbqdwfklyM6Y2RvNvqeQ6CzWtP0FZ6rE0Goy5+JV/ReNlH1RpSlPFfNa/B5T2dulNjFb8C93k9HYnv5bZ82HYwR9r+lU18N57fT/TY7+n57K/QfvlPaC4ffwx1z0x0P1Rw1JrObDxfHchw/LZIifrorv7HLcjr17x8u+lPae8+sT2jRh3b+wz7t+2rX53KuJ41nrnwfBjdv5W14Tqcu3vMHGteq5dv5nGbWXt823i41ilLl/MlfjapCNydaRpbkwh1Z4IdWdN48m1qVrzmljibXy6WG8Z6VjvM2vrRfNeKVj1m82iO3eZ7dlpPs++9G9n3xq3NXgefz5PC3qjatjxYNDqfkMF+L2s2TtTHi1+bvg4/VvsZsvemLWrjtkm1qV7zNoaXcnGyMLIv4mXZuY+Vi3rljIx70K27tm9anWF21dhKlJQuW5xrGca0pWMqVpWnmjDdq2pa1L1mtqzNbVtHaa2ie0xMT6xMT6TCyjDmw7OHFsa+SmbBnx0y4cuO0Xx5cWSsWpkpaszFq3rMWrMT2mJ7vA8XtAbz/YWd6mV279zOD0k5bvL1nph1ryMbj1cPJv1+h63mmV/vPj2Zi25VpG3f2mxua3XZM6+aVx7cKRjGtKyZv8AA/rO3T/UuPidvPMcZzVq6/ktb6zHu2+s170iZ7RbLknHjtP9jEdu301b+9M9mjB4w+CW14g9P8Xjy9c+GWHNzEbGHF/qjd6awR9U8xr571ibXxaGnTd3MFIiJ+Ne0zMxPZPIjKM4xlGtJRlSkoypXzSUa080rSv36VpWlaV/AnTE947x8p9YaqExNZmtomJiZiYn0mJie0xMfRMT6S/R+AAAAAAAAAAANWvdz7IPtJ7zeotOqfVCHULRcwuYdrD2GdwLkWp0kNtGxSUbN7ZW9lxzdyvX7dusLMZ2p2Y/DtWqVjWsayrjDqzwk6T6x5D8FOTjkMG5NIpkyaGxiwRm8veItkjLrZ+9ojtHeJr6Vj09E6vZ894d7QXs29HT0J0NbpDlenKbOTZ1NXqzhuQ5O/H2y+WcmPSvpczxcY8V7xbJat6ZJ8+S8xaImIjFL87i9g/7ZO4X8vuLf7P3Vf53boP+2eof3fqf6OZ7/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7j87i9g/7ZO4X8vuLf7Pz+d26D/tnqH936n+jj+jKe1h+UvhB/enz3/O4/O4vYP8Atk7hfy+4t/s/P53boP8AtnqH936n+jj+jKe1h+UvhB/enz3/ADuPzuL2D/tk7hfy+4t/s/P53boP+2eof3fqf6OP6Mp7WH5S+EH96fPf87j87i9g/wC2TuF/L7i3+z8/ndug/wC2eof3fqf6OP6Mp7WH5S+EH96fPf8AO4/O4vYP+2TuF/L7i3+z8/ndug/7Z6h/d+p/o4/oyntYflL4Qf3p89/zuPzuL2D/ALZO4X8vuLf7Pz+d26D/ALZ6h/d+p/o4/oyntYflL4Qf3p89/wA7ken2vPs2tB2C9ROFXumOVyjb9IefauX5k7PleZi7HaYPI8SeVTN0uTsMLXazFyLv0XE/NGFYYlmULGTbhKEqwrcnH7xa8OcHQfIaVuMvtZuI38U/Cy7d65MuPYpN/Phvkx4sVLT5afEjtSsxW0R2ntMre/d6e2hy3tY9H9TYuuMHBcd4h9J78fV+jwGtn09Ha4bYprzrcng1Nrc3s+Gn1RnnTvFtjLFsuG94tWLRSunRiFYwAAAAAAAAAAAAAAAAAA3w+wT7vI9Be5+fSPk+yjjcE64Y8tNSuVf+Hh6zleNY+lavOjGVYwrlbKevxNJb8ypWv0qMY0rKtI1zn4E9WxwXU08TtZPLo83WcP11u1MW3WPNiv2mYjz5ZpXDH3bdvWfSaqvevez1bxW8Da+IPCaU5+qvC/NHJTGDF59ne4DNk+BvatpiJtGDSrt7HJ37R2j4EzPaImYnbpytVwAAAAAAAAAAAAAAAAAAAAAAAAAABhT7QTuf0faX2s9TuqWxyrdrdR0eTouH4Vb0bWTsOSbqkNbiUwo18zu3tfDKubadu3GUvgYN2VfTGNZR6Z1/1Ng6T6X5PlMl4jN8C2DTp5orfJs5u2Onk795mccWnLMRHfy0n5fNJj2RvA7lPaA8duiOhNPBe/GW5XBynUez8OcmDT4XjZtu7E7Mx9bTHuW16cfW15iPi7VI9ZmKzWscl5DtuW8i3vKd9lXM7d8j3Gy3u2zLspSnk7LbZl7Pzb8qyrKvm7k5F2fita+PV4+8rg2djLt7Gfaz3nJn2c2TPmvPzvly3tkvafz7WmW6bwvEcf0/w/FcFxWCurxnDcdpcVx+tSIiuDS4/Wx6mriiIiI+sw4qV79o79u74j0vpgAAAAAAAAAAAAAAAAAAO2+l3QXrT1tycjD6RdLucdSMrDrGmXY4bx3Zb65jVnWlI/Hhr7F6tvzWVPHqpTz5p+F9bjOC5nmrWpxHF73I3p+Krp6+TPNe/wBuMdZ7frsf9c+K3hr4ZYcOz4hdddL9GYNiLTgy9SczpcTTNFYmZ+Hbby4ov2iJ+Xf5SzL0PsjPaC7/AF9dha7c+cayFI0l9F3mp2Wpzq0rTz4piZWDG75p9VaePlX5fW7jg8Juv8+P4kdO7uKP7DPiyYcn/wDZanf/AN6N/Le8H9kXidv6kyeMnS29bvMfH4vkNPkNX0nt3+qMGzNO0/OJ+mImXDeV+zC79eH2pZGw7XurmdjW/VW9k6Xhm+2tixCNK1ldvXcfA9Nu1Tx/hJVpHzWlPPzcPa8M+u9SJtk6Y5a9Y+dsOnny1rH27TXH2iPuz9t2PgPbh9lDqLJXDp+Ofh7q5r9ox4eT6l4rQy5bWmIimKmbbib39fxMevaJ+0wj3/Ht5xXcZ/H+S6nP0W81eRcxNjqdpjXcPPwcqzOVu7Yysa9GF2zdtzjKM4TjSUZUrStHStjXz6ubJr7OLJgz4rTTJiy1mmSlqzMTW1Z7TExMTExKTnE8vxfPcdqcvwvIanKcXvYabGnv6OfHs6m1gy1i+PLgz4ptTJjvW0WraszExMTD470vogAAAAAAAAAAAAAAAAAJjPux1fPR7ulp4p8uonT35/fr549yKvz/ANCX3s0/jR1R+mHH/wAX2Gub77yP+qL4FfP16P6v+/HD/JJ/SaUcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6HvC/dxPpb0I4/268U2s8Tl3V3I+nckpjXa2svC4Xg5FulIy9MvM8XfXLOz1t+Mo0jK3anGkq1rWlI8e0D1ZPGcFr9PauWabfLW8+z5Z7XppUtHb8+uea5cVvT5RPaVx3ug/Z9r114qcv4xc/oV2On/D3F9S8N8fHGTX2updvDeZmO8dq5+Kpl0d3FaJmYteveEJb6/rQubNQACUn7I72LeB1C1nGO5fuk12Rc4tmVs7bgvS/LxZ4c9rbx7nqsbfkcr9J3Luvv34emxr7VnEu1hYle+lzhkQjbk94TeDWPkMWr1L1PjtOrfy5tHjL18k5YrPeMuz5u8zjtaO1ccVpPasz5pi0RFFnvBveVbXSG9zfgp4FbmGnPa0ZdDqnrnBnrs10L5aeXJx/C1xTSlNzFjt3y7eTJsUi+SMfwK2w2m8vDSaLTca1eHpeP6vB02p1+PaxcLX67GtYuLjWLFuNq1bt2rUYxpSEIxj5r5lXx5lWtfNUtcGDDrYqYdfFTDix1itMeOsVrWtY7RERH2ojt9tr08nynJc1vbPJ8tvbXI8ht5cmfZ3NzNfPnzZct5ve98mSZmZta0z2jtWO/aIiPR9V7XAAAfxdtW71udq9bhdtXIyhctXYRuW7kJUrSUJwlSsZRlStaSjKlaVpWtK08PyYiYmJiJiY7TEx3iY+1MT6TDype+O9cmO9seSlotS9LTW9LRPeLVtWYmton1iYmJifkj8+1M9jHwfuP1O/609vutxOGdasHCy9nt9DgYkJajqBLDszvxsQwrPwJ4u/yoQ+h2ci3euWbtaYsKYUrkJyu4D8UPBzS6ixZ+Z4DHXT5qlL5c2DHSJw8hNIm0VikeWaZ7RHki0TMT9ZHk7xPe2/2E/eSdUeDPIcT4aeLm7sdSeGe1s6+jx3K7exaOR6RjZy1xTlts5Pi1z8TgtaNjJhvjpkxxOe07UUtWMcIrkfHtxxPfbfjPIMHI1m70WwytXtMDKtzs5GJm4d2Vm/Zu250jOMozjXxSVKVrStK+PmhVsa+bVz5tbYpbFnwZLYsuO0TFqXpMxasxPaYmJj6YbOvD8vx3P8AFcfzfEbWLd4zldTBvaO3gvXJi2NbYxxkxZKXrM1tE1tHymYiYmPofFel9J7+q2mw0ez1+51OXewNpqs3G2OuzsefoyMPNw70MjFybM6fOF2zetwuW5felGlXsxZcmDLjzYb2x5cV65MeSs9rUvSYtW1Z+ia2iJiftw4m/o6nJ6W3x3Ia+Pb0d/Wz6e5q5q+fFsauzjthz4MtZ/FY8uO9qXr9NbTCx79mD3a6ru+7TeA84pmWb3MeM4drhfUDDt3KTlgck01i16IXK1lKdZ5OnvarOuSl483MqXilKeKLE/DLqvF1b0pobvnrbc1qV09+kT3mmzhrHaJ9e/e2G2K8z9u0tNL24vZ+3/Z48f8AqzpedbJj6c5vYv1L0js3rNa7fC8llyea1I8sViuDkcW/q0iO/amCvf1bDmQUPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGuP2pnaXhd3XaR1A4fj4kLnM+J67K5twfLpbpcyrO149bjtsjAxaUp663d3h4FzUUjGta1rl/oYyr4jXHfih0nTq3pPf060idzUx23dG/bveMuvEZbY6fT5s9Mc4Y/R/KUyvYT9oDZ9nr2g+keo82xanTXP7mDpjqjXm80wZOP5e86GHb2J7+WMfF7O3TkJm3pH1P6zWO8xXI7PW5un2Ww1GxsTxdhqs7L1ufjXI1jcx83ByLmLlWLkZUpKM7N+1ctzjWlK0lGtK0pX5K7suO+HLkw5KzXJivfHkrPzrelpras/di0TE/nNyTR3NbkdLT5DTy1z6e/q6+5qZ6TE0za21ipnwZaTHeJrkxXpesxMxMTEw9F4OUAAAAAAAAAAAAAAAAA+5xjkW24hyPQ8r0OTLD3XG9xrd7qcqFZUrY2OpzLOfh3f0MoyrSGRYtylGkqeqNKxrXxV79bYy6mxg2sFvJm1s2PPivH9bkxXi9J9Jj5WrHeO/rHo+XzfD8f1Dw3K8DyuCuzxnNcdu8VyGvaImM2nyGtk1NnH9dFoibYct4ie0+WZie3ossuwXuX03df2tdLOrGvyoXtrmcexNPyvHrdjPKxuS6KktPtrmVbp4nZrsMvAvbHHhcp6q42Tal6p0rScrIOg+pcPVXS/F8rjvE5b69cO1XvE2rs4O+HLN4j1r8S+O2SsT/W2ifWPWdKv2sfBPkvAPx2676A28Fsehr8xscjwGX4c0wZuE5Wa8jx9MF/xOWNTX2senlvSe0ZsF47VmJrGZTuKN4AAAAAAAAAAAAAAAAAAAAAAAAACEr7wr3fQ6rddeP9uXEttTJ4f0etWdjySOLf8Ai4ufzfZYEpxnG5alS1Wur1+0ydXlWJ0uSt5dmfqlCUPRSFvtAdXfgrzmv07qZfNp8REZNmK271ybuXH37xMen9Kx5LYrV9Zi8T3mO0Q2bPdC+zxboLws5fxl6g0Jw9ReI2TJp8LOfF8PY1Ol9Lbis0tS9ZvEb+5o4d7BlrNK318le0WrbzI6KPK4wAAAAAAAAAAAAAAAAAABtZ9kd2J/7tjuPwsPlWHfudJenVqPJ+fTpCsLW0s2btjHwuPWsqcZWYZOZmZmJk3rNYXLtzXY+XS3GFa0vW8p+E/Q34dOoqU2qWnieOj6q357doy1rNa014vMTEWve9LTHaZnHW/aI+cQL94L7U/87L4M7WzwWxip4gdY5LcF0lWbRbJoZcmPLm2uYyYKzXJbDra2tsYceSLUpTcy682taP6Xef70+6TdNOlGiweM9OeEcc4fo9bZjj4WBpdbYxo2bMKUpCHxqxnk3KRpSlKVu3rkvl9aevH8TxvFYKa3HaOtp4McRWmPDirWKxHyjv2m09vo72lqVdX9f9a9fcrtc31l1PzPUfKbuS2bZ2+T3cua2XJaZm1vhxNcNJmZnvGPHSPuOwn0HUH8yjGcawnGM4Sp4lGVKSjKn4KxrStK0/erQmIn0mO8fal+1tasxatpraJ7xaszExP24mO0xP5zQ97aT2bvFe4vorvet/TTjOHrutXTPAnur89Th27NzmHGsS38PY6zLtY8IecnEsSjs45dKSr8HXTtztylc+LHBfjL4c6vUXC5+b4zVpj5rjMc5pnFSKzt61I7ZMV4rEfXUr/TYv6+mOYmPXvFq3u1fbO57wc8S+L8MOteb2dzwz63268birv7N8lOneb2LxfS3te+W1u2HYy1tpW1+9Y+JuUvW0RTyWglyjKMqxlSsZRrWkqVp4rStK+K0rT8NKoNtqCJiYiYnvExExMfKYn1if134P0AAAAAAAAAAAAAAAABMR92J/Wm7rfnX9cTpv4p+D/i3yP6v9PyS89mf8auqv0w43+LbLXT99//AFf+Af6j+s/v1wyUOk4ozAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV2Hti+vOd1277OrOVXNrmcf4BlYvAuKeLnrt29PrbNNjcjTxKsPVTabTY0lWlKV+VKV+pXt4v87fneueWv5/Pr6F66Gr694jDij4kx+fGXLk/wNw73c3hTq+Ffsr9AYI1o1+X6twZ+rOfiaRW9uS3sk6dJme3mms6GjpzETM/TMfNq2YwTqAbdPY29k+H3hd0WFPl+v+ndL+lVrC5fzOxdtVnjbK5G/euaXT3q/KlcfY52D9FzIU8T+j3q+mUK1pVlnwf6Lp1f1PSdvH5+M4qKbe5WY+tyT5rThw2n+xyXp5b9vXtP0K+PeO+0zsezr4GbNentuNbrnr2+10901lpkiubSpOLHTk+Rxx6zGbT1dr4+vafrfi447xaImFgtq9ZgaXXYOo1WJZwdbrMTHwcDDxoRtWMbExbUbNizatxpSMYW7cIxpSlPvea+a1rVPvFix4cePDipWmPFSuPHSsdq1pSIrWsRHyiIiIajG9u7fJbm1yG/sZdrd3djLtbWzmtN8ufYz3tky5clp9Zte9ptP5/aO0ej3nscUAAAABD794W7GNJwvZaDu66c6SxrMDk2Za4/1RxdfjVt40d3O/Czq+R5EofpcL+0rmYerrCkYUlXBpPzKUq0RF9oDofBpZdfq3jsFcePZvGvylMdZisZ5tFcWzbt6RbL56YpjtEfWR27zMtiP3QntScn1Lpct7PXWPJ5d3b4TWycv0Ln288Xz24umK2Te4bDFvr7Y9H6n2d6Lea0/wCqZr2iKwi1owr1QEhb3enukj0r7lN70L5HtPo3Fesurn+ZMMq9S3hYXLNRj38mzct0lWkPpm5pZwNXbpWvquVjbhClZeKVkB7P/VH4F9SZ+D2Mvl1eYxT8KLW7Upt4azasxEzEefN5aYo+me0RHdUJ73vwKnrzwW4vxT4bRnNz3htvV/BC2DHN9nZ6f5HNiw5a37RNvqbjZy7W/efxNIm9rdo7ynBJsNYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+SjGcZQnGkoypWMoypSUZRlTxWMqV80rStK1pWlaVpWlfFSYiYmJjvE+kxPymPtS/YmazFqzMWiYmJiZiYmJ7xMTHrExPrEx6xKAF7bjs6udsXdjuOW8f19Mbpz1qpLmnHaY9qv0fW7O9WeLvNXfvx/Sq5mRtcHY7elqkbc442ZarWFY+JygT41dIT0z1Xm29fH5OO5r/AFZrRWPrceWe9c+O1o9PPbLTJl7domK3j5/OdtX3Y/tGU8cPAHjun+X25zdZeGcx01zE5rx8bd0cflz8XvYsU/X/AFNh0NrT4+cne9Zza1480T9bGmVh1ZEAAAAAAAAAAAAAAAAAAkue7rd29OCdW+W9r/Kdp8PRdULF/f8ACrF+96YWuX6nChfzbMKzlWEbN3R6vLlG1CMZTyZ+r1SrL01kj7PXVkaHLbfTG1l7YOTrbY0q2t6RuYqRa8R3ntEWwY7z2j1m3y+faaU/fEez7PVXh90/45cFo+flehsuLiOpsuLH3tk6d5DZti1clvLEWnLj5Te14tktNorgr5fLHbvEzxMdrZgAAAAAAAAAAAAAAAAAAAAAAAAMV+9TuL0Hax219U+sW7y7WPkce43l2eP49b0LeTm8i2krWp09vEty8yyJY2dnWM2/at0rKmLj35+YxjWcerdZ9RYOl+m+U5jPeK219a8a9e/a19jL2xYYpHztNcmSt7RHr5a2nvHzZ49mnwc5bx38auhPDnjNe+XDzHNYMnL5vh2vh1uG0a33+RvsXjtXFXNq6uXWxXvMV+PmxV7WmYras651zLedROZ8q53ybLnnb/l/INxyTb5M5Tl8TYbrYZGyy/R65TlG1S/kzpat+qtLdukYUr4pRW1vbmfkNza3tm83z7mxm2c1pmZ75M2S2S/zmZ7ea09o7+kejdi6W6c4vo/pvgeleE166vE9O8Rx3C8dgrFY8mnxmph09eLeWtYtecWGs3v5Y815m0x3lxRxX3gAAAAAAAAAAAAAAAAAHtYWHk7HNxNfhWZ5GZn5WPh4mPbjWVy/k5V2FixZtxp5rKd27OEIxpStaylSlPm8qUtkvTHSJte9q0pWPWbWtMVrER9uZmIh6NnZwaetsbezkrh1tXBl2djNeYrTFgwY7ZcuS9p9IrTHW1rTPpERMysOvZBdm1ntD7TOK4u6wrVvqP1OxsLnfNsr4VLeRD817Mtho9RfhKlbti/ptXn2ddl2pz81ycaUpW7cqeiNgnhH0fHSXSmrXNSI5Hk603t23btaPjV+JhxWj51thxXrjvE/11Z7xHyjUA94f7R2T2hvH/nc/GbOS/RnQ+bZ6V6Yweeb4bfgfljU5TkMVomMeXFyW/q5NzXyVr6YM0RF7xPnttUZSQNAAensMDE2uBnazPswyMHY4mTg5mPcpSUL+Ll2Z2Mi1OlflWNy1cnCVPv0rV4ZMdMuO+LJWLUyUtS9Z+Vq3ia2ifz4mYcjU2tjR29bd1clsO1p7GHa1s1J7WxZ9fJXLhyVn6LUyUraPuwravaadvde2jvR60dObGPTG1GRyO/zHQWLcaRsY2j5pOfI9Xg2PFKR+HgYOxx8WkafqPh0jX5q5fErp/8AC11lzPHVr5cNti25rxH4muDdmdnFSv3MdMlaRH0duzdB9iXxejxs9mvw16yy5pz8hh4bF05y+W9u+bPynTVa8Lv7WXvMz59va08ueZn8V55mPT1YEOiJXgAAAAAAAAAAAAAAAAJh/uxNf+Sfuup5+f3Q+m9fH3//ALG+RfNLz2Z/xq6q/TDjf4tstdP33/8AV94Bz9H4T+tPv1wyUSk4ozAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcU51yW1wzhfK+W3/TWzxrj+23l2k/1Fbeswr2ZOkvnT9DWNqvn50+X33F3tmNPT2tu3by62vlzz3+XbFSbz3+52h97pbhMnUnUnA9P4ptGXmuX4/i8c1/Fefe2sevXy/d75PT7qrP6qbvJ5J1N6g7/AC8i5lZG25pybOnfuS9U5xv7jMna8y+/SFqsIR/BGNKfeVgcpnts8lyGe9ptbLubN5tPzmLZrzH7Udo/Wb1/QnF4eF6J6R4nXxUwYuP6b4XVripHatZxcdr1v2j7dskWtP3ZmXAnAdrAT0/YGdBdX0u7JdJ1Drrvh7/rPuNhy2/s70Y/SL2osVsaXDwrc6QhKmHZytPlX7duVZ+L169Ok60n4pOvwH4LFxfReHkPh9tjmc2TbtltH11sNfLhpSJ7R9ZW2G1oj19bWnv2mO2qR72LxX3uuvab5Po/6s8/E+GvHanT+LSx2t8DHyGWMvJbGzes2tE7OTByGDFe9fLE48eOvl+t7zvFZtVfAAAAAAMVe9votpev3a11p6a7jAjsJ7XgnIsvSWq0jWVnkut1OZl8fyYVlCfiWPtLeNdp4pStawpSlafXTq3WnDYee6X5njctIyTl0di+GPT02ceK99e0d4n1rlilvu9uzPPsyeJXJeEvjr4ada8dtzp10Oq+G1+Tv3tFcnC7vIa+vy+C3a1e9c2jfNjnvPb671iY9FZLvNXd0m73Glv0rS/qNpsNXepX66XcDLvYlylf3/Xal5Vq58U4M2bDb8Vhy5MU/n47zSf34buPF72Pk+M47ksX+1cho6m9i/8A5e3r49in/i5IfLepznOemXP970q6hcL6j8ZyJ42+4RybS8n1d2EpR/37pNjj7HHhOsZRrW1O7jQjcj5pSUK1pX5Vc7jN/PxfIafI61prn0tnDs4piZj6/DkrkrE9u3pM1jvH0w6v1t0lxXXnSHUvRnN4q5uK6n4Tk+D36WrW0/U3J6ebTzWp5omIvXHmtNLdu9bREx8k3/iPvB/YNXiPGpcq5F1LxuVfmHrI8ixMfpvusvHs7mGHZhsaWMy3KNvItSy43Z25wjSlYypSnnx5rNbU8f8AoP6k1vqrY5Ku18DFGxSvHZrVjNFKxk8t4ntaPN3nvH0fbawnUPuifaxjqHmq8Dw/ROfgfwU3rcPsZus+N18uTjbbOS2n8XWvWb4cldeaVtS094tWfl37R9e57wp7PKP6je9T7n8PTjdQ/wBPl7p9oDw+j5Z+Tn/vdmh86vuhva/n8VxXQ1P/AOs+Nt/g7PSue8Nez+j+o2HU65/DwLbQ/wBNurwn2gegfoycnP8A3Blj/E5VPdA+1vP4vU6Hp/8A1Zx9v8Foelc94g7Co1/S59TLlPw/3GbOH8vzsVq8J9oPoT17TyU/a/1Hljv/AOK5FPc++1dP4uvRNP8A+pdK3+DLH6/+N6dz3ibsWj/g8XqVc/8A8V2EP9OJV4T7QnQ8fKvJT/3Lkj/9Dk09zx7Us/i8/RVP+/2pb/Bnj/p9t6dz3i3sij/g9R1Jufw8fzYf6cGrwn2huio+WHkZ/wC57x/7P/p9tyae509p2fxfI9F0/wC++tb/AAbMf9PtvSue8Z9l0fPw+N9R7n8OpyYef59dX/v/ADvCfaH6N+jW5Gf2K0f+zcmnub/aUn8XzXRlP++GG3+Dcj/p9t6c/eOezuP6jh3UWf8ADh3of6dVX/v+B4T7RPSEfLT5Gf8A7Ex/7Jya+5r9oufxXUfRtP8AunHb9b03oelc94/7R4/4PgPUS5/+hOH+nT1/7/feE+0V0nHy0OQn9aY/9i5NPcz+0HP4rqzo+n/2q2/wcjD07nvIvanH/B9NOoVz/wDv0h/p0lXhPtGdLR37cbyE/a+u7d//ACEuTT3MXj1P4vrbpCn7FNv8HJw9KfvJna/H9R0m6gz/AP1jbh/p0FXhPtG9M/RxXIT+yRH/ALByae5e8cZ/Fdf9I0/7jvb/AAcrD05+8pdtcf1HRrn9z96u7sQ/08cq8J9o/pyPlw2/P7PWP/2dyae5Z8aJ/F+JHSVPzuMy2/wcxD0p+8sdvEf1HQzntz+HkuLD/Txmrwn2kOnvo4Pfn/umsf8A7M5FPcq+ME/i/FLpOn/eXYt/g5uHpT95f6CR8+jt/wCeXPwf8b8GHn+fi1fDwn2kuC+jgN6f+66R/wDsrlU9yh4rz28/i30pT7f+x7at2/a52O//AE/X9O57zL0Qj+o7cudXP4ec66H+niVf+/8An8J9pPhI+XTu9P8A3djj/wDZHJp7kzxOn8X4y9LU/O6W3Lf4OoIenP3mvo5Hz6O2XnFz8H/KFq4ef5+H18PCfaV4ePl01vT/AN8MUf8A7G5FfckeI09vN43dL1+326Q37dv/AMRR3elc95x6UR/wfaxze5/D1M1EP9PC6/vf96fPwn2luKjv26X3Z/75YY7/APmbk09yH17P4vx36Yp+d0TyNv8AB1JH/T970bnvPHTaMvFvtJ5rcj4/VfdX0cPn5+rxXhFf4freE+0xxv0dJ7s/99cEf/sTlU9x91nMd7+0F0zSftR0Dylv1+8dTw9a77zzwCsafB7R+Ywl8/NbnVfSTp+94pHhMa/h+/8AyPC3tMaH9b0nuR+fyuCf2u2k91Pce9WRP9M9oPpy0fap0BydZ/bnqe3+B8657zrxSv8Agu1Hk0P3p9TtRP8A0cQi9c+0vq/R0rs/r8nh/wAWm5lPcgc/Hb4nj7wtvt+XofkK/wCHqGXo3fectLXz8LtZ3cfwevqNrJfw+fHF6f6XhPtLYfo6XzR6fTyOOfX9zOVT3IfJR/tnjvxlvt+Xo3dr+135yf33oXPebseta/C7YdjD8Hr59gS/n8cej/3r+89c+0rX6Omckfn7+Of/ANnhy6e5FzR/tnjjqW/Q9J7Vf8PMW9Ho3Pea8mvn4XbTehX73r5riz/0aWLwn2lbfR03P6+7X/M/9PtOVT3JGCP9s8a8dv0PTOev+Hk5/wAP6z0LnvM+7r5+F2424fX49fLbE/4Pq1cXrn2lM/0dOx+vt1n/AAYocqnuSuMjt8TxlyWn6fL0/kr3+3896XoXfeZOWV8/B7ecCP4PXySMq/5sKNK/zfe/f+XhPtJ7f0dP44/P2e//AOiHLp7k3p+PxfjBt2/Q8LNf8OzPb996Nz3mHn1f8F0B0sf4+8lKv+a1H+j/ADvXPtJb/wBHA4f18/8AyVcqnuT+k4/F+LXJ2/Q8XWvf9vJbt+1L0LnvLvVCvn4XQrjcfwevZ3peP5qx/wC/4PqeE+0jyfb63g9bv93Lb/lcunuUuho/2zxU5q36HRxV/wAMS9C57y11hr/guiPEY/x8vKnT/wDZyIV/B+H771z7SHMfRwupH59rT/8Aqhyqe5U8Oo/2zxO6it+h19evp+vht/gejc95W65Vr+ldGeDR/enPOl4/yc+Pn/M8J9pDm/o4bR+53nJP+DJDlU9yv4XR+L8SOqbfb8tdWv7XfVn1ehc95S7hK/4LpF08j/Hs7KX+am1p5/no9c+0f1B/W8Tx/wCvGT/Fl9f3nLp7lnwhjt8TxD6wn7flyaUd/wBvQns9G57yf3K1/wAF0q6ZQ/B6sHbS/n8byLwn2jupPo4rjI/Px5p/9vDlU9y54KR2+J171xb7fl2uPr+134uWSXZ77wD1c6y9wfTzpX1O6Y8Oscc57vsHjVvN4vazsDY4Gw2t+GHg5Mp5mw2Vu/YhlXrNb1qNm3Ktuk/FyPmkqdi6Q8e+X5jqDj+L5PjNONff2MetF9WL0yY8mWfJS0ze+SLVi9q94isT27+sfNhf2ivdJ+Hvhv4Q9Ydd9D9b9SZeZ6U4na5u+tzl9Tb09vU0MVtnaw1rr6mlfHltgxZIx3nJeIvNe9Ldu0yu0qVB7VF7YntBt92HaHy2GmwrV7qD0rsZXUDh+TKFJXKWtNajm8jwoxpSN29cztBi5+LiWYXI/wC+r8JUjcrX0SxV4v8ASMdV9JbcYaRPIcXW3Iadu3ee2GPPsU+3M3165K1iJ/FWj85Pn3c/tEX8AfaG6ftyWzkx9IdeZcHSPUeCLTWk35LJOtw21a0zOPFTV5bPqZ9jJak/0jHaJtSI80V5WTj38TIv4mTanYycW9dx8izdjWFyzfsTlau2rkJUpKM7dyMoTjKlKxlStK0pWiv21bUtatomtqzNbVmO01tE9piY+iYmJiY+22+8ObFsYcWxgyVy4c+OmbDlpaLUyYstYvjyUtHeLVvS0WraJmJiYmPR4X49gAAAAAAAAAAAAAAAADsTpJ1J3/R/qZwfqbxjKv4m54TybT8hxZ2LlbU78dbnWcnIwpzj86WM/Ht3cPIpStPVZvzj5p58vocTyWxxHJaXJ61rUzaWzh2KTWe02+Hkra1Jn+xyViaW+3W0un+IHRfE+InRPVHRHOYMWxxvU3CcjxGeuakZK4p3dXLhw7Naz6Tl1M16bOKfoy4qT2nss3e2Trdx/uM6EdM+snG8qzl4HNeL6/PyZ2JUlasbqzaph7/ChWkpfLB3WPnYnzrWX6T8/n5WWdNc1r9RcFxvMa163x7utjyWmvyrmrHk2KR6z+IzVvT7cdu0+rSM8bvDDl/BvxV638OOa18mvtdM87uamCuWJi+XjMl52eJ2bRMV/wDjXG5tXY9I7dsnp6O933GKgAAAAAAAAAAAAAAAAAAAAAAAENP3iru9jzTqbxHtX4lta3NJ05jjcn51DGveq1k8o2etnc1uLKVuVITs42p20fjWJ0nWGZZpWtYyh6aQ89oXq6N3k9TpbUy98HHRXa3orPpbay45nFWe09piuHLHeJjvF6/P6I2Qfc7ezxPTXRHUHjx1BoRTlOsrZ+D6WtnxdsmHgtHdrTdz1i8TauTNyHHz8LJXyxbWyTHaYt3mMmjUu3AAAAAAAAAAAAAAAAAAAbkvYqdl1zup7p9Rynkmurk9MejNy1y/k1b1qtcTZ7SxK3Y0ukjflStqOXTNzcXbxt1pclOxr7vi36fM45g8GejZ6p6ow7Wzj83GcNMbe13j63LlrMVw4Yt8ov571zRHrM1xz6du8q4veX+0rj8B/AjkOB4bcjD1x4k1v07wcY8kRsaOjlrky8nydsUT57a862tn46bxNa1y7lO9u/atrASEIW4Rt24xhCEaQhCFKRjCMaeIxjGlKUjGNKUpSlKUpSlPFE94iIiIiIiIjtER6RER8oiPoiGpLa1r2te9pta0za1rTNrWtae82tM95mZmZmZmZmZnvL+n6/AAAEJD3kTieJpu7Lpxyeza9GVzLpzK7mXfFKfGroZanU2PnSlK1+HajSPzrXx9VPFELPaM1K4eq+O2ojtbc46ZvP25wTixV/aj0bOHuZOf2OS8Aes+DyZPNg6c6yimtTv3+HHK15Dfyx2+jz5J8376Osj0uIAAAAAAAAAAAAAAAAATCfdipR+5d3WR8V9Vef8ATmVK+fl4pxzkNK08ePr81p8/P8iXfs0dvwM6pj6fq/jv2vqfY+hrr++/ifw9eAlvTt+FPrKPu9/wY4iY/W7RP0JR6Tqi8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0J3UXL1rtq693cenm/b6RdQJ2afOnm5HjOyrCny+f6qlHweqZtHTfPTX8VHE7817enr9TZO377LHgRTHk8avCimX0xX8Qukq5J+1Seb0ot+93Ve+9rKW73Mp/q67XY1l/Grl3qy/wA/lWVnmZz5pn5zlyTP5/ns3kuLiteM46K/iY0NSK/oY18cR+92fKepzgFmX7PHU4uj7KO3PV4cLdvGxenmJ8OFqlKW6fH2OxyJ+mlPl853pVr9/wA1r5+aybw+xUwdF9O4scRFK8fTtEfL67JktP78y0mfbA38/Ke0z4yb2xa982fq/P57Xnvefhaenhr37/apjrEfciGZruSNoAAAAADx3bVu/auWb0I3LV2Erdy3KnmM4TpWMoSp9+Mo1rStPv0q/JiLRNbRExMTExPymJ+cPOl74r0yY7TTJjtW9L1ntat6zFq2ifomJiJj7qrL7g9da1XXTq/r7Hp+Fj9R+Y0h6P1NI3N7m3fEfnX5R+JWn1/eVf8AUGOMXOcvjjt2ryO3Edvl657z6ftt7Hwi3Mm/4W+He3l7/EzdGdOTbzfipmvFatO8/dmK9/13T75DIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADL/ALBP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0efaxjv7OPjJ/xf9Tz+1xG3KzZWVNI14sixZyrF7FybUL+Pk2rli/ZuRpO3es3oSt3bVyNflKFyEpQnGvyrGtaV+VX5atbVtW0RatomtqzHeJrMdpiY+mJie0w9mLLkwZcefDe2LNhyUy4slJmt8eTHaL0vS0etbUtEWrMesTETCvB9sD2gZXab3dcvs6zBljdPuqN27z/AIPcpD9BHH2l2cdzjXLkaRt0uw5DZ28rVqMYVhi/C+UqU9cq+vFzpG3SnVu3XHjmvH8nNt/Rnt6eXLP9Or37RHeNiM3asdu1e357cC93d7RGDx+9nvp7Lu7UZuruhcePpLqik2+vtm0cdbcbnrS0zeaW4fJx0ZMk2tFs/wAT1ifrY1VMWp5AAAAAAAAAAAAAAAAAAJa/u43dvW/jc87TeW7b1XMet3mfTi3l3vFfgS+FXb6HXwnKnqrSddnu7sYeZUp8SXppGla0ld7O3Vneu/0pt5e8177nHRaf630+LgxxM+vafi55iPWI7z27R6a/fvlPZ9jFm6U8f+n+P7UzRj6a6zvr4vT4sfE/A/lty9Y+t71jS4ylrdomfJHmmZiEsFKpQWAAAAAAAAAAAAAAAAAAAAAAAx/7puuvH+2zoD1P6zcky7WJhcL4xmZmLK7KkaXtxl1t63R49KVrSsqXtxm4NudI18+iUq0rT63wOqOc1+m+B5Pmdm8Uppat707zH12a3bHgr27x375r0ie30T+uy34E+FnL+NHiz0P4bcLr32NnqXnNbW2IpEzOPjteL7vKZu8RPacfHa21esz6easd+/yVlPVjqTyLrB1J5t1N5Vl3sze825LueRZs71yVytiW12GRm28O1KVa1pj4Vu/HFxo1rX0WbUI+a+PKtbleS2OX5Ld5Pava+fd2c2xebT38s5clrxSP+DSLeWsfRERDdu6B6L4fw76M6Z6J4HXx6/FdM8Lx3D6tcdIp8WNDUw61tnJFYiJzbN8Vs+a0RHmy5LW7R3devnu3gAAAAAAAAAAAAAAAAAPd1uvzNvscDVa6xPK2GzzcXX4ONbpWVzIzM2/bxsaxbjSlayndv3YW4UpStaylSlKVq88eO+XJjxY6zbJlvXHSses2ve0VrWPuzaYiPz3G3dzX4/T29/cy1wamjrZ9zazXmIph19bFfNny3me0RXHipa9pme0REzKxS9k32c43Z72ncQ0G0woWuofPcXE5vzzJnZpay4525sy2Gv0+TGVPiW72hws6OqvQlWla3MatZQhKnppYT4U9H16Q6U1NfLSI5DfrTe37THa3nzV+Jjw2iY7xOCl4xWifpr8oad/t++0Zm9orx+6i5bQ2bZOkOk8+x0x0phrknJr21eNyRp7fI4LRPktj5XZ1Z38doie1M8RFrRPednLJiEAAAACGd7zPKtevfblGtKeI9MuWePFPnX1ch1dfn+H5/wCb5Id+0pP+v3Tsfa4zb/f2MX/I2RPcl17eFHjJPefrut+A9J+UduI3o9Ptd/p+6jMI1rtAAAAAAAAAAAAAAAAAEwP3YuX/ACbd1UPw856dy/m4/v6f0pc+zR+N3VP/AG7x38BsNdz331e/WngNb7XS/WEft8txKUqk+oqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdedXON3OY9LuofFLNuV27yThvItJbtxp6pXJ7PV5OJGEafPzKUrtKUp4+t8/ltadzi+Q1YjvOxp7GGIiO8zOTFakR2+n1l2/w/wCap05110hz+S8Ux8N1Jw3J3vae1a10t/BsWtM/RERj7zP2lWpzvBlrOb8y1so1jLX8q5DhSjWnisa4u3zLFaVp96tK2/HhWDvUnFu7mOfSce1sUmPtTTNes/4G9X0ttRvdMdObtZi1dvgeI2omPWJjY4/XyxMT9qYv3hxVxX3gFkJ7KDqBg9RuwTt22+NkQvZmBxC/p9tajL1SxM/C3W0pSxc+da0n9EljXfFfFfTcp8vHhYt4V8hj5HoPp7LW0TfHqWw5Yj+syUzZY8s/d8nln9dpme310js9He1n4xcfmw2x6+11Di5Hj72iYjY1NrjdGZy09PWv1RXPj7x3jzUn17xMNijISHQAAAAADi3OOUYfCeGcr5jsJwtYHFuPbjkGZcuypG3bxdRgX8+/O5KtaUpCNuxKsq1rTxGlfnT63F3dqmlp7W5kmIx6uvm2LzPpEVw47ZLTP3O1X3emOD2ep+pOB6c063vt87zHHcRrUxxNr3z8jt4tTFWlYiZm03y1isdp7zMKs3qpuKch6ndRN7S78aG35xyrY2rvmlaTs5m8zr9mtK0+VY/CnCka/fjSnzqrA5TN9UcnyOfv3jNvbWSJ79+8Xz5LR6/nTHZvYdCcdPEdEdH8VNPh247pfgdK9O3aa5Nbi9XFkiY+ifiVt3+73cCcB2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABl92DVrTvI7c60/dZ4R9otc7b0H/Vh07+m2l/GMaPPtYfkcfGT/i/6n+8+4s2llbSNAaWvbhdns+5jtP2fMuM636X1D6J/H5lqZWbVJZGXx7Fj8Tk2NenSlZ1x8HSfmpsbVulaU+kR9Va1p5Ya8bOkJ6l6Vy7mtj8/IcL5tzFMR3tfXpHfZraY9fLTD8XJER/XR6+iyv3YHtFV8E/H3R6c5vd+p+j/ABN+F03yEZckxi1+Yzz5OEz46TPljNtcnOjp3vMTPwrdo7du6AbKMoSlCVKxlGVYyjWnisZRr4rStK/OlaVpWlafeqgZ8vm2zImLRFqzE1tETExPeJiY7xMT9MTHrEvwfoAAAAAAAAAAAAAAAADITtV678h7auv/AEx6ycczLuHkcQ5Rr8nY1teqtcjj+Vdpg8hxPRGVKTllaXJz7Fv1UlSE7kZ+iVY+K/f6X53Y6b57jOY1rzS2ps47ZO3efNr2nybNO0THfz4LZKx8/WYntLEXjx4VcR41eEvXHhvzOtTZw9RcHuYNKL+WIw8vgxztcPsea0T5Ywcnh1ct+3lm1KWr5oie8WbHS/qDouq3TvhnUfjWTZytLzPjen5Dgzs3YXo24bTBsZc8WdyH6Gt/EuXZY2RHxSsL1qcJRjKNY0sr4zkMHK8fp8jrWi+Hc1sOxSYmLdoy0reazMenmpMzW0fRaJiYiY7NI7rnpHlegusOpOjebw5MHJ9Nc1yPD7VcmO2Kb30drLr1z1pb1+FsUx1z4besWxZKWrM1mJnnjnOqgAAAAAAAAAAAAAAAAAAAAAIifvGnd9PP33C+0fiO3rGxo/ovMepdrFveJyzMzAuXdJo86Ea1pPGuYGxwNxGE40lG/ZtSpWtKIl+0P1d8TPpdJ6mbtXB5dzkopb1m96TOHBkj6aWpkx5o/wCFWJbCfubvZ5rq8T1L7QfUPHxbJynx+m+icmfH3rXW1tuuPlOU1bzETXNTa09rjpmszE4suSJjvKKmi2vlAAAAAAAAAAAAAAAAAAAbsfYe9lk+53uew+ofJ9dLJ6ZdEJ2+Sbj49ms8HbcjlS3Y02iuXK09EL8K5tN3bpWspSjra09HprWVM0eCfRk9TdTU5DaxzbjOEmNnN3r3x5dj0rhwTPbtFu9/jRHf5Y59FZnvP/aWr4IeB2z0fwe5GHrfxPpfheN+Fkim1x/DRNsvJcrWkT5rYbRrTxl57REW3Y+uie1bT5oxjGNIxjSMY0pSMY0pSMaU+VKUpTxSlKU+VKU+VE8Pl8mp3MzMzMzMzMzMzM95mZ9ZmZn1mZn1mZ+b9H4AAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAl++7GS/5Pu6eP4eadP6/zaLdpcezR+N/VH3dzQ/gM8/4mvB772P8AZf4ET9rprq6P2+V4uf8AElNpQKJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFap7S3o1k9C+9frxwiWLLH1tOYX9xpLtYVhDM124xcbOlk2qeKUrCubey7VaxrWlZ25fPz5pSuDxJ4e3Cdac7peSa4/quc2Ge3pfHmrXJNo+555vHp6d4bqHsVeI+HxS9mbwp6ojPGXdnp3Fx3J4/N57625x2fPqxhyT37+eNXHr5O09p8t6+nbswSdGSoAS4Pdwe63Ev6zqD2ncj2NKbK1mZHPuCWsi7StzLx54FixutXh261p+lazG08tjOkaSrSuXKsvFPFUsfZ16ppbHyHSuxk/psXtv6MWmO96zjrXNipHp6Yq4fiT27/i5me3za+vvmPATPi3ekfH7htOZ0smti6T6qvhxzFNfNTby5eM3tm8d/wCmbubkY06+aYifqesV9fRK4SnUIgAAAAANOPtuO63C7cuzrlHGNfsI2Oc9arOdwHQ4cLkY3ruo2FiGHym9WlK+uMbemz78rc6eKVnCtPPyrRh/xq6px9O9H7WtjyRG7zUZOPwUiYi04clYptW7fPtGDJbtKxv3Y/gJs+MntGcHzm5pzl6X8M8mr1Zy2zakzjpyOnltscDiie3lm1+S1cVb1nv2raJmPVX7SlWUqylWtZSrWUq1+da1rXzWta/hrX51QH+fzbbkREREREREREREfKIj0iI+5EPwfrnvTXpf1A6w8u1fBOmfE93zPlm5vRs4Gk0GvydjnXa1r+ju1sYtu7djYsx83L930VjatRnOXiMa1c7jeM3+X28Wjxupn3NvNaK48ODHbJeftz5axM+WI9bT29IiZ+UOqdadcdJeHfT2/wBVdbc/xnTfAcbjnJt8ny23g0tXH2j63H8XPfHScuS3amLH5vNe9q1j1mG4niHu/Hf3yXS4m42Om4JxmWbahftazacu11NlZtzpTxHNxZXLF3DyI180nj3YeuPila/qqMvangF17s4aZsmHQ1vPEWrjy7eP4kRP9nWZrNLR8praO8K6eofe4eybwvJ7HHafJ9Vc3Grktiybuj09uTpZL1ntM62etMtNnFMdprlx28tu8xHyco/O7PfT/wBZ6a/lVrv625X8731z/Zcb+68f+U+F/RhvZZ/3HrT+4O5/Jz87s99P/Wemv5Va7+tn8731z/Zcb+68f+Uf0Yb2Wf8AcetP7g7n8nPzuz30/wDWemv5Va7+tn8731z/AGXG/uvH/lH9GG9ln/cetP7g7n8nPzuz30/9Z6a/lVrv62fzvfXP9lxv7rx/5R/RhvZZ/wBx60/uDufyc/O7PfT/ANZ6a/lVrv62fzvfXP8AZcb+68f+Uf0Yb2Wf9x60/uDufyc/O7PfT/1npr+VWu/rZ/O99c/2XG/uvH/lH9GG9ln/AHHrT+4O5/Jz87s99P8A1npr+VWu/rZ/O99c/wBlxv7rx/5R/RhvZZ/3HrT+4O5/Jz87s99P/Wemv5Va7+tn8731z/Zcb+68f+Uf0Yb2Wf8AcetP7g7n8nPzuz30/wDWemv5Va7+tn8731z/AGXG/uvH/lH9GG9ln/cetP7g7n8nPzuz30/9Z6a/lVrv62fzvfXP9lxv7rx/5R/RhvZZ/wBx60/uDufyc/O7PfT/ANZ6a/lVrv62fzvfXP8AZcb+68f+Uf0Yb2Wf9x60/uDufydqV7n+2zn/AGn9XeQdGOpctXPlnG6Ylc+Wny7ebg1pmYljMtfCyLU7kJ/pV+FJeJV8SpWlfqYo6m6c3+leW2OG5L4U7Wt5PiThvF6fX1reO1omYn0tCwHwP8aOkvH3w94jxK6JjejgOZnYjUjkde+rtROtsZdbJ8TDkrS1f6Ziv271jvHafpY9vgMugAAAAAAAAAAAAAAAAMvOwj/HH7c/xtcH+0etdt6E/qw6e/TXS/jGNHr2r/yOXjJ/xfdU/ebcWbiytpGAPR2etwdzrdhqNnjWszW7XCy9dsMO9H1WcrBzrFzGy8a7Gv6q3fsXblqcfvxlWjwy46ZseTDlrF8eWl8eSk+sWpes1vWfuWrMxP3JcrS3NrjtzU5DRzX1t3Q2sG5p7GKfLk19rVy0z6+bHb6L4stKZKT9FqxKuI9qH2nbPtF7tuoPC6Yl61w/lWwyObcCzLlqtq1naHeXa5OTHGj6Yx+Brdzc2Opt+jzSkcKnmvq8q6/E3pTL0l1ZyGl5JjT2slt3QvMdovgzz5rRX0iPLizTkxR27/iPm3LPYZ8ftL2hPZ96Q6l+qMeTqLgdPD0x1ZrUv576vLcXT4GGc0+abTl3eNpp795t2+u2Z7R27NdjHyYQAAAAAAAAAAAAAAAAACaj7u73cXepHRnlXbTyrafSORdJb13c8St3rta37nC9rmwvX4yrOUpXJ2N5tMm3apH0xt41uEPR4j6ky/Z86snkeG2um9rL5tjiZnNqRa3106WW8Tb5/Oa58tojt8qxEdmtL74T2fcfRniTwPjZwWjOHh/EHHj43qC+LHEYqdS6GtbHitHkrFaVy8Xo4b3m3eb5r2t5vXskjpGqYQAAAAAAAAAAAAAAAAAAAAHT/X/rBx3oH0Z6i9X+U5ljC0/BeMbDcTu5M4ws3c6kKY2ow5SlKNKfT9tkYWFH5+fVkRpSla+KV+Rz/L6/A8NyPL7V60w6OtkzTNvlOTt5cNJ//mZrUp/9pkTwl8O+Y8WPEjo7w84HXy7XI9U83qcdTHhrN8lNWbTm5DYrWImZjU4/Fs7NvTt5cU9+0eqsl69dYOS9e+sHUHq3yvMyMvbc25Pt91SmTcrdnhYGVm3rms1cJ18VrY1evrj4FilaeaWceFK/UrU53l9nnuX5Dltu9r5d3ay5vrp7zTHa9pxYomfXy4sflx1+5WG7l4U+HfC+FHh30j4fcBr4dfj+mOD4/jO+GkY67O3g1sdN7evWPT4u9txm28vb0nJms6hfJZCAAAAAAAAAAAAAAAAAAfQ1Gqzt5tdZpNZYnlbLcbDD1evxoUrWeRm5+TbxMWzClKVrWV2/dtwpSlK18y+p7MOK+fLiwYqzbJmyUxY6x87XyWilKx92bTEfruJyG9q8XobvJ72WuDS47U2d7bz2mIrh1dTDfY2MtpmYiK48WO9p7zHpCxq9lr2f4XZz2ocI4bl4kbfOuWYWLzLn+Vcs0tZtd1u7NdlDU5fypKsuP28+eoj6vTWscWlZRjL5UsP8MOkadIdK6WnekRvbdK7m/ea+W/xs8fFjFf6e+vGScMd/opDTd9ur2idn2jfH3qjqTX2Jv0rwG1sdN9JYKZPia0cZxeSNK3Ia/aZr5eYvqV5G3bvHmzz2mY9Wx5kVDQAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEvf3Y2VKcG7pIffry/gUv5tJuafX/LVLb2aZ/1F1PH0fVmhP/kM7Xl997WZ6p8CbfRHT3Vsft8nxn/u/bSoUolEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJT7yH2tZEMrpv3Wcf13qw/olrp9zi/j2qxt4lbeffydFsMu5GlaSvbHM3U8GEp1p5pixpStfHhFD2i+l7RbjuqdfH9Z5Y0N61Y7RTtktbBkvP02yXzTSJnt6ViPobAnuZPHXDbB1p4C8vudtn6ov1f0vizZO99iL6mLByupr0mYmMenr8bXatFe/ac9pnt3RPUVl+gDt7oR1s5z28dVuGdXuneyua3k3DN1g7XGrSU6Y+fYxsm1eydVnwtztzva/Y2rcsXNsxuW5XMe5OMbkK19VPrcFzW90/yuny/H5Jx7Onmplr6z5cla2ibYskRMTOPJETS9YmJmszETHzY98VPDPpfxg6C6k8POsNKm7wnUnG7Whn7xWc2plzYcmPBv6lrVvXHuaeS8Z9bJal60zUra1LxHlmxs7G+9Dpr3sdFdF1J4RscaO9sYtjB5xxiuRbnsOOchtWbX0uxkWaem7DHyPiW8nFuXLcKVt342/M5W5TlYj0R1lxvWnC4OS0clfj1rXHvavmicmtsRWPPW1fSYrbvFqzMR6W7evbu02/ai9mzrX2ZfEvlei+p9PNbi8ufLtdMc5GG9dPmeIyZL/U+XDknvjtlxeS+DPSt7TF8U3mKxaKxmc7ijaAAAA646t9WOC9D+nnJ+qHUje4nHeH8S1mTs9rscu7bt09Fi1O7DFxo3JR+kZ2XKHwMLFt1rdycicLNuNZypR87luV0eE4/a5Pkc9NfT1MVsuXJeYj0rEzFKxMx5r3mPLSketrTEREzLufh90B1V4n9X8H0N0XxWxzHUXUG7h0dDT16XvPmy5K0tnz2pW3wdXXrb4uzntEY8OKtsl5itZlXae0g74+U983X/cc7zJ3cHgXH63NB054/W5clDA0GNfv3I5eRSUqQuZ2fk5GVkTuwtWfTj3bFisZVs1nKvfxF632ut+fzb15mmhr99fjtfvMxTXra0+e3ee03yWta0zEV7VmtZj0bhnsZ+y7wXsueEnHdKa9ce11Xy3l5brLl4pSLbfL58WKk6+GYjz01dTDhwYaY7ZMnfLTLli0RkitdfLoCXICbz7vj2manpx225vcHyTj+LPmfV/bZF/je4ycWEsixwfWxs4GNYxpXozlblXd4m6nO/ZlD4kLlLdY/ofnNXwB6Uxcd05fqDZ16zu8vltbWzWpHmro4+2Ota9+8xPxqZu8x27xMR29GsT73bx/3+s/GjW8IeF5fPXpvw74/Di5rjsGxaMOXqndnLtZ8uauOa1vX8C9jja1x5It5LUm0T9ckPpBqfQAAAAAAAAAAFfN7cv8AZDur370NB/L/AMAauv8A8kA/G77IHLfsH8BibdHuufyH/h7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZd9hNfHeN251r+61wb7R612zoX+q/p39NtH+M4ke/aujv7OXjJEf733VP3m3Vm6ssaRYADQr7fDs9u9ee2ix1k4nqq5nPuiFz81L9MWxW5mbLhl6/WG3xbk4xlKOJprOZsN7crSlaU+BOsq0j5rTBPjv0hPO9N15jUxeff4Sfi28le98mnNu2WkzETPkw1vkzz9ryzPotc90/7RWPwp8bMvhx1Bvxr9J+KFPqHFOxlimtpdSY8Xm4/PStpittjksmvqcXSO8TPxaxHeZ7TBRQdbTgAAAAAAAAAAAAAAAAADNv2enc9tu0zur6X9UsXKla0VN7jaDmGLK7W1iZXG9/Wenz7+ZSlaeu3qrefLa2qVrSlL+HblX5U8O6eH/U2XpTqnjOUraYwfHrg269+1ba+fvhvN/l3jFF5yxHf8VSJ+hGT2vvA/j/H/wABuuehc+vXJys8Vm5bp3PGOL7ODmuJ8vI6mPWmYny3376ldDJMRMzi2L1j1lZS8e3ut5RoNJyXTZEcvUch1Gt3mqyoVpWGTrtth2c/CvwrStaVjexsi1cjWla0rSVPFVj2vnxbWvg2cNovh2MOPPivHytjy0rkpaPz62iWlny/FbvB8tynCclhtr8jw/I7vF7+C0TFsO7x+zl1NrFaJ7TE48+G9J7/AEw+w9z5wAAAAAAAAAAAAAAAAAAACKh7xp3f3tZquE9pPD9tW1kbatjl/UqOLf8A0X5nQt3J6jj+fajXzGORdu6vd2vX6a1pZt1pGsa+UWvaH6unFi0uk9PL2tl8u3yUVn/rcRM4cF4+ceabYs0d/orHb7a+j3N3s8Y97e6n9oHqLj/Pi0Iy9O9FW2MX1v1Za9achy+peY7WnFjpvcZfy94icl4mYtHZEWRMbCAAAAAAAAAAAAAAAAAAADef7Cnsrr3H9ysOrXK9b9K6bdDJw3WVTIs/FwNxy3Itxx9RpL9a0pSk7VjOu7u3WkqSpPWRr4rSla0zf4HdGfhi6kjldrFNuN4OYzW7174823aPLiwW9O0TWuSc8evfvihVv7072lv5jPgrbw/4HcjB1p4pVtxmCcWXybfHdP4r2zcjyeKInzTXJl1acZeJr5Zpu29YnsnkUpSlKUpSlKUpSlKUp4pSlPlSlKU+VKUp9VE6WqfMzMzMz3mfWZn5zP25foAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAl4e7HS/wCJ3dFH/wDGrgkvH/6m29P6f8/8KWns0/8AxTqf/trR/gczXp993H+yPwMt/wBgeqo/9JcdKVQlIodAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdFdynQLh3c30W530X5xjWrum5lpM3X2sqdql25qNpcxrsNZusWNfqy9Xlzt5mPX50+Laj5pWnyfD6k4HT6l4Xf4bdrE4dzBfHF5jzThyzWYx5qxP9fivMXr92IZT8FvFjqPwR8S+lfErpfPkx8l03ymtt5MFLzSnI6NM2O29xmeY/wD4ff1631s30/DyW7TE+qta7ne3vnHa91r5x0b57rcnA2vFttfs4eRdtThj7bUXZVua7Z4N6saW8rGv2JRhO9ZrK3TJtZFnzSVqUaVw9TdP73THNbvD7+O2PLq5bVpaYmK5cMz3x5aTMRFq2r6TMd4i0Wj5w3TPBDxe6X8cvDPpfxI6T3cO1x/Pcfiy7GLHkrbNx/I0rFNzR2scTN8GbFlibRjyxW84b4snby3rM9AvgssgMpu07vC61dm3UfD6i9HuRT19+k7UN1oM342Rx/kWDCVfiYW1wbd/HrchO3K5b+JZvWL1KT/wnyj47R0r1dzXR/I05HiNicdu8Rm1797a+xSPnTLSLV7xMTMd6zWfX5sFePvs7eGftH9GbHR3iLw9dvDNcluM5bW+Hi5fh9q0fWbOhtXxZYpat4raaZMeXHM1/Ees95pXZT7bjtf7ncTU8Y5/tsTot1Ru2bFjJ1PLNljY3HdpnSjGHnT73Lhg4sruXkeqGPrKVyMmFZW4Vu3JXKJldF+NXTHU1cWrv5acNyk1rFsW1krXXy3n0/pOe8UpM2t3iuLva0ekd57w1qfaY92N45eB+fkOc6S4/Y8TOhaZMuXByHT+lmz8xoa0Wm3bkuKwW2titNfF5bZd6Yw4bRF7RSkVlufw8zE2GLj52DkWcvDyrUL+Nk49yN2xfs3KeqF21chWsZwnSvmMo1rStPnSrMlL0yVrelovS0RatqzE1tE/KYmPSYn6JhWxsa+fUz5dbaw5NfYwXtizYM1LY8uLJSe1qZKWiLVtWfSazETE/N7LyekBrm7vPaj9p/Z5r86xzTnOBynnWPau0xenXEs7F2XI7mVGlaWbOzs41cq9pbF+7T4f0zLxJWrfic6xrSEqMd9W+J/SvSGO9d3ex7W9WJ8vHamSuTZm8fKuStfPbDWZ9PPekxHrM/JMf2evYX8ffaK3NXL010tt8F0rlvT4/WPUGpn0uGpgmYnJk0smeNfHyeXFTvf6m19iuS8+WkTE3iULf2gntQOt3fZyS7g7bJnw7pHq8y5c4z091d+9SzS36qSjm7/Jpc8bTZTlGNK3IWcXGjZtWIRxYzhcnchr194m831zszTNadPicV5nW4/Fae0R6T589u/bLlmY9ZiKV7RWIrE9++yr7I/sOeGHsr8Lj2ePw16j8Qd7XrXnOr9/FjnJNu0xOtxODyd9HSrEz2pbJnzTkvltOeaWpSmshjVNwB3H2/8ARrk3cD1j6fdIOJ4t/J2/OOTanSUuWLM7/wBAws3Ox8fO2t+MPnHF1uNduZmVdlWMLVm1Oc5xjStafY4Dhtnn+Y4/iNStrZt7ZxYO9azb4dL3rXJltEf1uOsze0z2iKxMzPZjnxb8SOE8I/Dnq7xE6gz4sPHdL8JyHKTTLkri+q9nW1cubV0cVrfPPu56U18FIi1r5Mla1ra0xE2c/RfprqOjvSjp/wBMNFjWsTWcK4vq9Has2aRpa+Pj2KTz7sKRpSPjI2FzKyPl9+7X51r862W8NxuHh+K0OMwVimLS1cWGKx27eate+SY7en12SbW9PttITxK615HxG6+6u645XNfY3upuc3uUyZcnecnwsuWa6tLeaZnvh1KYMPr9FPlHydnPpukAAAAAAAAAAAK+b25f7Id1d+fn9BoP5P8AgDWfL+n+VAPxu+yBy37B/AYm3R7rn8h/4e/ouW/X/wBd9/8A/d+s1AMRrEAAAAAAAAAAAAAAAAAGXfYV/ji9ufz8f8rfBvnX73/GTWu2dC/1X9O/pto/xnEj37V35HPxk9O//U96q9P+8u6s3VljSLAAfE5Lx7U8u47veLb7FhnaTken2Wi22HcpSsMnW7bDvYGbYrSVJUp8TGyLkKV8V9Na+afOj0bOvi29fPq56xfDsYcmDLSY7xbHlpbHePX7dbTD6fC8vv8AT/McVzvFZ7avJ8NyOlynH7FJmLYN3j9nHt6uWO0xP1mbFS3bvHft2+lWse0F7Yt12m90/U/pbn4l2zpYb7K3nEMutmVvFz+Obv0bTD+hTr5hes66uZLVXJ25SjS/hXYV9Mo1jSuHr7pnP0p1RyfF5KTGGM9s+nfyzFcmtm7ZaeSflaMfnnFMx3jzUmPm3TvZH8b+M8f/AAI6G671NimTk78Vg4vqLXjJF8+pzXGebR2fqmv4rHk3PqeN+lbxEzi2aWjvW0WnCl0xJcAAAAAAAAAAAAAAAAApWtK0rStaVpXzStPlWlafVWlfvVoHz+aeZ7B/u7l3Bdq9rpjyXZ1zOe9D8iXHsmWTepPO2PGr136Vp86luVfifRNdi52FpIXKUlD1YtI+v1eY0nT4F9Wzz/S0cZs5fPv8Jade3mt3vk1rW8+G/afXyY65KYYn1jvXt37+jVO96r7PVfCPx4ydb8Jo/U3SfifhrzGCMGOa6ulzePH8DktWbxHl+qNzPq7PJ2pMxaYzzbt29W8xm9VwAAAAAAAAAAAAAAAAAAA4F1S6haHpP065p1I5NlWMTScL45tN/nXci9CxbnHAxbl6zjUu3K+ml3MyKWsSxT51nevW4RpKUqUrwOU5DBxXHbvJbN60waWtl2Lza0Vifh1ma17z6d727Ur9u1oh2zoXpDlev+semujOEwZdjlOpeZ0eJ1ceHHbLes7eemPJnmlfWcethnJsZZ9IrixXtMxETMVlfdZ195H3N9fupfWbkuZfy7/LuTbHI1Mb9ZevC41jZFzF41r6xlX9DLB0lnAxZ1pGHrnZrKsI1r6aVrdU89sdS89yXMbN7Xnb2clsMW796a1bTTWx9p+U0wVx1n5d5jv2btvgL4TcN4I+EvRPhtwmti18XT3CaeHkLYvLNdnms2GufmtyLVj1rtcpk2s9YmbeWuSKxaYjux4dfZfAAAAAAAAAAAAAAAAAAfV0Wl2HJN3qOPamxPK2m82eDqNdjQpWU7+dscq1iYtqNKUrWtbl69CNPFK1+b24MOTYzYdfFWb5c+WmLHWPWbXyWilYj8+0xDgcryWnw3Gchy/IZq6+hxeltchu57zEVxaungvsZ8lpmYiIpix2t6zHyWP/ALM7tE1vZx2q8C6ezxI2+Z7vXY3K+f5lyzS3m3OR7y1XaZGsyq0pGs6aC5nXtTYrWlK/Bx4+rzWixTw26Sx9H9LaHHzWI3c2Ou1v3mva87OePiWxX+39Tze2Ks/2NYaZ/ts+0Lu+0d489V9X1zzbpvjNzPwHSWtTJN9anDcXeNHDu68d5iv4LU1cfIZYiZj4maZj0bBHf0RgAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAS6vdkJf8Ve5+P4eTcHr/ADafa0/pSz9mn/4r1N/2zpfwOVr2++7j/X7wNt/2F6pj/wBIaE/P9ZKuSlUMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANKXtkvZx4feH0eyOovTrT2o9dummtys7UXMOxSeXy/Q4dLmblcavWYUpdzMysfpdNNG1Kl76bmemsciPotUwx4w+HdOr+ItyPHYYjneNx2vhmle9tzBTve+tNY9b37ef4MV+u+JftMW9IWY+7i9srY9nXxFxdHdY8lknwq613cGryFNjLNdfp7ltia62Dm8eS8zTX14t9T/glN4+H9S68zFsVvNkmBLt9TsdDtNhpdvh39ftNVl38DYYOVblZyMXLxrkrV+xetTpGcLlu5GsZRlSlaVp86UQSzYsmDLkw5qWx5cV7Y8lLRMWpeszFqzE+sTEx2mJbXfH7+nyujqclx+xi29Hf18W3qbOC9cmHPr56RkxZcd6zNbUvS0TExMxPf5vnPW5gDyWr13HuQvWLtyzetypO3dtTlbuW5xr5jKE4VjKMqVpStJRrStK080r5fsTNZi1ZmtonvExMxMT9uJj1ifznhkx48tLY8tKZcd4mt8eStb0vWY7TW1bRNbRMekxMTEx82UfS7vc7sei9vHs9M+vHP+LWMXx8CxjbSGbahGlfV6KR2ljO8R81r8qV8UpXxTw7PxnWvVXDxWvG87v6tafiYrli8R69+39Nrf0YM659mPwB8Sb5snW3hV0lzuTP3+LkzaNta95mO3mm2jl1frvu/TPrPdlRa9tB7RS3bhbr1/wB5drCMY1uXcTArcn4p49U6xsRjWVfrrWkaUrX7ztNfGTxCiIj8Hs9u0du80x95+7P1rBGT3bHsd3va8eEnF44taZilNjbile8/iaxbLae0fKO9pn7ro/qX7SLve6twyMfnHcVz/Z4GRCVr8zrWXh4OJZsypWkrNn6Fh2MiMK1rKX6K/OdKyr4n9Xj4fJeI3W3LRau91Dv5cdomPh1vTHSIn+tjyUrbt+faZ+6yf0V7GPsw+H18Wbpfwd6S0dvFeMn1Zk19jb2MmSs965Mn1Ts5cNrRERHpirXtWO9fn3wv2W12e5y7uft9jm7TOvSlK7l7DKv5mTclKtZVrO9kTuXJea1rX5y8fP5OnZMuXNecmbJfLe0zNr5LWvaZn1nva0zKSeloaXG69NTj9PW0dXHERj19TBi18NIiIiPLjxVpSPSIjv27+nq9B63LAf1GMpyjCEaynOVIxjGlaylKVfFKUpT51rWtfFKU+upETM9ojvM+kRHzmftPy1orWbWmK1rE2taZ7RERHeZmZ9IiI9ZmflCZ97B/2bu16Ncfu91vWTQS1/OuZa6eL030W0xq287j/GcqxKzf3d/HvwpdxM7cxv5liFm9CM6YVvEyrX6G/GVZj+Bnhzl4fBPVXMYJpvbmOa8bgy17X19a1ZrbNato71vm816xExExSKXj8U1sveq+2doeI/LU8A/Djlq7fSvTe5XP1pyujmi+rzHN4MsZMXGYs2OZx7Grxs4tbLbJjtNfqq+xgv647ViSwkipVAAAAAAAAAAAAV83ty/2Q7q7/E0Hj5f/AGg1f8/z+/8AyfeQD8bvsgct+wfwGJt0e65/If8Ah7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZc9hla07xO3OtP3XOCU/n5LrKf0u2dC/wBV/Tv6baP8ZxI++1ZHf2dPGSP/AKveqvvJvSs31ljSJAAARyveGO0GXVLofx7uR4lqq5HLekF2xrOTyxbHxcvP4Ts8+Vq3CNu1H4sq63Z7S5scm/L4lLeFYn6qQhD10jv7QPSM8pwmv1HqYvNt8RMYtny172yaWTJMRHaPWfh5Ms5LWnv2pWe/aIXI+6C9oeOhfFDl/BfqDfjD0/4iY8u9wcZ8vw8Gr1NpakZL2te8zSv1bpaGPTwYo8k5NnLWIm1rRWYTiF7ZnAAAAAAAAAAAAAAAAAAbRfZF922V2n94HB9nn51zH4J1Hy8fgHNsWk6xt38bd3K42lvylWtbdqGHyC7rMvIvSty8Y9i5StYU8yjk7wm6st0r1do5cl5ro8jeuhu17zEWrmny4bT9ERTPbHe0zE/W1mPT5oM+8I9n7B4++zv1Ro6mrTL1V0bgy9W9MZ5rFr4s/GUjPyeKsR2vkts8Rj3dfFjraO+bLWYi0/WzYmY2TYzMbHzMW9byMXKsWsnGv2pUnavWL9uN2zetzjWsZ27luUZwlStaSjKlaV8VWEVtW9a3pMWresWraJ7xato7xMT9MTExMT9pp5Z8OXWzZtfPjviz4MuTDmxZKzXJiy4rzTJjvWYia3pes1tWYiYtExMd4ed5PUAAAAAAAAAAAAAAAAAAjS+8R94V7p90p4t2ucQ2lbG/6pTt7vnUce7WsrXDNbfnexsG58KsZY+VkbvE1eVGlydfiYXrpS1WM/XSN3tCdXzocVq9L6mXtn5SYz70Vn1jTxWma457THlvbNXFeO/zp39PXvF1nuevZ1x9Xde89469Q6HxeI6Frfi+lrZscRW/Uu7hrizbdPPFq5sGLjNjewT5ax5NiInzxNfLMMFDhsmAAAAAAAAAAAAAAAAAAAN9nsF+yuPcF3FXut3Ltb9J6edDJw2FmGRZpdwdvzTMtRxtZqsikqeKxsYWbl7e3KMqSjka6196laM7eBXRn4P9RTzW3j83H8HMZKxaO9M27eIrixWiY9YrS98sTE+lscfalVF71v2lreEfg5j8MentyMPWHilW2nkthy+Tb47pnXyTm3t/DMW7xOXZ1tfj7xasxbDuZPtxKdZ9X1JxNWQAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEuX3ZCv/ABc7nY+fr5Dwmvj+DVbOnn/Olj7NM/6n6mj7expT+1iy/wDK18ffdV/158D7fa4jqeP297SSs0p1CoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8rSlaVpWlK0r8q0rTzStPwVpX6w+XyRv/a6+xut9fq7HuD7ZdLha7qvYsX8vmvCsW3bsYvOrWNCtymfq7UPRKzyOln12pWbdMiOyjZxMexi2sis7t2Oni14Pxz05Of6awUx8rWtr7ulSIrXeisTPnxRHby7EV7x2jzRk7UrWtbd5m5r3e3vHcnhLGn4Q+N3JbO50DlzYtfpnqbPe+XY6VvmtFJ1d+9vPGThpyeW8ZL/CnSnJsZsue+KK46QxuUcX5BwrkO34pyvUZ+h5Foc27rtvp9njXcPPwMyzWnrsZONfhC7an4rGdKThGtYSjKlPEqIc7WrsaWxm1drDkwbGC8482HLWaZMd4+dbVmImJ+U+sfKYlsk8FznEdTcRx/P8DyGryvD8rrY9zj+R0s2PY1dvXyd/Llw5sVrY717xNZmtpiLVtX5xL4L0PqgAAAAAOyulXR/qZ1v5dgcF6U8L3/OeU7C5bhZ1PHtbl7PJt25y9MsrJt4lq9Oxh2Y0lcyMmcaWrNqE7k60jGtX0uL4jkub26aPFaWxvbWSYiuLXxXy2iJn8VaKRM1pHrNrT6ViJmfSJdL698ROifDDp7b6p696l4npfgtOl7ZeQ5jd19LBe9a964MN9jJjrl2MszWmHDW03y5LVpWJm0JfHsx/YZaLo3laTrT3X42t5b1BsVx9pxzp3Glu/oeK5dusbuLkbm5Sd781tljXaQybUbc8Ozj3o27WTjX6W7lLktvDTwQwcPbBzPVVce3yFfLl1uOjtbBq3j1rbNMd5y5Kz2tHaaVrPaLVntPfXj9t33pHK+I+Dk/DTwCz7nT/AEhljNocz1jab4uW5/XvE48+HjaTXH+B+lnpNsGS1q7GTNjtfJhzY5vSayUMfHsYlizi4tm1j42PbhZsWLMI27Vm1bjSMLdu3ClIwhCNKUjGNKUpSiR9a1pWK1iK1rERWtYiIiI+UREekRClvNmy7GXJnz5L5s2a9smXLktN8mTJeZta972mbWtaZmZmZmZl5n69YAAAAAAAAAAACvm9uX5/vh3V3+JoPH8H5g6z6/5fP8iAfjd9kDlv2D+AxNuj3XP5D/w9/Rct9999qAYjWIAAAAAAAAAAAAAAAAAMt+w3/HE7c/xu8E+0usds6F/qv6d/TbR/jOJH72q/yOnjL/xedVfeXdWcKyxpEAAAOI8/4ToupHCeWcB5NiW83Qcw49uON7XHuRhL1YW51+Rr8iUPXGcY3oWsiU7M/TWsLkYypStaOJv6WDkdLb0NmkXwbmvm1stZiJ+szY7Y7THeJ7WiLTMT9E9pdh6T6m5XozqfgOrOE2La3LdO8xx3NaGatrV8u1xu3h3MMW8s1m2O18Na5Kd4i9JtWfSVZt3mdu+/7W+5Dql0b3mJPHt8b5Llz0d2tuUbOVx3Z0t7XR3LFyvmN+lrWZ2Lj37luvp+k2r0fEaxrCNbHWPT2fpfqPlOHz0msa2zecE9u1ba+XtlwTWflbtiyUraY9PNE+kfJuy+zf4wcT46+DHQniRxexXNbm+F168pj89bZcHMaM20OUrlpHrinJu6ufNipaO/wcmOe9omLTi86yzkAAAAAAAAAAAAAAAAA8ti/exb9nJx7s7ORjXbd+xetyrG5avWZxuWrsJU+cZ25xjKMqfOkqUrR+1tatq2rM1tWYtW0T2mLRPeJifomJjvEvXlxY8+LJgzUrkw5sd8WXHePNTJjyVml6WifSa3rM1tE/OJmFh/7Hzu2sd1nZ/w3J2edDK550ws2On/ADOzSdJXLdzU262tDdnStazrLI47b1d67OVa+q9cnX5efCwXwi6sr1T0jp2y3i2/xla8fux39YnDHlwT6zM97a8YpmZ+czLT994n7PuTwE9onqPDo6tsHSnXOTL1d01kmnlpenIXjJyuOsxEViMPMX3seOsRHlx0r8/m2qMpIGgAAAAAAAAAAAAAAAAOO8v5RqeE8V5HzDe34Yum4vo9pv8AZ35zjCNvB1OFezsmvql8qSrasSjClfrnWNKUrWvhx9vaxaWrs7me0Vw6uDLsZbTPbtTFS17es/T2rMR919jp7g+Q6n57huneKw2z8lznJ6PE6OKlZvN9rf2cerhjy19ZiL5Ym3b5ViZ+hWj99fcxvO7Luc6odX9rmSydds+Q5ms4rbjOVbFjimlufmTx6tmEpSpCWTqMLCyMj0eI3L85z9MfV6aVudcdSZ+q+puT5fLfzY8uxfFqxEz5a6mGfha/aJme02xUpa3b52mZ7R37Ruteyz4KcX4A+CHQ3h3oa8YdzR4jX3eevNaxly8/ydPwQ5iMlorWb1w8hs7OHD5u80xUrXvPbvOILqSQwAAAAAAAAAAAAAAAAAD7fGuP7PlnIdHxfS488vb8h22v02txoUrKV7N2WVaxMa3SlPn87t2Pn8FPNfvPdra+Xb2MGrhrN82xlx4cVY9ZtfJaKVj9uYfM5rl9HgOI5TnOTzV1+P4jj9vkt3NeYiuLV0sGTYz3mZ7R6Y8du3257R9KyR9nN2l6js57Wun3TCzixt8py9Xjck55lztxjl3+Vby3+amywsicYx+JDTZebk6zErWnqjj2IRlKVfMq2M+HfSmLo/pfj+MrTttXxU2d68x9fbaz1+LlpafTvGG9746f8GI+lphe2R7QHIe0b47dXdc5c834LX3s3C9Ka9bzbXxcDxd/qHS2cNZm3kvyWDVw72xET2nNltMRWO0RnY7yiuAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACW/7sjL/gLubj96u84ZX+Wmt2FP6UsfZq/wBo6lj/AOX0/wB7Hk/5Wvt77qP9dPBGf+xnUsft7unP+JK5SnUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANX/fZ7Kjt072tNnbLY6exwHqzTFuR1PUjj2NatZU78aSni2t/h/Cnb2eut5EqyvWrH0PMu2rl23TNhWVuVvGXXPhZ071phvkyYa6HKxWYxcjr1itpt6zWM9O0xlxxae9or5LzEzHnj0mJx+yv7enjH7MnJaulp8jl6s8P5z0tyHRnMZsmTXritNa7GTidn4lb6O5fFEVxXy/VGtjvTHada0RaLREe6j2Mfed20X87Y4vB8zq1wmzcuyx+TdPMDK3GRTDt1rWuVtNHgV2OXqbUIUrO5PKvemkYynWtKUqiX1R4OdZdN2vkrpX5bSrMzXZ4+ls1vJH9flwY/iXwxEeszae0R3nu2FfAj3kns2eNmLV08/VGt4fdTZK0rm4TrDbwcbhnYtEdsGhym3Gng5C97T5aVwYu82mK9pmWqLZa3YafOytZtcLJ12xwrsrGZhZlmePlY16Pj1Wr9m5SNy3cj5p5jKNK08/UxXkx5MN7YstLY8lJmt6Xia2raPnFqz2mJj7Up76e7qcjq4N7Q2cG5p7OOMuvta2SmbBnx2/E5MWWk2pek9p7WrMw9J4OSAAyE6I9qfcJ3GbKzrujfSnmPN6XL0LN7ZafR7HK02BWdaUpPY7THxruLhWqefMrl+cYxpSta18Uff4TpbqDqLLGPh+K3N3vPa2XDgyWw4/u5MtazWlftzM9mIvE7x58IfBzSybviP17050vNMdsuPS5HlNPX5LbisTM009HLmx59rJPbtWmKtrTPaIj1SGOz33c7lW3vYXKe77l9OOa2vwr0en3BczByNvOsa0uR+ncjnHZ4EbN3zG3ew6au3fhSFyNb0azpWMgekfZ42s002urtz6nx/W2jj9C9LZp+n6/ZmMmOIn0iafCi0dpjv6+lQftFe+P4Hj8ezwXs8dO/gzux8TFPV/VWts4eOr370tGrw1Z0tq2TH2m+LZnevitM0n4cxWYmTL279oHbx2saC1oOivTXQ8Up8OEM3b2semRu9pdjGkK5OdsL/rn8e5GMY3Po0ca1KlP8FTzXzJTp7pHp/pfXjX4bjcGr6R580V82bLaP66+S3efNP0+Xyx9xSX4w+0P4weO/L35bxL605Xn589ra3H3y/B4zRx2mbRg1dTF5axipMzNPjWzZI7/wC2T2jtku7IwoAAAAAAAAAAAAAAr5vbl/sh3V3+JoP/AHDrPq/7/X5QD8bvsgct+wfwGJt0e65/If8Ah7+i5f7777UAxGsQAAAAAAAAAAAAAAAAAZbdh/8AjiduX43uBfV//U2s/wC9f3nbOhf6r+nf020f4ziR/wDaq/I6eM3/ABd9V/eTdWcSyxpDgAAAIv8A7xf2if3UcA4b3XcT1VJbTgs8bifUC7jWaeq7x/ZbCdrU7C/6I+q5fjt9pjYkrkpVpHFtRj6aUjSqMvtD9JfVOhp9U6mLvl0Zrq781j56+TJMYslu3rNoy5a07/2MR9ruvG9zl7Qv4B9W9SeAfP78xo9U1z8/0jjzZJ7U5fS1K35DUxRafLTFbj9HNsRSsRNs97T3mbdkOdEFsZAAAAAAAAAAAAAAAAAAN3XsLO72Pbn3W4fT7kuypidP+t9mPFM/6Te9GHruRVpTI0ewt26yjCubsNhh6/SRlKtfNvL9MaVl4Zq8D+rfwvdVU4/Zy+Tj+brGrk809qY9j8VgyRHeI8+TJTHh79/lb0Vje9L9nifGTwD2eruF0pz9W+GGSef1PgY/NsbnDRM4eU1L3iJtGtqamzt8nMRH4vB3mYjunvJ3NUAAAAAAAAAAAAAAAAABH79v93hz6I9uuv6EcV2NMbm/XK5GxsfgXvh52t4Rr8meVmbCxWMvPpy9lrLOovUrGtJWM27T5VrStMB+PfV88J09j4LVyeXe5uYrk8tu18eljtN75I9e/wBdkxVxW9PxN5+2tu90p7OtPE7xj3PFXntP43THhdS2XT+Lj+Jq7vVG5gjX1tPLEx276+lvZeQxzExNcutjn1j0mDWhG2igAAAAAAAAAAAAAAAAAAEgr2BHZVDrl18ze4HmWsrkcC6JS+Np45Fmk8Lbc4zbNMXDw70ZxrS7ZxdbmbDPjKFY1t5mFZ8y+VY1z74DdGRzfPX5/cxebQ4WfNh81YmmXevEVpSe/wA60x3yZPT5XpX19FRvvZfaXt4W+E+t4R9ObsYerPE6Ph8jbDk8uzx/S+rknPs7OOa2iceXPu62pqTF4mL6+zk7R6xMTjk22ryAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAls+7JS/4L7mI//bfh8v8A1fnU/wC//wAkr/Zqn+ldSx/8rpz/AOTu1+vfcx/q7wSn/wCYdRx3/P29af8AElfpUqDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHju2bV+3OzftW71q5GsZ2rsI3Lc41p4rGcJ0rGUa0+VaVpWlafW/JiLRMWiLRPziYiYn8+J9HnjyZMV65MV748lJi1L47WpetonvFq2rMWrMT6xMTExLGbqx2X9rHXGk6dU+hvAuWznblbrdytVXCvemVZV81uaq9gSlPzKtfVOspfhrWnyda5Xo3pfm+/4KcJo7czHbvfFNJ7T93FbH3/X7s29Ae0p47+F0xPQfij1Z0/Wt4vFMG/G1j7x2jtFN/Ht1rXtWI8tYrHb5dpnuwI5H7CL2fW/y8jJx+B8g45G/OUo4vH93j4+Nj0l9UMeObrc65GEfvUncnX8NauibHgZ0Bnva1dDY14tPfya+eta1+5WL48kxH3Jmfu90r+G96n7XPE6+HBm6r4jmbYqxWdjluLy5s+bt/XZba27q0m0/TNaUiftQ4VH3fPsHpOk62OqEqUl6qwrybSeitPPn01pTjFK+mv1fKvnx99w48Aeg4nv5eTn7k7ODt/FO/wC+7Nb3uvtYTWa/F6GrMx280cHyfmj0+cf6+du/0/Lt9xkj0x9j72AdL8rD2Ov6E6PkW2wJQuYu15TkZewy7V2HitLtI413BxZT8xpWvrxpQ8+f0LsXGeEXQXGWpkpweDYzY5iaZdq18l4mJ79+1ZpTv8vnXt9xhfrf3iXtbdc4NnT2/FTk+H4/bramxocDh19PXyY794nH3z02s9a9p7R5c0WiPpbE+N8N4lw7Cs67inGtHx3Cx7UbFrH0+sxMCEbUKeIwlXHtQnOlKfLzclKVfv1qyFraepp0rj1dbBr0rEViuHFTHHaPlH1sRM/rzKHnNdSdQdR7OTc5/muU5jZzZLZcmbkd3Y27TktPe1ojNktWsz9qkVj7UOSuS+KAAAAAAAAAAAAAAAAr5fblV/8ApDur370NBT/1Bq6/0oB+N32QOW/YP4DE26Pdc/kP/D39Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy17EPl3h9uX43+A/5+T6ujtfQ3p1f07+m+h+/tYoYA9qmO/s6eM3/F11ZP7XB70rONZa0hgAAAHWnWPpdxzrT0u510t5Xh4+ZpObcZ3GgyI5Fql6OLd2ODfxsTY24V+X0jXZNy1m40q0r6b9i3LxXx4fN5ji9bmeM3uL26Vvg3dbNr280d4rOTHatckR/ZY7TF6/atWJd18OeueZ8NOueluuuB2MuvyfTHN8dy2GcN5x2z49PaxZs+ne0evwdzBTJq5oiY82LLeO8d1ZL3LdE+Q9uvXTqX0b5NiXsPZcI5Pna61bvxrG5d1N6Uc7R5cqVpT/xzTZWDlfVSn6d8vkrU6k4XY6e5zkuH2azTJpbN8cRb0mcVvr8F/wD7eG1L/a9W7l4K+JvEeMXhb0T4kcJsY9jS6o4PV3L2xTE0x7+OJ1eU14mJn01uRwbWD5/9bdGPiMogAAAAAAAAAAAAAAAAPq6LdbLje61HIdNlXMLbaPZ4O31mXalWNzGz9blWszDvwrT50layLNudP34/N7cGbJr5sWxhtNMuDLjzYrx865MdovS0fdi1Yn9ZweU43S5njeQ4jkcFNnj+U0trjt7XyR3pn1N3Bk1tjFaJ+dcmHJek/clZNezk7oNX3Zdp3S/qVj5Vu9yDF0WJxnmONW7S5l43IePRlp8q/mw8+u1d2v0Cu1hGcY1lay4Sj6o1pKtjfh31Pi6r6U4zkq3i2xTBTW3K9+967Gv3w2tePnE5fh/Fjv8AOLxLS79snwN3vADx+656Ky4L4+Iz8pn5vpzP8OaYM3D8vMcjgxa1u3lvj0Pqr6gtNZtFcmvas9piYjOl3hFkAAAAAAAAAAAAAAB87cbbA0Oo2m82uRDE1mm12btdjlXK0jbxsDXY13Ly7861rSlIWcezcuSrWtKUpGvmr15suPBiy58toriw475clp+VceOs3vafuRWJmfznM47Q2+V5DR4vQxWz73JbmroaeCsTNs23uZ6a+virERMzbJmyUpEREz3tHaFb57TTuv2Hd33Z9RuoEcqdziWk2uTxDhGJC7W7h2NDx6cdRDOw/Na0jb3lzA/Ni54lKMrmXKsa+Kq6fErqrJ1b1XyPIebvqYcttTSpE96Vwa8/Bi9PuZ5x/Gnt6d7tzT2JPAPT9nn2f+jekZwVp1Byehh6h6o2LY4ps5eV5is8jbV2e0R5r8XTb/A6szET5NeO8d2vt0FLgAAAAAAAAAAAAAAAAAByPh/FdxzjlXHeHcfxrmZuuT7nXaPWY1qErk7mZssq3i2f0EP0VYQlc+JcrT9TbhOVa0pStacjU1c27ta+ngrN82zmx4MVYiZmb5LxSPSPojv3n7URMvjdRc7x3S/A8x1Hy+emtxnB8bucpvZslopWmtpYL58n11vTzWinkpHzte1axEzMQsoPZ/8Aano+zzti6edJdfjQt761qcbd82y6xh8fL5dubf5p7y1cuwjGl2xgbLMzMPC8+qUMW3bhWc/HqrY70D0tg6Q6Z4/icdYjPGGufdv6ea+3mj4uaJmPnWmS96U+1WI7zLS39rbx75T2i/HDrDxB281rcVfkM/GdM68TaMWDp7jb/UXF5KY7TPky7elr6+xs9u0Wz3taK17+WM1Xc0aAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAS0vdlK/wC8+5WPn69lxKvj+DBzKef86V3s1fiOpY/+U1P/AFLtf/33Ef6p8Fbf/M+oY/b2taf8X/TsljJVKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADLPsSrWneF25Vp9f3X+AfajVu19Df1XdO/pvx/8axMA+1P+R28Zf+Lvq37x7yzlWWtIUAAAABE39427QYfA4T3ccQ1EbdLNMfh3U27iWa0jWt3JuW9LyDY3aUr5vXruVrNHarWsY+i1ajSlZfXFT2iOko8ul1ZqYe0R5dPk5pH02tMYdjJP27TbFgjv29IiIX8+5t9oe3xep/Z86i5GbfEnN1H0RTYyd7R5MNb8nxGnSZjtjx48G9yuTtFp817zPaES9FJf+AAAAAAAAAAAAAAAAAAka+7zd3UOl3XPkXbhyrZ/A4t1isXs/jFvIvfDxsTm2qwo5M7k7lyVbcIZWm1d/Es2aUt1uZd+HiUpT9NZD+z91ZHF85sdO7WXy6vL1nJrRa3atN3FSLTMzPpEWw4ppEene9o7esqb/e++z3brrwt4fxm4HR+Lzvhzlx6nOXw4/Pm2OmN/ZnBWlaUiL2vr8lvYtjJknzxTXxW71rFfNE2NNFrLgAAAAAAAAAAAAAANJ3ty+8Gnbd2pbDgPHNlXE6h9brlOJ6mWNepHO1mi9Uszc7Stqnmf0TLw9dmaWdytIwpczaR9Xq8Rrhfxu6u/C50rk0NfJ5OQ5qfqXDNZ+vxYO83zZe3z8tqY74e/pHe/bv39FmfuufZ1nxn8fNPqzmdKNjo/wwpPP8hGfHM6u9yvlrrcZoxee1fqjX2dzX5KtO82mmrMzXy95iAzWtZVrKVa1lWta1rWta1rWtfNa1rX51rWvzrWvzrVA/5/NtiRERERERERERERHaIiPSIiI9IiI+UPwfoAAAAAAAAAAAAAAAAACRX7vv2WW+sHWvbdyvM9XW/wzo3WVjiscmzSuPsec7C1TGtz8XYyhk4uHqcnbVlW3Snws6zZ83KSjWEpC+AXRkcvzWXqTcxebT4afLqxav1uTeyR5In1iYtWmK2afSPrcla+vp2mnX3uPtLZPDvwy4/wW6b3oxdSeJERl52cOSfjafS2pknNevfHatsGfZ5DDoREXmfiauTJ2pMW80TbU02siAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACWb7spX9J7lI/hzeKV/mw8mn9KVns1T9b1H93Jq/+pZQH77eP6Z4LW/+bc/H/nGGf8SWWlYoDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q//F0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMsexX/HB7cfxw9P/ALUat2vob+q7p39N+P8A41iYC9qb8jt4y/8AF11d94t9ZzrLWkIAAAAA6Q7kOifHO4jol1H6P8owsfMwOZ8X2usxa5MYyhhbmWJdno9lHz9U9bto4edCvmn6KxSla+HxOo+F1uoeF5HiNqlb49zWy46eb5UzTSZwZPz8eWKXj7tWT/BnxN5rwe8TujfEXgtnNrbfTXOaG7n+DMxbZ42NjHXlNGe3zru8fbY1bfP63LPaO6sk6z9LuQdFuqvPOlnJ8TIw9zwjku00eRbybcrV67YxcmdMDMrblSlaW8/ArjZtmv6mVrIhKNaxlSta1eZ4zY4blN/i9qlqZtLZy4LRaO0zFLT5L9p+jJTy3j7cWiY9G7l4bdc8R4ldB9Kdd8HsYdnjep+E0eVw3wXjJjx5c+Gs7Wt56zMTfU2oza2SPnXJitW0RaJiOsXzHdwAAAAAAAAAAAAAAAAHNum/O950w59w/qFxzJu4m64dyPUciwLtmcrcpXtVn2MyliUo1pX4WRGzWxej5pSVq5ONflVzeO3s/Gb+pyGtaaZ9PYw7GOYmY72xXrfyzMfRbt5Z+5Mus9Z9K8Z1v0p1F0jzODHscZ1Hw3I8Pt48lIvWMe/q5db4sVmJj4mGckZcc9u9b0rMesLNPtI6+6Dub7eOl3Wbj+ZazLPLeMYNzaStSjKlnkWBD8zeRY9aUrX00sbvEz7UKV+fohTzWv1rKek+ewdS9P8AGcxr3i8betScsxPftsY4+HsV/Wz0yRH3IaSXtBeE3LeCPjB1z4bcvr318nT/ADm1TRi8TE5OH27fVvDZu8/OcvGbGpktMenmtPpDI92JhoAAAAAAAAAAAAB4MrJx8LGyMzLvW8fFxLF7Jyb92VIWrGPYtyu3r1ycq0jC3btwlOcpVpSMY1rWtKUeN7VpW17TFa0rNrWme0RWsTMzMz8oiImZl7cGDNs58Otr475s+xlx4MGLHWbZMubLeMePHSsd5te97VrWsRMzaYiPWVd77X3u7vd2Xd7zPN1WZdvcB6Z5WV0/4ZjVnWdqEdJdpg77NtTpWlq9Z2W9xM7Oxb0IUpXFyIUjOca0lWvnxb6tnqvq7dvivM6HG3tx+nXvMx/SJ+HnvE/Ka5M9Ml6WiPxNo7TMercG93j7PWPwA9njpvU39amPq3rbBg6u6lzxSK5LW5Sk7fE62Ss9748mlxWxq6ufHa3f4+G0zWkx5a6sGL07QAAAAAAAAAAAAAAAAAHK+C8N3fUPmXF+Dccxb2bvOWbzXaLWY9i1O9cnlbHJt48Z/Dh+ilbsxnK/erTxSFm3Ocq0jGtacrR08/Ibmto61Jvn2s+PBirWJmZtktFYntH0V7za32oiZfB6p6j4zpDpvnOqeZ2MetxfAcXucrvZsuSuKlcGngvmtXz3+ti+WaxixRPfzZL0rETMxE2WHYx2vcf7Q+2rpx0c02LatbHV6TF2PLsmFLdZ5vL9vajseR3a3YRjW5YhuMrOhh0lWdbeN6LfxJ0p6q2Q9EdMa/SXTfHcPhpFcmLBTJt2jt3vt5Y+Jsz37etYzXyRTv3mK9o7y0q/al8c+X9obxq6z8R+Sz3yae9yefT6ewWm8V1enePvOnw2OKWmYpltx2DVtsTWKxfN5reWvfyxl67ajyAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP8AVvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAlj+7Ky/RdyMfw5HF6/wA2Ne/7/wAyVXs1/PqP9Fq/+pdQN77es9vBe30Ri52P/LYv+n7aWilcoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMsOxb/HB7cPxxdPvtVqna+hv6runf034/8AjWJgL2pfyO/jL/xddXfeLfWdCy1pCAAAAAAIdnvF3aBb4tzjhvddw/U/C1XNoWuL9RJ4tn1UhyTBtzt67cZdbUaRxse9q7Oq1cJXI+LmVGlPi1nP0UiF7Q3SMau9p9VamLti3Yrq8hNa/LZpE1x5rzEfW1tjjFijv87fT6ti/wBzn7RF+e6X6k8A+ouQ8+/0xbJzvR1c+XtNuF2b0vucdrxeZtmzYt7Jv714pPemvPrSK18yL0jIvJAAAAAAAAAAAAAAAAAASsPdx+7imBuOddpnLNr+k7ml3mPTe1lXvMqZ2Paty2+h11qtaem3XFtbPd3aRpOVblLkq1jH6pS+zv1ZGPNvdKbeX0zebc46L2/r6xE5tfHHf5eWMuefTv37z8lC/vk/Z9nb47pbx/4DQ/pnHfD6c6zvgxzFZ1c2S8cfy25eInveM+TR4zHNprHlmlY9fnLoSza94AAAAAAAAAAAADVD7Ynu9x+1LtD5b+ZWfHG6g9Vbd3gHDLcZ0+Lbns7Up7vKuWo1pdpZpx6zt7Vq7GVukMqVr9HWtPRLFfi91dXpXpLb+FeK8hykToaUd/WJyR3z3mI9fL9TxlrE947Xmvr6J8+7o9njN49+0N0/9X6s5ukeg74+repb2r9ZemjeK8Xgpe3ek5J5fJx+S+Oa3m2CL+kR9dFeTevXci9dyL9yd2/fuTvXrtyVZXLt27Ks7lycq+aynOcqylKta1rKta1+dVfkzNpm1pmbWmZmZnvMzM95mZ+mZn1mW35jx48OPHixUrjxYqVx48dIitKY6VitKVrHpWtaxFaxHpEREQ8b8eYAAAAAAAAAAAAAAAAACST7vX2W2eqHVred0XNdVW/xbpPKeu4PTJs+LWZzbPt/RZ5tv4sZQy8TB1N7cY9z4Uf0nO+F6rsZQpCUjPZ/6Njk+Wz9T7uKZ1eK749LzR9bfdyR5ZvHeJi9KYrZqz2+WTt3nvHaaYPe9e0rk6H8P+L8C+mt+MXO9fxTd6onBk75NbpjUvOeutf4dotr7G1yGLjs1PPP9M1ZydqTW3miaemY1pgAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASwvdlpf747joeafO5xqXj79fGPcp/m81/70Sp9mv8X1F+frf+rZQX77aP6T4NW/4PNx+3lpP+L95LWSva/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/wCLoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZX9i9fHd/241p+7F09+1Wqdq6H9Orunf044/8Af28MMB+1J+R38Zf+Lnq/7w76zpWXNIMAAAAABjF3jdu3H+6btz6ndGd/h2sqXJeOZ09FO5SFK4vKNbarseNZNLkoyrC3a3eLgTv0jWFblmM7dZxpLzTrPWHT2v1R07yfDbFIv9U615wTP9btY4+JrW7/ADiIz1pNu3bvXvDN/s5+MPL+BPjH0P4k8TsXwRwnNateVrTzT8fgty8afNYPJWY818nGZ9quLvForlmtorMx2ms26h8H3nTTnXLeAckxbuHvOH8g2vH9jZvWp2JVyNXm3sSt6Nu5+ipZyY2o5FiVfNJ2btucZSjKla1s8ho5+N3tvQ2aTTPp7GXXyVtExPmxXmveIn6LREWrP01mJhuzdIdT8X1r0t0/1bwufHscX1FxGhy+nkx5K5axh3tbHsRitevpOTDN5w5Y9JrkpesxExMOGuG7GAAAAAAAAAAAAAAAAA7t7cetHIO3vrd036v8by7+Hn8L5RrNnkSx5SpcyNT8eNjd4XiP6r6bqL2bieK0r4+N5pStfk+107zOx0/zfG8vrXtS+ltYstvL372w+aK56enz8+Gb0/8AtMZeMvhrxHi94Y9Z+HfNa+LY1OpuC3tHDGWKzTDyHwrZeM2u9vSPqXkMetsfOP8Aa+3eIWcHRvqfoOs/S3gnVHjGVYy9PzbjGo39iWPdjehYu5+FZv5eDKcK1p8bAyp3sPIhXxK3esThOMZRrSllnD8nr8zxejymtat8O7rYdis1mJis5KRa9JmP67HebUtHzi1ZifVpFeI/Q/LeG3XXVXQvOYMuvyPTHN8jxOWubHbFbLj1NnJi19qtbRE/C28FcezitHetseWtqzMTEuy30nSQAAAAAAAAAAH5KVIxrKVaRjGlZSlWvilKUp5rWta/KlKU+da1+qh8vm/YiZmIiJmZmIiI+czPpER92ZQD/bi93tvuU7s9nw3jOz+mdPuikbvDdTSxdrLGyuQY/iPJcm7bpWsK5ODuq7TWwuU8V+DCsfn581gZ429XR1J1Xl09bL5+P4XzaeHyz3rbYr6bNpj5eamb4uOJ/sYbZfuvfZ4v4Lez/o9Sc3o/U3V/ibanUnITlp2zYOIzd54XDjvMRaMO1xsaO5ak94+Jbv8AcaWGGllgAAAAAAAAAAAAAAAAADmvTjgm+6n884j094xiXs3fcw3+u0Otx7Fqd+5W9n5ELUr3wrf6KVvGs1uZN6tPFIWbNycqxjGtac3jtHPye9qcfrUtfPuZ8eDHWtZtPe9oiZ7R6zFY72t9qImXWusuquK6H6V6g6v5zYx63FdO8Vucru5cuSuKkYtXDbJGPz3mKxfPkimDFE+tsmSlYiZmImy67Lu2jjfaX259N+jHH8WzYv6DRYeRybJteiX5ocu2VqOfybM+JClKzs3t3k59zGpKU627E4QpOVKeqtkXRvTWt0n07x3Da9IrbBgpbZtHb+mbeSIybN+8fOJzWyTXvM9qzEd5aUftKeNnNe0B4ydZ+JXL7GTLi5bldjDweHJ5o+pOntLJbU4PWmlp7UyY+Mw6tc81ivny1taa1me0ZUu0sEAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/AFb8D96N1GaRsXZgAAAAAAAAAAAAAAAAJXXuy9f+Ee4yn4Y8cr/NalT+lKj2a/8AbOoY/wC1/wB+J/5FB/vtY/1H4Nz/AMLmY+763j/kS3ksGvuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/8Ai6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGVvYz/jfduP44+nn+flepdp6I/qu6c+7zPHfxrEwL7UcRPs7+M33PDfrCf1/wB31nWsvaQIAAAAAACFL7wx2e2+mHWnj3cvxLV/A4v1et29dy2Vi1SlnG5trMWWPCfi3GMbNnJ0uuwZyrP1VuZl25X11lP00hj7QPSEcZzOv1JqYvLrcvEY9ua1+tru46zWJ9IiIi2HHSZmY9bzPr6tmH3QXtFX658NOY8FOoN74vOeHl77vT9cuSZy5+mN7PGa1Zm9ptly4OT3NqtYr28mvSkeXtXzTHBR1XLgAAAAAAAAAAAAAAAAAJlXu6XdvPmXTPmXa1yva0u7jpzcvcm4Lbyb3plPi2zzbdzYYNqt2UpZGRb3WyzMmMLcqVtYkPHwqQt+tML2eerJ3ON3Ol9rLE5uOm21oxae0zq5ckTkpHeZm1ozZb27R8qx8vRrg++M9n2vTfW3TfjtwGhNOO6ypj4Pqq+HH3rXntHWtTT2rxjiK4cN+M0tfDNrx/TNi/4vzW8qTckspFAAAAAAAAAAAa/vaZd1Wr7SO0rqRz25l2bXKt7qsnh/BcK5dpavZ/IN7CmDcriV9UZSyNZrMjN3EaQ81pTBrWtPTStadB8SuqcXSfSfJb83rXaz4ramjSZ7WybGePJPk9YmbYsdr5YiO/4hLb2JfAbe9oL2gei+k66+XJwPF7+HqLqnZpjnJi1OI4q07VI2I8s1jDvbuHW46027RP1V2ie8wreNttM/ebXZbra5NzN2m3z8zabHMvS9V7Kzs/IuZWXk3Zf865fyLty5Ov35SrVXTly5M+XJmy2m+XNkvlyXn1m+TJab3tM/TNrTMz92W5voaOpxejpcboYaa2jx2pr6Onr447Y8GrqYaYNfDSPopiw46UrH0RWHz3rcsAAAAAAAAAAAAAAAAABJo93i7LrHPuo3Ie6/m2p+Px/pvW9penf0mz4t5HMMulMXL21it6MreVjYWrlutddpbjX4Wbct1ldjOHorJT2feja7/I7HVW7i82vx3mw8d56+ltu/1t81e8TFqUxTmx2iPleY9fTtNJfvgPaVy9JdG8P4BdMchGLl+tPh8l1j8HJ3vh6c15+Pr8flikxbBn2t6vG7lJvP8ATNaloik1t5omYJiNbsAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAErX3ZiX/DHcVH8Njj8v5o0p9X73n/ADpTezX/ALd1D+h1/wDAoU99pH+t3g7P2svLx+3b/wByXGlk18gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADK3sa/xvu3H8cfTz7Wal2noj+q7pv8ATnjv41iYF9qL19nfxn7f72/WH3h31nWsvaQIAAAAAADCz2gXa9qO7jtb6m9KM3Fje3d7R5W84fkQtxnlY/KNFGm31FjFlKkvh12ebg4+uv1pTzXHyLkaVjWtK06Z1/0xi6s6X5Pir1ic84L59O3bvau1gj42KtZ9e3xb0rjt/wAG0wkt7JHjlyPs++OvRHX2tnnHxmPlMHF9RYbXmmDLwXK2njuQy54iY88aOttZd3FEz2jLhpMxPymtX5Rxza8P5Jv+KbzGnh7nje52Wi2mNcjWM7Gfqsy9g5dutK/P9DfsXKUr9VaUpWla0qrh2tfLqbOxq56zTNrZsuDLWfSa5MV7Y7x+tast07g+Y0OoeG4nnuLzV2ON5rjdLldDPSYtXLqb+tj2te8THp9diy0mftT6PhPQ+oAAAAAAAAAAAAAAAAAy97Fe5Lc9qnc90s6ua3Lnj6/V8ixNdya1W5KGPkcb3Xr1G4lkxpWlLkcPBz8jNtRl8o37FuXivh23ofqPN0t1NxfLYrzXHi2KY9qO/attbN3w5vN8u8UpktePtTWJR69qbwY43x68Duu/D3d165tzf4bPucJkikWzYea4zy8jx1cNpiZpOztamHVyTHrOLLePTv3WXfE+TanmnF+Ocw0ORDL0nKdHquQ6nJhKko3tduMGxsMO5SsfNPMsfIt1rT71a1osj1NrDu6uvuYLRfDtYMWxitHrFsebHXJSf162iWlHz/Cch01zvM9O8rhtr8nwXKb/ABHIYbRNbYtzjdrLp7NJie0/W5sN4j7cerkDkPkAAAAAAAAAAIPXvBXdzb6w9xGo6CcV2tMrh3RbGtS2/wBFv0vYWw5nscP6ReyKTt1rare1eLssjUZFvzOVu/YuRn6ZxrGkJvH7qyOY6hw8Fq5fPp8NWvxvLbvTJuZKeabenp5sVctsNo9Zi1Z79vk2f/dGez3fw68HuQ8WOe0ZwdR+JebJHHTnxfD2tTprS2Zw4sM1vEXjFv59LDyOG/aIviy0tXzVmJR7GAFvIAAAAAAAAAAAAAAAAADn/Svp1yDq31H4X004tiX87fc15DrtDr7GPanfu0lmXqUv5HwrdKylbw8WN/LvVp4pGzYuTlKMY1lTn8Xx2xy3I6XG6tLXz7uxjwY61ibT3vb663aO8zFKea9vtVrMz6Q6n131jxHh90b1L1rz2xi1eJ6a4jc5Xcy5slcVJrr45nFh895isX2M84tfF39bZMtKxEzMRNmJ2idufGO1Xt96b9FuMYlnHhxfj+DTe37NIVpseVZliGXybZeuNPMoZ28vZ2TZjKU/h2rsbdJVpGlVkvSXTur0twHHcNq0rWNXXp8e0dv6ZtXrF9nJ3j5xfPOS0d5ntE9u8/NpOe0J4x8548+LvWfiXzmxlzW53l9r8CsWXzROlwOtltr8HpeWZ7Vvq8Xj1cGSYrXz3xzaaxM9oyVdkYWAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABKv92Zl43/cPH8OHoq/v/L0JS+zX/t/UH6DB/iUMe+0j/Wnwen7Wzysft+afn+sl0pZte4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADKzsb+Xd724/jk6df5+W6ijtPRH9V3Tf6c8d/GsTA/tQfkefGb/i36x+8HILOxZe0fwAAAAAAAEFr2+nZ3HoR3JYvW3i2t+i8C65QpnZH0ez8LA1fNMLHri7DWWq0j4rdzcXW/m3frKdZVu5tytKUjWlKQe8eOkI4LqOvNauPy6HORGS3ljtjxbtKzTJjr2j53pi+Pbv6+a8/OG0v7pz2i7eKngvn8Mud3fj9V+F1p1cPxsnn297prZzRn1N7JE27xj1djd/AzHFaxWKa1Yn1+egxghbCAAAAAAAAAAAAAAAAAAnS+wG7u7nXHtoy+i3KNn9M5x0Pv3MHHlk3viZ+y4dm5VMnX51yMpeqmPrLmyxtHY9MKQpbxbcayrKlfM4PAbq2eb6bvw21k827wlppXzT3vl08l/PjyT6+lcc5K4K+nbtWPp7tWr3s/s9U8L/GzX8S+D0vqfpfxQxU2c0YcXk1NLqPV1/g7erSYjtObepp5uUy95802z3ntEdm/NnhU4AAAAAAAAAxT72O4rR9rPbR1U6w7jLt4+RoONZePoLNbsIZGVyLbVt6jTRxrVfM78sfYZ+PmXrduNZUxrF6dawjGs49W606hwdL9N8py+a8Vtg1r1147xFrbGXtiw+WPnby5Mlb2iI9K1mZ7REyz17Mvg7ynjt42dB+HXHa982Hlua183L5Ipa2LBw3HxfkOSnNePrcUZtTVza+K95is5suOsRa1orNZ1zXl2659y/k/N+R5U83e8t3+35Htsmcpyrd2G62GRscusfXKco26X8m5S3Csq0hCkYUr4pRWzu7ebf29rd2LTfPt7GbZzWmZnvkzZLZL9u/r281p7R9EdobsXTPT3GdJ9O8H0xw2CutxXT/ABPH8Nx+Gta1imnxuph09eLeWKxN/hYaze3aJteZtPrLjDjPuAAAAAAAAAAAAAAAAAAJQvu7XZdj8u5jyXu45vp6X9PwuuTx3plXKs1pbu8nvTpibLe4krlKwyLWDgx3Onu0jGtLeRf81nGcKRrJv2e+ja7e5s9WbuHzYdLza/GzevpOzafJkz0mfS0Y6Rmw27RPa1vnEwo298N7SmXp7pzhPZ86Y5H4XI9S/B5nreMGWJvTg8VZz6XF7FaT5sN9ratxvI0m0xN8OKYis1tNkxNL1roAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAlU+7NSp/dN3Cx+/XX6Wv8ANKzT+lKP2a5n6q6gj6PhYJ/X7woc99nH+snhBb7W5ycft1yf+5LvS1a9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/AOLoPs/qkA/G77IHLfsH8BibdHuufyH/AIefouX++++1AsRrEAAAAAAAAAAAAAAAAAGVfY5/je9uH45enP2u07tPRH9V3Tf6c8d/GsTBHtP/AJHnxm/4tusv3un+QlZ2rL2j8AAAAAAAA14+0+7TsDu77SuofBrWJC5zDj2syOY8HzI2qXcvH3XH4R2s8LDp9fxd3i4NzT+I0rKscytIUrKtGPvEzpSnVvSnIaMUidzXxW3NK8R3vXNrx8WaU+7nrScP51/T1S/9h3x+2/Z69oHo/qm+xanTnMbuHpvqnXnJ8PXy8Zy9p0KbWzPeI+HxefapyPrMRE6/e09olXC7bV52j2uz0m0x54mz0+wzdXscW7SsbmNna/JuYmXj3I1pSsZ2cizctzpWlK0lGtK0pVXZlxZMGXLhy1mmXDkviyUn0muTHaaXrMfRNbRMT92G5dx+9q8poaXJ6Oamxpcjqa29p7GOYmmfV28NNjXzUmO8TTLhyUvWYmYmLRMPnvW5YAAAAAAAAAAAAAAAADZF7Kzuvze0zu96ecpyMu7a4ZzDZY/B+b4cbkoWcrWb6dcDX3r8vnCFrW7jJwNjduTj6Y28WXqlGNKypkXwu6qv0p1dx21a8109zLXR3aRMxFsWxPw8drfRFcea2PJaZj5U+cQhl7ePgHreP/s8dYcDh18eTqTp3Sy9UdMbE1i2TBvcTWNvbxYo9LWybvHYdvSx0rPeb547RafrZsbMDOxNng4eywL9vKwdhiY+dhZNmcblnIxMuzC/j37U41rGdu9ZuQuQnGtYyjKlaVrStKrEMd6ZaUyY7RamSlb0tE94tS8Raton6YmJiYn7UtNva1djS2tnS28V8G1qZ82rs4MlZpkw7GvktizYslbRE1vjyUtS9ZiJi0TEx3h7TzegAAAAAAABDl94y7to8p6hcK7VuKbas9XwOFjlnPbONer6Zci2WBcnqsC/SEvRcsx0+0xsqtuVJVjkW4yrWlY+mkQPaH6s+quQ0+ltXL3xaMV2t+Kz89nJjmcWO3ae01+DlrbtPytET3+hsae5w9n6eC6Q6m8eee0PLvdV2y8B0pkzY4714bS26V39rF5q+amW3I6ObBF6zHmw3tHaYt3mMCjMvEAAAAAAAAAAAAAAAAAAdmdGul3IutXVTgfSrieHfzt9znkeBo8KxjW5Xb0YX51u52TG3Glayjg6+zl5t371LWPOVa0pStafS4fjNjmuU0eK1aWvn3tjHgpWsTM9rT3vaIj5+THF7z9ysuk+JHXPDeGfQnVXXvP7OLV4npbhtvlNnLnvGPHNsVYpq4JvaYiLbW5k19Wnr3nJmrEd5mIWZPa12/8AFe2HoR066McSw7GLh8R49r8bZ3rEaUpsuRXca3e5Dtp1p86y2e4nmZtaVlKkPj1jGvppRZP0vwGr0zwXHcNqUrSmpr465JrHpk2JrFtjL+yZpvft9Hm7R6NJrx28W+e8cfFTrHxK6g2cufZ6h5jbz6WPLaZnS4fHmvi4fj6xPpEaXG11tXvER5vheaY7zLIN99iIAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEqP3ZuX/G7uCh+HVaeX81yxT+n+X+RKL2bP/jfUEf/ACOH961f+VRD77KP9j3hFb/shyMft0yz/iS9UtmvKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZU9jta07ve2/x9/rP04p/J/ddqHaOif6rum/06439/bxMEe0/wDkefGb/i26y/8Ay/yCzvWYNH4AAAAAAAB+VpSVKxlSkoypWko1pStK0rTxWlaV+VaVp8q0r8q0Pn837EzExMTMTExMTE9piY9YmJj1iYn1iY+SAj7cPs8n20912z5vx3X/AEbp11sjXl2k+j2a0xdbup0ljbzW3b0f0uuXlbHC2G3+FX0TpYy419FYeJVgb42dIT031Vl3tfH5eP5vvt4fLH1mPNP1ufHNvl575KZM0V9Jito9PpnbK91/7RdfGvwD0el+Y2/jdY+GNo6e5P42SJz7vGVmM/F7uPHP1/1Pg09rU474n11Zy68xNvN3rGlZhlZaAAAAAAAAAAAAAAAAA/u3cnauQu2pyt3bc43LdyEqxnCcJUlCcJUrSsZRlSkoypWlaVpStK+aP2JmJiYmYmJiYmJ7TEx6xMTHrExPyl43pXJW1L1rel62peloi1bVtExatqz3ia2iZiYmJiYmYlYNexb7u490XaFxvWbzYRyuoHR+lrgXKIznSl27h6+FY8cybdqVa3ZW4cf/ADLsX79ZTjPKpP8ARRlX00n54NdW/hn6R1sefJ5+Q4jy6G13n1mmOO2taIn66YjX+HW1pme9u89479o1FveVez1PgX7Q/NbvF6k4OkfEScnVnB2rT+l49nctE8zhvesRSL25f6vy4sURW1cE19JiPNO3tltXkAAAAAAA6V7iusvH+33ol1J6w8ny7GHq+D8Y2G0jcyZ0hZu7OVv6JpcOUqyj4+nbjIwcKniVK+q/TxXz4fF6h5jX4DheS5favWmLS1cmXvb0icsx5MFJn0/2zNalI+7Zkvwd8N+X8XfE7ovw64PXy7O91RzmpoTTDE2yY9Gt/qjk9msRE9/qXjsO1sz6du2Ke/orIutfVTkPW3qtz3qrynKv5e45vyjcb+7XIuVuzxcfPz7+Rha6E6/OtjW4c7ODj0r5rGzYhGta+PNa1Oa5TY5rld/lNq9r5t3azZ58095rXJe1qY4n+xx0mtK/8GsN3Tw06D4fwx6C6T6D4LBi1+O6X4PjuJx/BpFK7GbU1cWHa3b1j0+Lu7Fcm1mmIjvky2ntHydXPmO8gAAAAAAAAAAAAAAAAAJU3u6nZjZ3e45T3fc209L2BpfpXFelssyx5tz29MmmLueRYNyUaUlPBt4+20dz0+qlJZMq1rGVKJR+z10bGfNtdXbuHvjwefV4ubx6Tm83lzbFJn6ccVy4J+15p+lQ/wC+K9pLJxnHcF7PHTPIzj2+T+Bz3XUa+WPPXjvgzn43h9qkT3rXavm0OUpM+WZjBXt3rMpeSWrXnAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABKc92dl/x36/x/8AtLqpfv8A+GxaJQezbP8Aq3no/wDkcU/v17f41Evvso/2M+Elv+ym/H/ks8/4kvxLhrwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZT9kNfHd324fjn6b0/n5fp6f0uz9F/1W9Ofpzx38bxME+09+R68Z/8Ai16z/wDy7yKzxWYtH0AAAAAAAABqv9r52hWe7PtE5jh6nCs3uf8ATLGyef8ADMqUKSuwlpbVMzfYcKU9N29cz9Dj7DExbEZ/PKv26xhOVfTXF3i50jXqvpLcpipWd/jK239K0xEzHwY8+xSPpmcmCuStIifxcx6T8k7/AHePtDZPAD2hunNnf2cmPpLrfNg6S6lwRea0tHJ5J1uJ2bTPemOmpyubU2M+W1fTBivE2rX1iu+ysXIwsnIw8uzcx8rEv3sXJx7sJW7tjIsXJWr1m7CVKShctXIShOEqUlGUa0rSlaK+rVtS1qXia2paa2rMdpraszExMfRMTExMfbbgmDPh2cGHZ18lM2DYxY8+DLjtFseXDlpGTHkpaO8Wpelq2raJmJrMTHpLwPF7QAAAAAAAAAAAAAAAAG5T2JPd7Xtl7t9JxnkGx+idPus0YcI39L92scbE2mVKl3QZluFZUj9Kytzj6zW+utJfpN+sfFPrZh8FurvwtdWYNbYyeTj+Z7aWfvPatMtp82C8R8vNbNXFj7/2M9lcPvN/Z5/m3ez5ynN8Rp/VHV3htNuqOJ+FTvn2NHBE4+X1r3iJt8DBxubd3fJHb+mYomZ+cTYB0rSVKSjWlYypStK0r5pWlaeaVpX79K0+dKp7/P5NSaYmJmJiYmJmJifnEx6TE/diX6PwAAAAABFP9437ubmu1XBe03iW1rbyNrK1zHqPDEv09VdfbjdrqdBsLca19FLt6Wr3dqM6RlKNu3KlKwr5rFr2iOrJx4tHpTUy9rZe25yMUt6/Djv8LXyRHy7zOLNET2me0T8l9HubfZ7pub/VPj/1BoebFoRk6c6MtsYu0Rt3nHHIctp3tEeaceKN7jMk171ib3jv3RF0TGwgAAAAAAAAAAAAAAAAAA7Z6E9JOR9d+r/T3pFxPDv52853yXB0uNZxoVuXoY0qyydnlRjSkvNMHV4+bmz80rT0Y8vPy8vq8HxOzzvL8fxGpS18+9s0w1rWJmYrPe2W8don/a8Vb3n07dq+vo6B4p+IPDeFXh31f4hc/sYtXiuleF2uTz5M1opjtmiK4NHXtaZjtO1vZtbWr69/Nmjt6rNDtw6HcV7ceinT3o5xDCxsTWcL43q9Zk3Ma38OOy3NvDs03e4u081/T9ttKZWwvfe+JkS9NKU+Syjp3hNXp3heP4fTpWmLT1sWO01jt8XNFI+Nmn/hZsvmyW+7aezSV8ZvFHnvGXxM6v8AEbqLZzbG91LzW9u4aZreedLjb7GT8DOOpP8AuXH6PwNTH9Pkw17zM+ru99tjAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEpf3Z6X/AB96+x+/XQa2X82RhU/p/wA6T3s2z/q/no+3r4p/atX/AJVFPvsa/wCxPwmt9rl92P28Oz/7/wDpCYCl013QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v8A8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP8Aw8/Rcv8AfffagWI1iAAAAAAAAAAAAAAAAADKbsi/xu+2/wDHR02+2Gmdn6L/AKrenP0547+N4mCfae/I9eM//Fr1p/8Al3kVnksxaPoAAAAAAAADx3rNrIs3ce/bhesX7dyzetXI0nbu2rsawuW5xr5pKE4SrGUa0rSsa1pX5Vflqxas1tETW0TW0T6xMTHaYmPtTHpLzx5MmHJjzYr2x5cV6ZMeSkzW+PJS0Wpelo7TW1bRFqzHrExEwrz/AGxvZ/kdqPdzym5qMCuN086r3L3PuG3IQ82rX5pXZU3uHcuwpS3C9HkFvbXbNj0wlDErarSNY+Jyr98X+kbdK9W7U4cfl4/lZtv6cxHpHxZ/p9JmPSJ+qIyzWvpMU7ekx6zt8+7l9onD4+ez3wNeQ2ozdX9A0x9JdSUtbtfJOljj8C9jHjt3vbFPEX0MeTL5r1tsRkjzRP1sam2Kk/AAAAAAAAAAAAAAAAAHv6vZ52l2eu3GsyLmHstTnYmy1+XZr6buNm4ORbysXIty+9cs37Vu5Cv3pRo88WS+HJjzYrTTJivTJjvHzrelotS0fdraImPuw4u9pavJaW5x29hpsaW/q7Glt6+SO+PPq7WK+DYw3j6aZcV70tH0xaVj97MLus1/dv2j9OOcyybVzlnHdVi8L5tiRu/Fycbd8dty1VrKza+qso5G5wsGzuJeqkfNMz1Rj6a0WK+GfVOPqzpPjt3zRO3rYqaW7Tv3tXNr1+FFr/8ACzUpGae/9n9ppn+3D4C7ns++0H1n0vGDJTgOZ38/UvTGxOP4eHPxnMXjfvg1o7RE4eN2drJx0TE27Tr9rT5omGwtkBEEAAAABwfqXz3R9Lun/MeonJMmziaXhvHdtyHPuX70LEJ29ZhXsqOPG5crSPxsq5bhjWI/OVy9dtwhGUpUjXhclv4OL0NzkNm0Vwaevl2Mk2mKxMY6TaKxM9o73mIrWPptMRDtHRXSnKdddW9OdH8LgybHJ9R8zx/EatMWO2W1b72zjwTmmlPWceCl7Zss+kVx472tMViZisr7s+v3Ie5zuC6m9ZeRZl3Lucr5NsbuopdrOlcTjWHfnhcbw/ROtfRLF0mPgWLvpjD13Lcp1jGtfFK1eq+e2Opef5PmNi83nb2ck4e/f63Wpaaa1O0/Ka4K46z6R3mJmY7t23wB8JeH8EPCLojw34fWpr06f4TTx8jNPLP1RzWxirtc1s+asfXVz8pm28tO828tLxWLTEd2ObrzMYAAAAAAAAAAAAAAAAACWJ7uj2aWcqvLe8Dmunjet2/pnEOlksyx5hHKs5scfecjwJ1pStMjFnhbPRSr6pR+Hl3f0NK+KpVezz0dW/1X1du4YtEefU4ubx3iLVyeXPsY5/sqzjy4J+5eVBPvjfaQy4Pwv+zt0zyM48l/qbqLruNbL2tbBl1pzcXw23WJmJw7FNnS5SvpW3xNenrMd4mWolc1/QAAAAAAAAAAAAAEMz3man/L526V/D0y5X/m5Bq0OvaU/H7p79LNr+MY/wDlbIvuS5/6k/jHH2ut+A/f4jeRmkbF2YAAAAAAAAAAAAAAAACUj7s9L/lE6+R/DxvX1/l+l4P9CT3s2/jjzsf/ADfH+9bH/wAqi332Ef7DvCeftc1uR+3r7U/4kwdLprsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZS9kXy7uu3Cv4Os/Tb7YaZ2fov+q3pz9OeO/jeJgr2nI7+z34zRP0+GvWn/AOXeRWeazFo+AAAAAAAAAANNfttez+vc72l7rk3HddHK6hdGPjc30U7dqksjJ02HD1ckxLk6U9crGPpJbPOt26SjT6RCkv0X6muHfGnpH8M3SmbZ18cW5Dhu+7gmI72thp67NJnt38tcHxbxEdvroj5/JZB7sj2iI8EPaA43hOZ3JwdIeJXwumOVre8xiwcls28vC7FKzPlrlzcpGjq3yTE/0m0x6R6xX+zhK3OVucZQnCUoThKlYyjKNaxlGVK/Oko1pWlaV+dK08VQJmJiZiY7THpMT84n7Uttetq2rW1Zi1bRFq2iYmLVmO8TEx6TExPeJj0mH8j9AAAAAAAAAAAAAAAAASDvd+O7u30b7itp0F5Ts/o/DutmNdt6iOTepaw9fzTW4tMyxl3Llyvw4Vzddqp6uxb8wrcycq1GNZTlGEs/eAfVscP1Dl4LayeXT5qsxhi09qY93HWL1tMz6R58eKcVY9O97xEd5nsqJ97j7PV/Efwd0fFfgtL4vUfhjmpfkZw4vibO501u551sutSlI89o1tzervZL/XRTDgvNoisTaJxSbTV9AAAAARwveHu7m90y6JcZ7bOLbL6PyPrBet7LlcLN2sb9rhOqyrmRCMa25RlauXt7rcCE6SrWlzGuTj6K0l6qR19oLq23GcLrdN6uTy7HL2jLteWfro0sN5tER29azbPipE/brMx29Vy/ufvZ8xdb+J3N+NPPaU5uG8OsV9HgL5MffFk6n5DXrhtMxes1yUxcXu7V6zWImmelZ80TXshSIYtmEAAAAAAAAAAAAAAAAAB3P28dGeSdwfWrpz0d4piX8zcc65LhamEMeNZ3LWDGlzN22VSlKS/8T1WJm5XzpWn6T4r9b7HT/D7PP8zx3EatLXzb2zTDEViZmKet8t/T+wxUvf8A+yxv4v8AiRw3hF4adZeI3P7GLW47pXhNnkLWzWitMm1aaa3H68+sTP1TyGfV1/Se/wDTO8LNHoH0a4r2/dH+AdIuHYONhafhPGtTpqyxrVLUdhscXCsWtpuL0KfL6Vt8+GRsMmtPFK38i5WkaUr4WU8Dw+rwHEaHE6dK0w6WtiwzNY7fEyVpWMua3/Cy5Itkt8vrrTPZpJ+LHiRz3i34idW+IfUezm2eS6n5vkOS7ZrzknT08+1lyaPHY7T6/A4/Uth08ETMzGLDWJmZ9XcD67HYAAAAAAAAAAAAACGZ7zN+v526fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Yn8Y/wBW/A/ejeRmkbF2YAAAAAAAAAAAAAAAACUX7s/L/lM68w/DxbCl/Nm66n9P+lJz2bZ/1y52P/mtJ/8AHxxP+JRj77CP9hPhTP2ue2o7/n6u5P8AiTDUvGuqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZR9ktfHdz23/jp6a0/n5hp3Z+i/6renP0547+N4mDPaajv7PfjP8A8WnWk/8A4d5H/Es9VmLR6AAAAAAAAAAensNfhbbAztXsce1ma/ZYeTr8/EvR9VnKwsyzPHyse7H5eq1fsXLlq5Hz84yrR4ZMdMuO+LJWL48tLY8lLetb0vWa2rMfatWZifuS5Gnt7Oht6u9p5r6+5pbGDb1djHPlyYNnWy1zYM2Ofoviy0rek/RasSrk/aodpew7Ru7jn3E7WJetcL5jnZPOOB5k7XwrWXpt3e+lZtrGjSMY0sazc3dhq7VKUr4t4cfNa181V3+KPSmTpLqzf1IpMae5ktu6N5jtF8OefPeKx/Y481smKI+1RuSewj7QGp7Qns+dJ9QZNjHfqXpzVw9LdV69b+fJr8lxeP4GtkzTNrW+Lvcbj1N+8z/X7M9oiJiGt9jpMwAAAAAAAAAAAAAAAABynhHL9zwDmHF+b8eyZ4m74nvtTyDWX7c5QrHM1GdYzrFJVhKMq253LEYXYUlSk7cpQr8pVcrS282huau7r2mmfUz4tjFaJmO18V63r8pie0zXtMd/WO8Ph9T9Pcd1Z07znTHL4abHGc/xPIcPvYr1raLa3IauXVyzEWi0RetMs2pbtM1vFbR6wsxeyruM0fdR21dLesemyoZGRv8AjeFi8hh641u2OUaiNdTyKly3TxKzC7uMHNu48J081sStypKdK0lWyXovqLB1T03xfMYbRa2fWpXYjvHeNnDHwtjvH9bE5qXmsT/WzHrPzaTntL+DnKeBHjV134c8lgthw8TzWzm4i01mKZeD5C0chw80vP1uS1OO2tbHltWe0Za3iYrMeWMqnaWBgAAHyd/u9dxrRbnke3vxxdToNVsN1s8mdaUhj6/V4l7NzL8q18UpG1j2Lk6+fvRerYz49bBm2M1opiwYsmbLafSK48VJve09/tVrMvocTxm5zXKcbw3HYrZ9/lt/T43RwVjvbNt72xj1dbFWI+nJmy0rH56th9or3RbXu27rep3U/Iy53uP2t5lcb4bjRvVu4ePxvj0o6bAysOlaypCG3sa+1tb1IyrSV/KnKnilaUpXF4hdT5erOquT5O1pnXjPbW06xPeldbX/AKTjvT7UZoxxlt/wrzPp8m6P7HfgZoez94CdD9D4cFcfL34vBzPUmeccU2M3NcvWeS28GzMRXz24/Lt30MczETGLBWJ79u7Bt0lKEAAAAAAAAAAAAAAAAABLh93R7NLWPquWd3/NNRG5d2X03iHS+uZY8xtW8TYRsbzkOFOtKShlWsnXZunpPzWEsXLveI1rL1Ulj7PPR0VxbfV27h7zl8+nxfnr6RFMkVz7FJ+cXi+O+H7XltP0tfT3xvtIXzb/AAHs7dNcjNMelOt1F11Gtl9cl8+pbLxfEbURM1vgyYdzW5Ga9vNXPr4/ro7dplbpTqEgAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAShfdoZf8qnXWP4eI4sv5s/WU/pSb9m38dOc/wC1KfwmL/lUbe+uj/YH4V2/+kOxH7epvT/iTE0vWugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/8Ai6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGUXZP/jc9t/46umn2x0zs/Rfp1Z05+nPG/v7eGGDfaZ/I+eM//Fn1r/8AlzkVnssxaPIAAAAAAAAAADRH7ebs8udwHbHHq1xTV1y+f9D7ld34xLFbmbtOI3btbe4wrk4xlKOJqbGZn72filPFcaVZS9PmjBnjr0hPP9M/gtqYvPyHCT8f6yve+XUme2bHPb+sxVvkzz+hlal7qX2iqeEnjfPh9z29Gv0l4oVjjO+fL5NbR6hpj8/HbNKzNYnZ5DNr6nFV7zPeM0REd+yCGg02pgAAAAAAAAAAAAAAAAAEon3c3u4hxvm/Nu1Plm19Ov5pC7yrp5ayb3nxv8GxbubPUYUJSpSFqerxdntbkaRrWV6M5er5+EnPZ46sjW3d3pbay9qbsTtcfFrR/t+OsTlxUifonFXJlmP7Lv8AbUZe+Q9n23M9L9M+PfAaEW2+mr4+A6wyYcfb/Wjby3po8js2iJm2Sm9n0tCkzPpjmsdvTumHpeNdQAABo/8Absd3le3jtSyunPHNl9E591wyI8YwJY16kM/Wcet3K5232VLdK+r6Lm42uy9JcuSj6PObWFJeutKMJ+OXVv4X+lr8drZfJv8AN2jWp5Z+vx68T582Tt8/JeuO+CZn0nzzHfus+91h7PP82Dx7wdZczpfVHSfhfitzm1GfF5tTe5i9PqXjtLzzEV+qNbNua/J0pWfP21ot28vdAnrWta1rWta1rXzWtfnWta/XWtfv1qgm2uvl8gAAAAAAAAAAAAAAAAAHe/bL0M5L3IddOm3RriuHfy9jzXkmHr79bEa1rjauzG5n7jLlLxWNumPqsPNuwlP9DW5CEfEqypGv3OmuE2eo+c43h9Wlr5N3Zpjt5Y7+XFXvkzXmflHlxUvMTPp3iIYr8bfFHhfBnws608SOe2cWvpdM8Ls7mL4toiM+/lmmpx2vWO8Tec2/sa2O0V9Ypa1vSImYsz+inSbi/QzpVwTpRw7CsYWi4RxrT6GxTHt0tUzMjX4GPjZm0vRjSlPpW0yrV3Py5UpGk8jIuSpGPnwso4XitXg+L0eK06Vpg0tbDgr5Y7ee2PHWt8to/s8tonJefTva0z2hpK+JnX/OeKXXvVXX3Uezl2eU6n5vkeVy/FvN51sO3tZc2to4pmZmNfRwXx6uCszPlxYqR3nt3ntJ9R0UAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEn/AN2hr/yt9dI/h4Zj1/m2Wpp9X/6VUmvZt/HbnP8AtOv8JhUde+uj/qfeFtv/AKS5o/8AMuQn5/rfvJjKXzXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q//ABdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADKDsor47t+3D8dXTSn8/MdNR2boz+qzpz9OuM/jmFg72mI7+z54z/wDFl1tP7XTnJSs+FmTR4AAAAAAAAAAAfH5DodXynQ7rjW7xbebp+QarYaXa4d2NJW8nXbTEvYWZYnStK08Xce/chX79PV5p83p2MGLawZ9bPWL4djFkw5aTHeLY8tJpes/cmtph9HiOV3uC5XjOa4zPfV5HiN/T5PQ2MczF8G5o7GPa1stZjtPfHmxUtH2+3ZWw+0S7Xdv2ld1fU3pjl4l21oLu7yuRcNzK2a28XN45vZR2mNDCl4pC7Z1c82WpnO3WVKXsKcJVpOMqUrj8QumM3SnVPJ8ZesxgnPbY079u1b6+ftlrFJ7dpjFN5xTMf11Jj5+jdH9j3xz472gfAbojrjXz478tj4vBw/UmvGSL59bmeKi2hnts17zbHk3q61d+tbxWZx7NbViazEzg66SlAAAAAAAAAAAAAAAAAA7Z6FdWeQdDOr3T7qvxjMyMLa8J5Rqt1SeNOtu7fwsfKt/mng+qlK1pb2GtllYN3xTzW1kTpTxWtK0+rwfK7HB8vx/K6t7Uy6W1izRNZ7TalbR8XH6fRkx+ak/cs6B4pdAcR4o+HvV/QPN6+HZ0Op+D3+MmuesWpi2c2C/1Dtdp/r9Pdrg2qfavhr37x6LODoH1f49166O9POrfGMrHytXzfjGq3Na41yl21i7C/iWvzW13rpKXmet2VMrBu0rX1RuY8qSpStKrLOB5fX53iOP5bWtW+Ld1sWb62e8UyWpHxcff7eLL5sc/drLSJ8WPDzl/CjxG6w8PucwZsG90xzm/xsRnrNMmfTxbGT6g3PLMR9bu6U4NqkxHaaZYmszExLt99djwB4cjIsYmPfysm7bsY2NZu5GRfuypC1ZsWYSuXbtycq0jC3btxlOcpVpSMaVrWtKUflrVpW1rTFa1ibWtM9orWI7zMz9ERETMz9p7MOHLsZsWDBjvlzZ8lMOHFjrNr5MuW0Ux46ViJm173tFa1iJmZmIiO8q7/wBsB3b3u67vA5pl6rNu3uB9MsnI6f8ADsaU6yt26aS5HD3+VCtPTbvW87f42xy8W9GHiuNfhSM5xr6pV8+LnVs9VdXbt8V5tocba2hp1mZmI+BPk2LR8omL565L0mI/E2j1luC+7v8AZ9x+Afs7dNa2/rUx9V9b4cPV3UmaKxW955Ok7HE4LRPe+O+rxObT18+K1u8ZsVptWtvrY1WsXJ3gAAAAAAAAAAAAAAAAAJgPu6vZpHR8V5X3c810/wDwjyemXxLprTNsUpLH1eHsYWtxu8ak40uWsmWbrL+DZvUrSFzBy7lYxlSdJ0lx7PPR/wAHV2+rd3D/AEza82pxvnr+JxUyds2esTHeLTfFbHFvlNLz279+7Xe98V7SE8pz3Aez30zyXfT4OdfqDrX6ly94zb+zp2ycdxeea2mmTBXW3cO1kxzE2x7WvTvas1mqUulAooAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJ592il/yxdcofh4Par/ADbTT0+f9H/zSY9m38eOc/7Rr/C4VH3vra/9Tnwut9rqjJH7ehyKY+mA1yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6vfvx0Hj8n9XT/SgH43fZA5b9g/gMTbo91z+Q/wDD39Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMn+yqvju37b/wB/rX0zp/PzLS/0OzdGf1WdOfp1xn8cwsHe0x+R98aP+LLrf/8ALfJLPlZk0eAAAAAAAAAAAAEdj3hDs+n1a6D6TuL4lqvpHMOjd2zicili2Pi5mw4Vss6tj4UbVqnxJ012y2ktlkX60uUtYli5WfotwrKkevH/AKRnluCwdRamLzbnDzWmx5K975NLJeazWIj1n4eTLOW1u0+WlZ7zEQuH90R7RFfD/wAVuU8HOoN/4PTviPjybHDxny/D1tPqfT1Yy/EtfJPkr9WaejXSw4oms5NjNWK+a9orMI5Cxs4gAAAAAAAAAAAAAAAAAJgvu5fdvXfcP5z2o8s21J5/E5XuX9PbeVfpDzpM3LtV2uoxKXZerIyfzTz87ZVt261nbxYTl6KW7fqpLn2d+rJz6m70rt5e99TzbfHxae39IvePi4q9/W1vi5L5O0fKsTPbt6tdv3yPs+xxPUPS3j50/wAfNdXqCMfTvV98GKbf66auveNDkdiaR2w4fqHU1dLz3iK3z3rHnm9orMpNJ9RWA1b+147tcbtR7P8Am2w1+dbxuddSce9wDhNms/TcuZW3tVhubsYxrGdK4/HvzVvWpxlH03rcK+a1p6a4w8W+q69K9I7uTHeK73I1nQ0o79pm+aO2aft/W6/xZiftxCdPu9PZ/wA3j37RPTGnuat83S3RebH1b1NkinelMHHX83G45mYmkxl5j6gx5KTFvNivaO0RPeK7XIyL+XkX8rJuzv5OTeu5GRfuyrO5ev3pyuXbtyVfnKdy5KU5yr86yrWtfrV72ta9rWtM2taZta0z3m1pnvMzP0zMzMzP224XhxYtfFiwYaVxYcOOmLFipEVpjxY6xTHSlY9K1pSsVrEekRERDwvx7AAAAAAAAAAAAAAAAAGRXah0A5J3OdwHTPoxxnEvZORy/kmLjbG7C3KVrC0uHC7stxk37lP0FiNNZhZULNy7KMK5E7UP0UpRjLsPSvAbPU3P8bw2tSbW29itckxHpTBSJyZrWn5V/pVLxEz6eaYj1+TD3j54tcL4IeEnW3iVzexjw4eneFz5tPHe9Yvs8nsWx6XG4MVJ+uyzO7s4LZK0ibRhrkvPaKzaLMvpN00410d6bcK6Y8RwrODoOE8a03HcG3ZtwtfGjqtfj4U829GEYxllZs7EsrKuUjH4l+7cnWlKy8LJ+K43W4fjdLjNSlcevpa2HXxxWIjvGLHWk3ntEd7Xms2tPb1tMy0mOv8ArXmvEbrTqbrfqHZybXLdTc1yPMbd8l7X+Hbf282zXWxzabTGDVrljBgp3nyYsdK957Ow30HTwAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASc/do5f8ALT1vj+HgUK/zbbS0/pqkv7N34883/wBoR/DYFIXvrI/6mnhhP/0rtH/o/k5j/BKZKmC1xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH5WtI0rKVaUjSla1rWvilKU+uta/epQ+XzfsRMzEREzMz2iI9ZmZ+URH0zLjmTzHieFdrYy+SaPFvR/VWr+zw7Vyn8MJ3oyp/M41tzVpPlts4K2j5xbLSJj9aZiX2MPTvPbNIy6/C8pmxz8smLR2clJ9O/pauOYn0mPpe/rt7pdv5/Mvba7Y+PPn6FmWMnx4p5r5+DOf3vn/AAfN7MefBl9MWXHk/QXrb/BMuLucXyXH9vq7Q3NPv8vqnXy4e/f5f7ZSvzfVe1wAAAAAAAAAAAAAAAAAFfP7cv8AZDurn/5vQeP/ALg6z+nygH43fZA5b9g/gMTbn91z+RA8Pf0fLd/7rb3+Ls0/sRrEQAAAAAAAAAAAAAAAAHK+B8w23Tzm/Due6GUIbvhPKeP8t1FbtJVs/mnxzbYm4waXowlCU7NcrDtUuwpONZQ9UfVTz5crR3MvH7unv4JiM+lta+3h7+sfF18tM1O8RMTMeakd47x3jvHd8Hqrp3j+r+mOo+k+Vre3GdT8Fy/T/IxjmIyfUPM6Gxx218O1q2rXJGDZyTS01tFb9p7T27LBP2fntWOgPebxHj+ky+Ta3hXWzHwMbC5FwbkGbY12Rs9vYtRjfyeMzzZY/wCbVjLjSOZ8LApkyxaXZ2Ls6zsXK0n30D4p8D1jqa+G+zj0uarjrTY0ti9cdsuaI7WtrTfy/GreO1+2PzzXvNZnvWZajXtb+wX4tezd1Dy/J6/CbvU3hll2s+zw/VPEa2Xcw6PH5MlrYsHN11q5fwNy68zOtN9ucNc80rlx1iuWkNrTKaBQAAAAAAAAAADinOuG6PqHw3lPBeSYtvN0XLtBt+O7XHuQhOk8HcYF/X5FYUnGUY3YWsiU7U/TWtu5GM6fONHF3tPByGntaOzSL4NvXza+WsxE96Zsdsdvn39Yi0zE/RPaX3uluo+U6Q6k4Lqnhc99blenuW4/mNDNS1q+Xa47axbeGLeW1ZtjtfFWuSneIvSbVn0lWfd6/bjve1buV6o9HdziXMfG0HI8vI49e+HKmPlcb2vo22jlj3q+YZH0fWZ2Li5Fy3KUaZNq7CtIyjWEa2utOnc/S3UnKcPmpNa4Nm9tee0xW2tl7ZcHlmfS3lxXrW0xM/XRMekx2jdh9mfxl4rx58FehfEfjdimXNy/Da+HmMfnrObBzWh5tDlIzY47Ww/G3dXPsYaXiJnBkx2jzVmLTim6szyAAAAAAAAAAAAAAAAAyg7Ne4Te9r3cj0s6x6TMniw41ybDhu40lP4eRx3aevVb63dtxlGlz06nOzLlmkvVSN+FufprWNKOzdHdQZ+mOo+L5jBeaxrbNIzR9FtfL3xZ4mPp/pV7zH2rRE/OGDvaP8IeK8cvBjrzw45PXrntzfB7NuMtMV8+HmdHy7/E3x3mJnH35DV1qZJrMTbFa9O8RaZWZnA+ZaXqJwvinO+O5NvK0fL+PafkervW7kbtK4W51+PsceE5Q+XxbdrIjbux8UlC5GUZRjKlaUsn0dzDyOlqb2vaL4NzXw7OK0TE/WZsdclYmY+mIt2mPomJiYhpL9VdN8n0f1Lz/SvMYb4OU6d5jkeG3sd6WpMbPG7ebTzWrW3r8O98NrY7d5i1JrMTMTEzyxy3wEDD273d5b7he6m9004xs6ZnAeh9mvGseuNe9eHseUyh8Xe5d23SUoxzdVn5Ox0lZU9Pi3YlGsfPmqCnjn1bHUHVNuN1snn0OEidavlnvTJszHfPeYiZ+vxXtkwzP2q/ntrT3Vns838IPAbH1rzujOt1b4oZY5rNGfH5dnT4KLfD4rXpea1mdbf1MOnycRPmjzZYmJ7dmjZhJaIAAAAAAAAAAAAAAAAAAmRe7tdm39x/T3lHdjzTT1t73n1Mri/T+mbj+i9h8b1+yhDZ7GFq9D4tq/l7HVVpi5Mawje12VWsKThdpOswPZ76P+pOP2uqt3D2z7/m1dDz17WprY8sRlyREx3i18mL620du+O30xPdrje+G9o/8MXV/BeAPTXI+fi+k/qfnerp1c3mxbPNbmla2lpWvjt8PJi19Lfic+GfPOPcwx5prenliTskwpAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJt92lr/y49bKfh6fef5txo6f0pK+zfP8Ar3zMf/MO/wD5XB2/xqRvfWR/1L/DGf8A6X9v2+N5Wf8AEmVphtcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0T137mOiHbTxm7yzrR1C49wrWxtzuY2Psthi29ts/R59VvUaqd6GZs71K/L4WJauz9VaU8ea0fC53qThOm9adrmeQ19LH2ma1yZKRly9voxYptF8k/cpEyyp4VeCfif4185TgPDXpDmOpt2b1pnzaWnsX0NHzdu1+Q364ra2ljnv38+xele3ee/aJR/+473kTpZx2mw03bb002fOdjbrdhhcu5jTL1Wgrcj5jGt3j87Ws29y366Vr6refGk4VpWNafXXAnUXtF8Xr/Ew9Ocbl3ckd4pt7nmxa/f1+evNceWYiftZI7wtr8Gvcx9d8xOnyXjR1rpdLad/Jba6e6cnX3+Xilu0zFOXrfd4+l/LPby31LTW0TFon5NHvWn203f11iyMmNnq1d6caXKrOl7j/AsDFwtdO3KtfTCV3b29xsI0hTx4rbzYV8/XWtPkwnzPjL15y9reXlp47DaZ76+hjpTHMT8o75ozZI7fcutA8NPdqeyd4c4cM5PD+nWXJYIrOPl+rNvPs7lLxEea0U463Hak+aY9YvrWiI9IhgRyDuO698pv3snfdYeomfevzrcuz/uq22L651r5rX0YeTjwjStf+bGNI/e8ePk6JsdRc9tWm2fl+QvaZ7zP1Vmp3n86lqx+8lfxHg34UcFix4eK8Ouj9XFirFMdfwB4/P5axHaI82zgzWme30zM2+64bc6mdSLsqzu9Qeb3J1+uVzle+nKv8MpZ9a1/ncOeS5GfWd/dmftztZ5/w5HY69E9GUiK06R6YpWPlWvAcVWI/OiNSIe5gdXOquryLOVrupXPcO/j3YXrU7PLt9H03bcqShKsPp9YS8SpSvpnGUa/VKlafJ54+W5TFaLY+S36WrMTE1288dpj1ie3xO3p92HH2/D7oPexZMG50V0psYstLY8lcvT/ABNvNS8TW0eb6k81e8TMd62iY+cTEs0elntW+/PpJLFs8e7gOVZ+oxfRT8wt7a1ey19+Fuvmlu9cua+OwlGv1V9GbCVaf853Li/FPrriZpGvz+1kw0/6xnjFkx2iJ79rTOP4nb868SjX137BPspeINdjJzHhHwOryOfzf668Vk39LcxWt87Y6U251ImPnHm1rRH2uzdV2w+8jZ1q/rdB3TdMcS5iS+Hj5HNun1M6xXDtxrSks3YaXLv7vM2N2tK1rK3g1xqVrTxGNPv5n6Z9oy8Wx4OqOMrNJ7Vtu8f56+SPpvkw3tmvkn6Zik1+592tDxw9zFq3xbvLeBPXGxTYr582Hpjq6dXLGxee811tTk9fFxmvp0j0it9uM/aJ9ZlJb7eu5/oj3ScNxucdFed6bl+qu2oXM3ExMux+bOluT8UpjbvUfElnarI+dKxs5tmzclCUJ0j6Zx8yQ6f6m4TqjTrvcLvYdvFMRN6UvX42GZ/rc+LvN8VvX5XiJmO09u0qU/F7wO8TvAvqPN0x4l9K8l07v0yWprbGxgyzxvJUr375uM5DyRq7+H0mJya2TJStq2rM96y7/ffYlAAAAAAAAAAAAAAV8/ty/wBkN6uf/m9B/wC4tagH43fZA5b9g/gMTbn91z+RA8Pv0fLffbeaf2I1iIAAAAAAAAAAAAAAAAAD6em3e449scXb6HaZ+n2mDehfxNhrcq9h5ePetypKE7V/HnC5GtK0p8qS8Vp5pKlaVrSvtw5s2vkrmwZcmHLSYtTJjval6zHymLVmJhweR4zjuY08/H8ro6nI6Ozjti2NTd18Wzr5sd4mtq5MWat6WiYn6Y7xPrExMRKTx7ML26m14XPR9Eu8TbZW843cuY2p4x1YuwlLZaT4k42sPH5V8KMrOTrYTlHGrsI2cKmFYrHLzsi5CxelOS/hn445dKcHC9X5bZ9aZri1uVt3+Jg7z2pXa7RMXx9/rfiRWnkrMWvaYiZUge3D7rPQ6lrynid7OfH4OL5qlM3Ic50BS0Rpcp5K2vsZuBnJaMmDdvWJzfUk5NmdnLE4NbDS2XHWsvHjXJdBzHQ6rlHF9tgb3j+7w7Ow1W31mVZzcDOxL8aSt38bJx53LN2FafKsoTlSkqSjWvmlaJa62zg3MGLa1cuPPr56RkxZcVovS9LR3i1bVmYmJ+5LXo5rheW6c5bf4PneP2+K5fi9nJqb/H72DJrbWrsYp7XxZsOWtMmO0ekxFqxMxMTHpMPuPe+WAAAAAAAAAAjIe8Vdof8Adj004j3UcT1VJ7rp5cxuNc8u41qlZ3+L7LOnZ12ZdjClLlzItbjZ4lid6VZ0t4lukaxjGHqpGn2hekvqzjdTqjUxd83HzXW3prXvNtXJeYx3mI9ZtGbJSvf17Uj6Ihd37nX2hvwuda9Q+A/P7814zrCmbm+lKZskxXFzulq1ybutjm8+SmLJx2lny1x1is32LzPeZt2mGsh62PQAAAAAAAAAAAAAAAAAE3/3fHu4udX+3vddAOUbOuVzHotkXr2npk3viZufwrZZsb9rKn5lWtLOuz9pa1NikYxpGzYtx+daeazX8AOrJ5fgM/AbWXz7fDWm2HzW73yaWW/mi0+v4nHkyxhr6R2rWPz2sJ73b2fKeHni9xni3wejGv054l4seLkfg4/JravU2jqziyYK9o/2zd1NDJyGWZme+TLefTv2jZ97Qzua1Pah2p9U+qGZl2rO7px/K0HEsWt6lvLzOQ7/ANGnxJ4MPPxL1/WfT67WUbcZVjZwrk50pCMpUyZ4g9S4uleleU5O94rn+p76+pXv2vfYz9sNJpHfvNsXn+LMR37VpMz6IO+yD4I8h4+ePfQfQ2vr3ycZ+C+Dluoc/wAOb6+vw/E+bkdiu1btNMePd+pY0K2vNYtk2a1rM2mImtZ3+92fJ97ueSbrKuZ243+12G52mZdlWVzK2G0y72bm351r/wA69k37lyv3vMvlTwrh2M+TZz5tnNab5tjLkzZbz87ZMt5ve0/dta0z+u3TeJ4vS4Ti+N4bjcFNbjuJ0NTjdHXxx2pg09HXx6utirH9jjw4qUj7kPkPU+gAAAAAAAAAAAAAAAAAyd7Ou3XkfdP3FdMujPHsS7kU5NyLG/NvIjanLHwOP4ELuy3GRl3o+IY0LmDhX8WxduyjCuXfsW6eqc4wl2bpDp7Y6o6h43htek2+qdivx7dpmuPXxxOTNa0x6ViaUtSszMR57Vj5zEThH2i/GLhvAnwd638SeY2MeKeD4fN+BmGcla5tvl9u2PS47Fr4573zWptbOLPlpjra0YMWW8+WtbWrZh9NOn/HelXAOH9OeJ4VrA49wvjmm43q7FqEIecXT6/H19u9dpCMYzyMiOPS9kXfTSt29OdyXzlVZLxuhr8XoafHalIx6+lr4dbFWIiPrcOOuOLT2+drRXzWn6bTMz82k71r1dzHXnVvUXWXP7OTb5fqXmeR5rey5L2v2z8jt5tu+Ok2m01w4pzTjw07zFMda0j0iHOHNdXAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJn92lr/y89ao/h6cTr/Nu+P0r/pokn7N/4+8z+l0/w2BSX76uP+pT4aT9rrOsf+jOWTMUxWt2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0B+1F9tDxPtWlsejnQK9o+cdbZWrmPutlcuTz9BwSl6lYU+kywMizG/vYw9V6zh1zIzxJSxr+VjXbN2MZ4F8TvGTV6W+Jw/Azg3eamJrmyTM5NfR7+n180tXzZ+311aef63vW1qzEwtp9hj3a/P8AjxGn4jeLOPlOl/DGuSmXjNKlK6nLdVTjmLT8CNvDkti4qbdseTZjXmuxEZ8WDPTLjm1YYnWbr51d7geXbLm3VvnW+5lvdnkzybtzZ5k5YmPWUq1jaw8C1S1hY1u1HxCHwrEZ1jGlZynLzKsOOZ57l+f28m7y29n3M+W02mct58le8+kUxx2pWI+Udq9+3zmWyX4b+E/h74R9P6XTPh90rxXTfFaOGuGlNHWrGxl8sdrZNjbyefZz3yW73t8TLasTMxWta9ojp58hkQAAAAABkD26dz/WftY59quofR3mOx45ttbl2r+TgRvXLml3WNGUaZGv22urKlrIxc2xSeNflb+FlRs3JVsZFm7GFyP3+nepuZ6X38XIcPuZNfLjvFrY/NM4c1Y/FY82Pv5bVvX620x2t5Zny2ie0xiTxj8D/Dbx36S5Do/xH6c0+Z4/d18mLDt2x0pyXGZpiZw7nH7kVnJhz62Xy58Vb/EwWyUj42HLSbUtPq9mx7Rjp9369LYZ+NPF0PVniuPYxuoHDK3vTdx8msY+jb6yzelW/f1GbSVKW78ZX7cci3k2a3qzszjGePhx4h8f13xnxKTXByurWtd/T79prbtHbLji0za2K/f0tE2jzRavfvHZqce2j7HHV3so9dW1M9djlegOfzZc3SPUvw/NjzYYtbzcfvZMdYxYuR1prM3xTGK9sNsOWMcVyVm2y1khCkAAAAAAAAAAAABCP9tZ2Td0fM+9Hl3Urp/0T6i9RuIc0wdVlavacD4nu+V2rFcPX4+vvY+w/MTCzPoV+l3DuTjbyK25ytztzpH0zjWsLPGfovqfc6y2+R4/heQ5HU3KYr4sujqZ9qK+XHXHNcnwaX8lu9JmIt2mYmJiO3q2cPdne0z4F9N+zV0/0X1b4m9HdHdQ9Nbe/r72j1Xz/GcBky/VG5m28eXU/BPZ1vqrFOPZpWb4fPWL1vWZ70tEahf9wl3qf+Sf3Df+iLnP9iMSfhG6z/Mr1B/cne/zKw3+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEmf7hLvU/8AJP7hv/RFzn+xD8I3Wf5leoP7k73+ZP56j2af9/zwg/8AvC6W/wBJn+4S71P/ACT+4b/0Rc5/sQ/CN1n+ZXqD+5O9/mT+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEmf7hLvU/8AJP7hv/RFzn+xD8I3Wf5leoP7k73+ZP56j2af9/zwg/8AvC6W/wBJn+4S71P/ACT+4b/0Rc5/sQ/CN1n+ZXqD+5O9/mT+eo9mn/f88IP/ALwulv8ASZ/uEu9T/wAk/uG/9EXOf7EPwjdZ/mV6g/uTvf5k/nqPZp/3/PCD/wC8Lpb/AEm8d3sX7z7Fq7fv9qfcHas2bc7t67c6Sc4hbtWrcazuXJzlpaRjCEI1lKVa0pGNK1rXxR+T0P1lWJtbpbn4iImZmeJ3YiIiO8zM/B9IiPWXnj9qT2bMuSmLF49eEWTJkvXHjx08Qel7Xve9orSlaxycza1rTFaxEd5mYiPVi7mYeVr8vKwM7Gv4edg5N/DzMTJtTs5OLlY12VnIxsizcpG5av2L0J2rtqcYzt3IyhKlJUrR1i9LY72x3ral6WtS9LRNbVtWZraton1i1ZiYmJ9YmO0s5a+xg29fBt6ubFsa21hxbGtsYb1y4c+DNSuTDmxZKTNMmLLjtW+O9Zmt6Wi1ZmJiXrvF7gAAAAAAAAAG6/2WXtZufdnXMdV066nbXY8v7f8Af59nDz9bm3ruTm8LuZco2IbnSZFazuQxcW7K3fzsO7bybdzEjk28eOPdnC7DM/hf4rb/AEhuYuO5PLk2+Az5K0yY72m19KbT5YzYbes+SszFslJ80TSLRXyzMTFZvt2+wB0n7RnTm/1j0RoafT3i5xOpl2dTd1sWPBq9TU162y243lMURWls+ekXxauzS2G9Ni2G+a2XHS1LTv8AhHNuMdRuJcf5zwzcYW/4vyfWY2202219+1k4uXh5UKTjWN2zOcKXLUvVZyLXq9djIt3bNykbluUaTn0t3W5HU197TzUz6u1irmw5cdotS9Lx3jtMTMd4nvW0fOtomsxExMNVfqfpnnOjeoOX6X6l47Z4nnOD3s/H8lx+3ivhz6+xgt5bRNMla2mmSvly4cnby5cN6ZaTNL1meVOU+CAAAAAAAAA656udNOPdYumfN+mPKcSxmaTmvGtvx/KhkW6XYWJ7HBv42PnQhKlafHwMi5azMeVaV9N+xbl4r48Pnctxuvy/G7vGbVK3w7utm17xaO8VnJS1a3iP7LHaYvX7VqxLuXh71tzHhz1t0x1xwWxl1uT6Z5rjuXwWw3nHbLXT2sWfNq2tExPwtvDS+tmiJjzYst47x37qynuh6F8i7bevPUzo1yfDv4efwzk2dh4kb8fTO/pcmdM/QZlflSlfpmlysDJrWlKUpW7WninjwrW6n4PY6c53kuG2aWpfS2b0p5omJthtPnwX9fn58NqW7/dbt3gb4pcP4z+FPRPiRwmxi2dXqXhNXZzzinvTFyeGs6nLa3zmY+puSwbWCIn17Y/nLoN8FlgAAAAAAAAAAAAAAAABn/7M7un2faX3bdM+fRy7tri243GPxLmuDS5W3i52j5BWerhczPH/AOB1WdmY238+Y0pPCjWVfRStK998NuqMvSnVnGb8XmNXNmrqbuPv2rfBsd8Xe/3MV71zfn0jv6QiX7bHgTo+0B7PvW/SdtfHfnuO47N1B0xtTSL59XlOIiu9amt3if6bv6uvn475TM12piI7zDZv7wZ3l67rF1V4L0D4FvLey4P091Gs5busjByKXsHack5Lp47LV5Fm/YlWzesWuP7uxauWqyufDyoS9VYzj6Y5K8fuscfMcro8DoZ4yaXH4cW3ntS3emXY2cMZcVoms+Waxr54iY9e1o+iYmEIfdF+zfueHPQXVXix1Zxd9LqjrDkN7p/jMO1hnHtaHC8JyNtLew5MWWvxMWXJy/GZb0v2pN8F47RNbd5jko8LkgAAAAAAAAAAAAAAAAAEz/3eHs2l0+6Vck7puZ6atjk/U6mTx/hNM7GraysDiGv2cY5eVSzfj8W1PZbDVWsnDyoUtUva7IpWHxLd2k6zH9n3o78D+K2eqN3D5dnk/Nr6Xnr2tj1MeSPPbtMd4nJkxRalo7d8dvTvE951svfA+0fXq7rzhfAnprkoy8H0P8Hl+qJ1c3nwbfUW5pWtr4JyYp8l6aWnv3wbOC03nHuYe14pek1iSykipUAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABJh92ml47gOtEfw9M71fH8G94786f0pJezf+P/ADEf9jbfvZ9f/lUn++qj/qSeGtv/AKbY4/8ARXMT/iTN0xmtuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0i+2T9pRj9nXS+vS7pvscefXbqVqcq1rZwuxnf4Zx7L+Ngz5NPHjL1Uy7k4ZsNRO9+kQzcKsrtrIhStquFPGHxHr0hxc8XxuSs87yWG8YpiYm2nr37452ZrHyvMxeMM2+ti9O81tHos693D7Fmb2jOuY6660081PCrorkMF92t8c0xdS8xrzj2qcLTNavadelba1uRrj/AKbbV2e2PJhvNciBru91teR7fZb7eZ+VtNxt8y/n7LY5t6d/KzMvJuVuXr167OtZTnKUq/f8Rp4jGlI0pSkF82bLsZcmfPktlzZr2yZMl5m173tPe1rTPrMzP/JHo2sOM43Q4bj9PiuL1MGhx3H62LU0tPWx1xYNbXw0imPFjx1iIrWtYj7tp72tM2mZn5b1OcAA/qEJ3Zwt24SuXLkqQhCFKynOUq+IxjGnmtZVrWlKUpTzWpETMxERMzM9oiPWZmflER9My8bWrStr3tFaVibWtaYitaxHeZtM+kREeszPpEOd4fSzqVsMWWbgcC5fmYcI0lPKxePbS/jxjX6pSvW8aUKUr+GsnOpxfJZKzfHobl6R87V18tqx+vFZh1fZ666L089dXb6s6d1tm0+WuDPzGhizWmPSYjHfPW0z3+js4jsNVs9Terj7TX5mvv0r4rZzce7jXaV/ft3YwlT6q/XRxcmLLit5cuO+O39jes1n9qYiX39Tf0t/HGbR29fcxT8sutmx5sc9/l2vjtas9/z3oPW5YADKrs17rOednXXbiHWPhGXfpDVZ+PY5NpYXJRx+Q8Zv3aWtxqr8PNLcrmRr7mVZxbs6S+j3rtL0aeYu0dH9U73SHOanMaV7dsWStdnDE9q7GtM9suK30d7Y5vFJnv5bT3YH9o/wF6U9o3wr6i8OOqNfF5t/UzZeE5K1Itm4fm8VJycdv4rdpvFMO3TBkz46TX42PHOO09pWQvb1114P3IdIeFdYen+zx9lx/mGosZ8Y2bsZ3cDM/RWs7XZdulfXYv4uVau2/RdjCc7dLd2kfRcjWti/T/OaPUfE6XL8flrk19vDW8dpiZpf1rfHePnW1bxMesR3jtPbtLTK8XvC3qjwZ8Q+pvDrq7SzaXL9O8jl1LTkpNabet6ZNXcwX7eXLiz4L47+bHNq1vN8cz5qWiO6X2WNAAAAAAAAAAAAAAAAAAAAAHw+T09XG+Qx+9XR7an8+BkUejZ9dbYj7eDL/B2fU4Se3NcRP2uU0J/a28UqsrrHTx1d6qU/B1I5xT+bk+0oq/5j8duU/THd/jOVvY+HM9/D3oOft9GdLz+3wmi64fOdzAAAAAdg8e6TdUOW27d3i3T3mfIrV7x8K5peObbZQuefq9EsTFu0n5/82tXP1+K5PbiJ1eP3NiJ+U4dfLkifzvJWf/3+nzdR5jr7ofp+98fO9X9N8Pkx/wC2U5LmeP0rU/RxsbGOa/r9n3Nx0A648ehW5vukPUjTQpGkqz2fDd/hR9NaeqkvVkYFunp8V8+fPjx8/qe/NwPN68d8/Ecjhj598unsUj7f9djh8zjvFnwv5e3k4rxD6M5K8z5Yro9ScRtW83ft27Ydu89+/p2+fd1PfsXsW9cx8m1csX7M5W7tm7CVu5bnGviUJwlSkoyjWnitK0pWlflV8q1bVtNbRNbVmYmsxMTEx84mJ9Yl37Hlx5sdMuHJTLiyVi+PJjtF6XraO8WraszW1Zj1iYmYl4n48wAEij2I/tO9h0J53ru2nrTyG7kdI+cbG3hcM22yvTnXhPJc6UbWJhUvTlWNNNtc74WPS3OlK42Xn3ciV+liNLcZCeCviZk4Pfx9N8zsTbid7JFNPLkt/wDEtnJPalPNM9vg5b9q9p9a3yTbzeWO0U8e859h/U8Veldzxq8NeHx4fELpfTvtdScfpY61jqbhNWJybOzOOtfNPJaGt583nrMxn19WmGMXxZm9ptlm9ZybNrIx7tu9Yv2rd6xetTjO1ds3Y0nbu25xrWM7dyEozhONaxlGtK0rWlU062i1YtWYtW0RatonvExMd4mJj0mJj1iY+cNZHLjyYcmTDmpfFlxXvjy48lZrfHkx2mt6XraImt6Wia2rMRMTExMd4eR+vAAAAAAAAABFH9417QaZWu4T3b8Q1Pi5rqY/DupdzEseIysXr9y3puQbG5SlayvSyMjWaO1WtYxpat2o+msvnWK/tEdIxbHpdWamLtOPy6fJTSPnWbTGHYyT9vzWxYI9e3aI9F93ubfaGnBudT+z51FyHem58bqTommxk72jNjxUvyXEadO8RXHXFh3uVydomZvfJMz29ER9E9sFAAAAAAAAAAAAAAAAAP2MpQlGcJShOMqSjKNaxlGUa+YyjKnitJUrSlaVpWlaVp5p8yJmJ7xPaY9YmPnE/bfkxFomtoi1bRMWrMRMTEx2mJifSYmPSYn0mHu7HZ7Hb5Vc3aZuVsMutrHsVycy9O/frZxbNvGx7dblysp1hZsWrdq3Sta+mEIxp8qPPJlyZr+fLe2S8xWs2vabW7UrFax3nvPatYiI+1EQ42no6fH4I1tHWwamvGTLljBr464sUZM+W+bNeKUiKxbJlvfJeYj1taZn5vReDlAAAAAAAAAAAAAAAAAMseyTtr5D3X9yfTPo9o8S7exN1v8AGyuS5dLU54uu43rKXNltb2Zej4hjW8nGxLmBYu3ZxhXLyse3T1TnGEu1dFdN7HVXUfG8RgpNqZtittm8RM1x62Pvky2vMfiYtWk46zMxHmtWPnMROAvac8auH8AvBbrfxF5XYpi2OM4nNg4XXm9a59zmt6aaWhj1sc97Zr4M+xTby46Vtb6nwZbz5a1m0WXPAuE8f6bcK4rwHiuFa1/HuH8f1HHNRi2oQhSGBpsDH1+NW5S3GMZ3p2ceEr1zxSty7WU5fOVVkehpa/HaWroatIx6+nr4tbDSIiO2PDjrjr37fO0xWJtPzme8z6y0perOp+X606m57qzndm+3zHUXL8hzPIZ72tbzbXJbebczxTzTaa4q5M1q4qd5ilIrWPSIcuct14AAAAAAAAAAAAAAAAABDM95m/X87dPxZcr+0Gr/APgh17Sn4/dPfpZtfxjH/wAjZF9yX9ifxj/VvwH3o3v+VGaRsXZgAAAAAAAAAAAAAAAAJLfu1EvHcP1lj+HpfkV/lpv+N/8Ax/zfwJIezfP+yHmI+j8C7T/5xrKU/fVV/wCo/wCG9vtddYo/b4jmkz1MhrZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOqeuHV7ivQbpRzrq3zPKt43H+Dcc2m/zIzvQs3Myuuwr+Xa1+LWfn4mZnSs/R8WzCM7l29OMIQnKtI1+VzfL6vA8Vvctu2iuvo6+XPfvMRN/h0teMde/zvfy+WtYiZmZiIiXffDDw857xW6+6W8PumsF8/L9U8zocRrTXHbJTW+rNnFr33M8V7eXW1a5PjZ8lprSmOtrWtWsTMVoXdP3Ccy7oOufPesfNdlez8/k+6yrmvtXJT+DrdLZuVtazAxLU5Srj2LePCN2dqlaU+kXr8/FKzrSlbnVHUG51Nze/wAxu5LZMmzmtOOJme2PDE9seOkT+JrFYie39lMz9Ldd8CfCHpzwN8Luk/DjpnSx6mpwfG4Kbl6RX4u7yeSkZN7b2MlYr8XLfNa1K3mO/wALHjr3ny95x6dfZeAfe4xxfkPNN9q+L8U02x5ByHd5ljX6rT6nDv5+xz8zJuws2MfFxMa3dv37t27OEIQt25SlKVKUpWtXv1tXY3M+LV1cOTY2M9648WHFS2TJkvaYrWtaVibTMzMREREz3fK5vnOI6b4rf5znuS0+I4jjNbNub/I8hsYtTT1NbBjtly5s+xnvTFjpSlbWta9qxERMzPZKO7Hfd49husXSdQu7/kORqcPLs42wx+l3GbuLHZRjKkb9uzyHa3IZ9mlq/SsbeTg49rBzbFKXYSuwnWPpk70T7PuTNXByHV2xbFS9a5K8ZrTT4kfTFdjLMZI7W9ItSsUvXtMTMSov9qD3wGpxmfk+kPZ34fDyGzgyZtPN11zmPPOlMxM4r5OH0KX1MnxMUxa+HazX2tXLM0tFLViYmRt0d7Eu0joPhWsPpp0K4JpawsxtXMrL1kt5k5EqRpGV65Pe3tlGN2fj1SrZhapSvzhSKRHEdDdJ8FSKcbwejh7R2m18U57Wnt2mZnPOTtM/8GIj7UQpu8Rvap9oLxW2b7PW3ip1XyUWyTfHg196OLwYYm3mrjpXiselM46/KIyWvMxHa0yyItdP+B2LdbNjhPEbNqtPFbVrjemt260/BWEMKka0/e8OwxoaNY8tdLUrX7Ua2GI/ainZh7J1b1XlvGTL1N1DkyRPeL5Oa5K94n7cWtszaJ+73cF5r259BuoupyNHzPpFwDeazKjKORj3eNa3FncjOniVPpWvsYmZHzT78MiNfwV8uDu9O8FyOK2Dc4nQz47x2tWdbFWZ7/8ADx1peP1rQ7T0z4yeK3R3IYeU6b8QureL3teYnDmx83u560ms94/pG3l2Ne3b7VsVoaV+733fvtw6r6nP3XbpKXRLm9uF/Iw9VZuXtlwzYX60lc+DlYubK/tLVy/OtYRvQ29qzalKMpQrCNaVwz1b4B9O8riyZunZ/AXdiJtTFE2y6d59Z7WpebZYm0+nf4sVj09IiFlvs8+9v8ZugeQ1ON8Y618TumL2xYtnfyUx6XUupiiYp8XBsa0YtHJTFXta2O3H5MmSImtbRaYlEO7o+0rrX2g9RM7pz1l4tl6TYWpylqtvbtzu6LkOF5l8PO02zhSeHnWZUjKlymPfvVsXYXLNytLluVKRK6n6U5rpHkL8dzOrbBkie+LLETODYp9F8OWO9Lx9vy2nyzExPaYlsLeBftAeGftD9HavWfhvz2vyenkpWN/j73rj5XiNntHn1eS0bTXZ1clZmPLObFjjLS1MlI8t6zONDrbNYDf97DP2hk+3Lq7DoB1M3l2HSTqvs8XD0t/Nvyrh8U5pm1tYODkW5Tr4x8Tb3467ByqyrTGxYRuZMqQrK5OuevBHxBnp3lvwB5PPMcTyuStMNr2+s1d2/amO0d/xNc1vh47esUpETae3rKpb3o3sg18ZPD23i10TxeO3iD0Bo59jk8WriiNjn+mdb4m1tYbRWO+bY47Fbc2sEVic+e00wVm0RSictZvWsi1av2LkL1i/bhes3bcqTt3bVyNJ27luca1jOE4SpKMo1rSUa0rStaVTdiYtEWrMTW0RMTE94mJjvExP0xMesS1c8mO+LJfFlpbHlx3tjyY71mt6Xpaa3pesxE1tW0TW1ZiJiYmJjvDyP14AAAAAAAAAAAAAAAAAAAAPh8nl6ONchnWvikdHtpefwenAyK+f8z0bM9tbYn7WDLP7WOz6nCV83NcRWPXzcpx9f29vFCrK6x19XV7qpL6/PUjnFf5+T7Sqr/mPXl+U/THe/jOVvY+HMeXw96Dj7XRnS8ftcJow64fOdzAAAbTfZ/eyl68d9OdTf4FqfT7pLg5VuOw5/v8AX36Y2zhbuQ+k4vG7NyeNXa3609WN9JxK5VjFyKXK34Spj3bbKHQXhZzvXF/j44nj+KpaIyb+fHby5YiY81daszX4tv63z189a27+aJ8swgn7W3t7eFXss6v4E7d69X+IG1gvbT6S4ncxTm0r3pb4OfmsuOuaNDFE+XNODY+Blz4Zr8K0TlpZL57ZfY79lPblqdVL7m2H1J5tgwtzyObc5uXNhsbuTTxO5SzhYlcDURxY3ay+BC9rbt2Nv0xuXbkqVlWW/TXhB0X07ixT+BtOS3ccRNt3emcmSbfT2x08mHy9+/li2OZiPSZn5tePxt94v7THjLyG/X8Omx0X0ztWvXD0x0tSmnp48H4mnxNrYja5C2eaRX4t8e5THN+9qUrExEbJNd0/4Hp7VqxquFcT1tqzCNu1DB47qMWkIQpSMaU+DiQr8qUpTzWta1+uta1ZGx8fo4YiuLS1MVaxERFNfFXtEfL5UhDDc6t6q5G98m/1Lz+7ky2tbJba5jkM83taZm0z8TYt85n876Pk93K4lxTOp6c3jPHsyNaeK0ytLrcilaePHjxdxp08ePl4/A876mrf0vra94+1fDjt/hrLi4OoOe1Z763N8vrz3798HJbuGe/z798eas9+/wBLFDrn7Pbs/wC4jCy7HUnohw7N2GRYuWrG71WFPR7LAuzhWEMvFrqb2HiSyLNa0nCuVi5Fuso09dudPNK9V5zw/wCkeoaXryXCad8lqzFc+Kk4MuOZjtF6/BmlZtHzjzVtHf5xLPvhb7XntE+D2zr5Oi/E/qPV1MWWmTLxm/s15TS28dbRa2vnjkMeznrhydvLeMGfDbyzMVtWfWIsftAPYLdRug+r5B1U7b9nsup/TvWxvbHY8QyMeGTzXQ4FJVuX7tmmFaxqbjEw4VlOsMLW1u4+HCt3Iu1pauXKxe6+8CeR4LFscp05ly8nx2KLZcmpasW3cGP52mvw61+NSkd5+tx960jvafSZXteyT71vo3xW3+I6D8ZtHS6G6x3Zx6en1DhzXw9M8tt+WK4seWdrJmnjtjYtEVi2zuxjzbFophpE5KUiOxkY9/Fv38XJs3MfJxr1zHyLF6Erd6xfszlbu2btudKSt3LdyMoThKlJRlGsa0pWlaI92ratrVtE1tWZrasxMTW0T2mJifWJiY7TE+sSuGxZcWfFjz4clMuHNjplxZcdovjy4slYvjyY71ma3pekxatqzMWrMTEzEvE/HseWxfvY16zk4925YyMe7bv2L1qcrd2zetTpctXbdyNaShctzjGcJxrSUZUpWlaVpR+1tNbRaszW1Zi1bRPaYmJ7xMTHrExPrEx8peGXFjzY8mHNjplxZaXxZcWSsXx5MeSs1vjvS0TW1L1ma2raJi1ZmJiYlPG9hx337Dun6CZXS3n2xt5fVHopYxdVeybtylc/f8P8Y8NTuciHq+vEllW9J66Qj8T6BS5P1TlKVZ0eCXXOTqjgb8Xv5IvynC1ritaZ/pmfT+tjDmtHf+tm8YO/aO/w+8+szM6qPvQ/ZV0/AjxXwdddJadtfoXxMy59/Hgx0mNTieou+W3Icbht2/8A4iuvflO1rT5Z25pTtWsVjeazeq4AAAAAAAAAdMdwvRnjncD0Y6idIuUYeNma3mvGNpqrX0qFJ28Pa3MW5LTbKNK+PFzW7SOJnW6/V68ePmlaeaPjdQcPr8/w3IcTtUrfHu62XFHmjvFMs1mcOT8/HlimSPo71jv3j0ZJ8IPEjmfCPxJ6P8Q+C2c2tu9M85o8hk+Bby32NCmeleS0pn1+s3dG2xq39O/lyz27T2mKyTrj0n5D0M6t8/6T8pxcjE3HCOTbPSXI5NuVq7kYmPkz/M3P9EoxrSGx10sXOtVpT0yt5EJRrWNaVVqc3xWxwfLb/FbVbUzaOzlwT5omJtWtp+Hk7T29MmOa3j7lo7ejdy8L+v8Ah/FHw+6S6/4LYw7HHdUcJo8nS2C8ZMeLYzYa/Vur5om0TbT3Iz6uSO/eL4rRPaYmHVL5bvoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACa97vb2Zz6V9GN73Mc001cbmPVul3WcTpm4/wsvXcJwdhH1XPhXo/Eh+a2brMbY4mTGlul3BvxrCs7VykqzP8AADo6eL4bP1Lu4fLuct3xakXr2tj0qZI7z2mO8fFvirkpaO3elvTvE951nPe8+0hXrvxJ4rwS6a5GM/Tnh9OPe5+dbN59fd6n2tS3lp58c+S34H627n09nBabzj2sU+aK3p5YkdJEqagAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASVfdqZf+Ef1ij+HpVly/m5Dxmn9KR/s3/wBUXMR/2Kv/ABjV/wCVSx76mP8AqM+HNv8A6e68f+h+bn/Emhpkta4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF+94/wC6CvHOnfTvte0GwnY2fNci3zfmeNauyhclxzAzaR4/T9LlCVLd7a6vZW70ZVnC7bp6JRpTz5jL7RXU31Nx/H9Ma+Sa5d20bu7WLTEzrY7/AOp/lMek5cWSLRPeJj07Lx/cz+Bscz1h1j458tp1y6XTOG/THTWbJji9K8xt6025efr4tXz49De07Y7Vitsd580W79u0OhEFsYgPq6PR7bku51fHtDr8vbbrdZ+Lq9VrMGxdyc3P2GdfhjYmJi49mM7t6/kX7kLVq1bhKc5yjGMa1rSj24MGXZzYtfBjvlz5slMWLFjrNr5Ml7RWlKVjvNrWtMRERHeZntDgcpyfH8Lx29y/Lbmvx/GcZqZ97f3tvLTBrampq4rZtjYz5sk1x4sWHFS18mS9orStZtaYiJlPP9k37LPg/aX010PUrqbxvVb/AK/8oxbe2ytln41MifDMHMx7f0bSYFq5KePDKtQ9eTeyqwnkWr2VK3Gdq5Yp6Z1eFPhfpdKcbg5Lk9fFn5/arGa2TJXzTpUvWPLgxxMzWLxHe1rdptE2mImJj01TPb99uzqj2gOtOV6K6I5nf4jwk4LPfj8OlqZpw16l2tbNf4/J7eSkUzWwZLeXDjwRauLJjwRea3plnzbtPq+pmlWSAAAAxj7qO0vo53d9NNz056scX1+1hl4OTb0m9rZjHccc2U7cq4ey1ubClLsZ4eT8PJjYufFxrk7fi7YuRlOMutdU9KcP1bxubjuV1seWL0tGHP5e2bXyTH1mTHePXvS3a0VnzVmY9azEzE5v8B/aA8RvZ66243rLoDndzj76+1hvyfFxlm3HczpVvH1TpbutaZx2ps4PPhtlp8PPSt+9MtLVrMV2feb2l9QuzbrjynpHzvByI2cHLuZfF97XHuWsHkfHci5OuDscC9Lzavwj6bmJfnZnONMrFvxr6JRrbjXt1j0pyHR/N7XE79LdqWm+rn8sxj2de0z5MmOflaI9aWmszHnraPT5RuG+zd4/9Ie0d4X8F4hdK7WGcm1r01+c4qM1L7XDcxhpWNrT2scdsmG1u9NjDXJWtpwZ8U97RMXtie6qz48ti/fxb9nJxr13HyMe5C9Yv2ZytXrN23Kk7d21chWM7dyEqUlCca0lGVKVpWlaP2trUtFqzNbVmLVtWZiazE94mJj1iYn1iYevLixZ8WTDmx0y4ctLY8uLJWt8eTHes1vS9LRNbUtWZratomJiZiY7J7XsUvaAWe7HoTZ6Yc32MJ9YujuBi6rayv3KfSuScap4jqd9Sla0pKdukrmsuW7dPVGGt+Ncp+jrKs7fBjr2vVfBxxm7kieY4fHXFl80/XbGt8sWf7XeO84piPWIxxafm1RPeY+yTk8AfFTJ1z0xp2r4c+I23n39CMWOfgcLzc955DiZmI71pea03cd7zFZtuzipM+Tyxu5ZqVjAAAAAAAAAAAAAAAAAAAAOIdQs61rOA842V+cYWNfw/kudenOVIwhaxNLm37k5Sl4pGMYW5VlKtfFKUrWvycTkLxi0N3Jae1ceps3tM/KIphvaZn86Idi6Q1cm91Z0vpYqzfLudRcJq4q1ibWtk2OS1sVK1iPWZta8RER6zM9o9VWh1Rybeb1N6i5lmVJ2svnfLsm1OlaVpK3f5BsLsJUrT5VpKM6VpWnyrSvlWBydovyXIXj5X3tu0dvl2tsZJj/C3rehsF9bono7WyRNcmv0t09gvWY7TW+LidTHaJifWJi1ZiYn5fJwVwXaQAG5z2Qfs1M7vY6n151z/Ey8ToR0422Le5FdpCtqnLdxixsZ9ji+NfuRlT6Ne+Lh120rMZXpa+/ft2L2Ne9N+GY/CTw3ydacn9Xb9b04PjstLbE9pr9V5qeXJXVraY/E270+L29fh2tFZrPa0Vt+8O9tXV9mXob8K3SefX2fFXrPj8+Ph8c3jJPT/G57ZdTLzubFS0T8bF5NmNCuWYpXbxYr5MebH3xXnqcN4XxTp7xvVcR4VodbxvjekxLODrNRqsaGLiYuNYhSFuEYQp5nLxTzO5clO5OVaynOUq1rWdenpanH62LU0sGPW1sFK48WLFWK1rWsdojtHzn7cz3mZ9Zlqj9SdS891fzW/wBQ9S8ru81zPJ7GTa3uQ381s+xnzZbTa1ptae1a9/StKRXHSIita1iIhyhynwwAAH8XbVu/buWb1uF6zehO1dtXYRuW7tu5GsLlu5bnSsZwnGtYzhKlYyjWtK0rStaPyYiYmJiJiYmJiY7xMT6TExPpMTHpMT83lS98V6ZMd7Y8mO1b48lLTS9L0mLUvS1Zi1bVtEWrasxNZiJiYmEWD23HspNPsePbbuw7deKW9duNJZlndVuH6HErWxtdfblWmRyrCwbNKzs5GBjShe2dceP0aGBg3sm5Zty+JkIveNXhXhya+Xqvp7VjHmw1m/K6eCszGXHEz5tqmOI7xbHXtOXy/Wxjpa01j1svd92N7e3I6fMcf4A+MXP33OO5PJGr0D1FyuxEZNDctWJw8DtbWTtXJh280Wx6MZrRnvt7WPDTLePJiRCq0rStaVp4rStaVpX66Vp8q0r/AAIkthmJiY7xPeJ9YmPlMfbfgNnvshO4rK7de+DpRtb2wuY3Guc7SnT/AJHg/ErDG2X91Vq9pNHHKp5p6o4W72WHm2vnTxdsxrX5eaMmeEnUNunutuKy2yTXW3ssaGzTv2rk+qothwef9BmyUvH3YQe94b4O4PGL2YOvuPxadM/N9LaP4buG2vJ58+l+AOTHyfKTg9J7Ts8Zp7Gtk7R3nHktEevZYtRlSUaSjWkoypSUZUr5pWlaeaVpWnyrStPnStProsM+fyadMxMTMTExMTMTEx2mJj0mJifWJifSYn5P0fgAAAAAAAACH37xj2gx4/yzhXdjxDU1hruVxtcT6izxLFZUhvMS1chrN1myt09OPYu6+xrNVCdykYXMn0x9dbk6RrEX2h+kY19vS6q1MXbHtdtTkZpX5Z6RMYs+SY9K1nHXFhiZ7d7do7zMtiT3OPtDTy/T/U3gD1DyEW3OAtk6g6OrsZYrNuL2MlLb3GasXnvmy03Mu7v2rSZtTD3maxSvdFrRhXqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMxuw3tg5B3b9zfTXpJqMS7e1WZu8fa8uzqWp3MXWcY1Pr2GwuZtyNPRj2s6OLTV2rtyUY/Sc2zGlZSlGMu39C9M7HVnUvG8ThpM4r565dy/aZri1cXfJkm8x+JjJ5YxRMzH12SsfNHP2q/HHiPZ98EetPEHkdjHj39bjM2h07qzkrTPu85yHl1NOmtSfrsuTVnPO/kpStp+Bq5bTEVra0WVvDOI6LgPEuNcJ4zhWtfx/iei1PHdNh2oRhGxrdNg2Ndhwr6KRpK5THx7fxLlaeq5P1TlWsq1qsg09TBoamtpa1Ix6+pgxa+GkREeXHhx1x0j0+c+Wsd5+cz6y0rupOoOU6s6g5vqbm9m+5y/P8AK7/Mcls5LWtbLu8ltZdzZtHmmZrSc2a/kpE+Wle1axEREOSuS+IAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACSf7tVL/AMJbq/H8PSbOl/NyPi9P+/8AAkd7N8/7JOXj6fwJvP8A5zqwpc99RH/UU8Op/wDrB1o/b4XnZ/xJpKZTWqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV2XtkusmV1i7+Osd6uRLI1HBc7D4Px6dZ1nGmrwMS1spRjTzWkaU2G0zqVpSlPn5r99Xt4w8xfl+vOYmbebFo3po689+8Rix1jJMR+yZb9/l6tw33cPhxg8OfZO8OccYow8h1TrbPVHMVisVmd7b2L6VbW9O8zOno6vrMzMx2/OatGME6wEhD3fjtExOsvcNuOunMdPb2HDejOPau6a3mWvXhZ3M8yFyuFOFfl5ytDcrrtnbj5rHzchW5CUa+K5+8A+kqcz1Bm5zcwxk0+GrE4YvHel9y8TNJj/hYJ+Hljv8ATMd4mFRPvcPaF2PDfwf47ws6c5G+n1J4lZsmPkr62Ty7Or01r2pG1S0evbBy1I3NG89ontS3ktFoTh6UpSlKUpSlKUpSlKU8UpSnypSlKfKlKU+VKU+pNpq/TMzMzMzMzPeZn1mZn5zM/TMv0fgAAAADRf7eDtBxuvfatndV+N6a3kdROifxORQy7FrzlZXD7VYX+RWci5T5yxtZrLOfn2o+Y+m7cnKvqpXwwh459I157pfJyuthi3I8L32IvWPr7acTFtitp+muLFGTJEfRMytK91V7Q+bwo8eNXoHmuSvh6P8AE7ycPbXy5P8AU+DqK8WxcNlw0n0rm3t3JqamS0d/NSla9o+aBvWlaVrStPFafKtK/XSv4KoLNq75/IBlz2Qd1nK+znuI4L1k45lZEcDWbPHweX6y1WdYbniOddjjb7ClZjX03MiWrvZlMKc4XPgZM43IwlWnivbOiuqdvo/qHR5jWtaMeLLWm5jjv2zal5iuenaPnacU38kzE+W09+yPntP+AvA+0b4PdU+G/M4cU7e9o5trp3evFYtxvUOrSc/E7UZLR3phrvY9edmtbV+Lhrak2iJ7p0+n9r92E7LU6vY5HXDQ6/Iz9fh5l/AyK0jfwr2Tj2713EvUrONfiY9ycrU/MY+ZQrXxTz4Thw+LnQeTFiyW5zXx2vjpe2O3fzUtasTNJ+7WZmJ/Oas/I+7w9q/S5De08Xhfyu3i1dvY18W3h9cWzjw5r48exjmKzHkzUrGSvrPpaPV9L++49gf7vnG/8qP+tez+az0D+X+t++4f9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACD++49gf7vnG/8AKj/rT+az0D+X+t++f0Pn2s/96fmf2p/yD++49gf7vnG/8qP+tP5rPQP5f6375/Q+faz/AN6fmf2p/wAg/vuPYH+75xv/ACo/60/ms9A/l/rfvn9D59rP/en5n9qf8g/vuPYH+75xv/Kj/rT+az0D+X+t++f0Pn2s/wDen5n9qf8AIP77j2B/u+cb/wAqP+tP5rPQP5f6375/Q+faz/3p+Z/an/IP77j2B/u+cb/yo/60/ms9A/l/rfvn9D59rP8A3p+Z/an/ACCvtcewOlK1+75xv5fglHz/AP8AU/ms9Bfl/rf9P1z+h8+1nP8A/ifmf2p/yGsb2jntx+3u90H5x0s7ZOR7DmvUXnum2HE8rcV02ywNJodDu7FzWbvJhm5Fm3Yzsq/qsnMs4ccbJpKxkSs35wuW6VhLGniL429P24Le4vpnYybvI7+HJqXyzhyY8GvgzROLPbz2iK3tbFa9aeS31tpi0949Jm97GvuvPF7H4q9LdeeN3DanTXR3SnI6nP6/HRyWnt8ny3LcZlpu8XgtrYclsurr4t/DrZNmc+Dy5sNcmKl6XmLRDJu3bl67cvXZyuXbs53blyVfMp3LkqynOVfvylKtZVr9+taodTMzMzMzMzMzMz85mfWZn7sy2R6UpjpTHjrFKY61pSlY7VrSsRWtax9EViIiI+iIfw/HkA5Nwvie255zDi3CdDZlkbvl/ItLxnU2YxrOtzY73ZY2rwoemPitaSycq1Svzp8q/XT63J0tTLvberpYKzbNt7GHWxViO/fJnyVxUjt+ivD4nUvP8f0r07zvU3LZa4eM6e4fk+b5DLa0VimlxWlm3tm3efSJjDgvMfP1+iVmX2Xdu3G+1ztv6YdI+P63HwL+k43hZHIbtuzS3kZ3ItlGWx21/Mn+ru3rOXl3cSEp1rWNjHtW/NaQosn6N6e1umOnOM4nXxVx2w62O2xMR2tfYyR8TLa8/OZi95pEz3mK1iO/aIaTHtKeMXNeOnjN1x4g8vu5tvFyfNbWHh8d8k3w6nDaU10+Pxa1fxOPHk19fHsXrWIi2XLe8x3tLKd2hgkAAAAB8/barXb3V7HS7fDsbDVbfBy9bssHJh68fMwM6xcxcvFvQ+XqtX8e7ctXKeaVrGVfFaV+b15cWPPiyYc1K5MWbHfFlx2jvW+PJWa3paPpi1ZmJ+5Ll6G/ucXvafJ8fsZdTf4/a193S2sNvLl19rVy0z6+fHb6L4suOmSs9pjzVjvEq4H2n3azldpvd51J4JYxJY/Et7srnL+D3/h1tWcnRbykMy9DGjWlKfA1+1vZ+st+PPiOHSla1r8611+JnS9+lOreS0a08upnyTt6M9u0WwZu17RWP7HHlnJij9A3MPYd8dsHj/7PPRfVWXYrl6g4rSp071Ri88XyYOU4vza+K2e3ee+Xc0Meru3me3edjv2jv2a9WP0vXKeDb+fFOa8P5TblKFzjXKeP7+3OHn1QnpttibGEo+Pn6oyxqVp4+fmlPHzcrSzzq7uptRPadba188THzicOWmSJ/wDFfC6o4mvP9M9RcFesXpzXBcvxN627TW1eR4/Y07Vt39O0xmmJ7+naVpV0f3n903SbphyP4nxa77p7wvcTuer1VnPZcc1uZOsq/fl670vV5+fq8+fms94jP9U8Vxmx37/H4/TzTPfv3nJrY7z6/b7z6/daKviJxf4Cdf8AXHDRT4ccT1f1Lxtadu0Vrpczu61YiP7Hy448vb07dpj0divounAAAAAAAAAMbO7rt8493QdvPU3ozyDDtZUeVcazoaaV30Rri8kwbddhxzKpdlTzbhZ3eLgXL9YyhWdmM4VlSkq1db6t4DX6n6f5PhtikW+qta/wZnt9bs44+Jr2iZ+URmpjm3bt3iJjv2lmj2e/F3l/A3xg6H8SeI2MmC3A81q25KuObT9UcLtX+o+ZwTSvpe2TjM+1XFExby5ZraKzMdlZj1K4DvulvP8AmHTvk2Lew95w3kW249sLV61OxKV7V5t7EpkQt3KUl8DKhajk48/nG5Yu27kJShKkq1scjoZ+M39vj9ms0z6exl18kTE172xXtTzRE/1tu3mrPymsxMTMN2novqziuuuk+nesOEz49ji+pOH4/mNPJiyVy1rj3tbHsfBtekzX4uC15w5q+lqZcd6WitomI4Q4Ts4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACb57v52Y3ujHQra9w/NdNXD5z1lhW1x+Obj1tZus4Lj5kJ41IwuxpONrd3dfg7jGvxjGtzFvw9EpW5+azW8A+jrcNweXqHdwzTe5iO2vF6zF8WjW/evaJ9e2ecePNW3aO9LR27xPdrD+9u9pPH4k+Keh4P8ATPJRsdLeG9oycvOtmjJrb3VWbWtXNM2xzNZycZj29rjs2K1reTPit5orevaJDiQSn8AAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEkn3auX/AITvV2P/AOSDYy/m5NxOn9KRns4T/sm5eP8AsPkn9ra1P+VTD76eP+od4ez9rxE04/XnhOe/xJp6ZjWlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfzOcbcJXJ1pGEI1lKVfqpGNPNa1/epSnkme0TM/KPWXlWtr2rWsTNrTFaxHzmZntEftqsruD5Fm8s659XOQbGdbmZsOoXK63Z1rWtZUxtxl4dqvmta1r+k49un1/eVfdQbF9vnOW2Mk975OQ2+8/oc16R/4tYb2PhFw+twHhb4fcRp1imvqdIcBGOsR2iJzcdr7OT0jt/wBczXl08+QyKAsBPYT9KMTpz2BdPuQWsaNrK6p7Lbc7yr1YRpdu1uXoaCNKzpSk626U0NKxjKtaUlWVafX5T38DuKpx3QXH54rEW5TJl3rz27TMzMa8d57d+3bBHb9v6WpN70/r7Y6y9rTq7iL57ZMHQejx3SuDHF7Tjx+THbl7TFe81i8zysxa1YjvERE/JuUZhVwAAAAAAOLc54rgc64Zyvhe0hC5reV8e3HHs6FyFLluWJuMC/gZEZwlStJRravzpWNaVpWlfHhxd7Vpvae1pZYice3r5te8THePJmx2x27x9PpaX3el+e2+lupOB6l0bWpu8BzHHcxqWpaa2rscdt4tvDNbR2msxfFXtMesfNVudZ+K3+D9W+pXEciz9HuaDm/JddGzSnppCxZ2uVXFpSP3qVxpWa0p96laKw+Z1baPLclqWr5Z193ZxxH2qxlt5P8AxZhvS+G3PYuqPD/ovqDDk+LTlumOF3LZO/ebZcmhg+PMz9MxnjJEz9Mx3dZvmu7AAAAAAAAAAAAAAAAAAAAAAAAAANsPsU+k+F1Z9oH0hwNtiwydPxmHIuX5VZxjONnN47x/Z7jS3PTKkqeqO1wMasJePMZUpKlaVp5ZV8GOKpyvX3EY8tYth1o2Nu/eImIvr6+XNgntPf8A67jr8vWO3dAX3l/X+z0B7I/iHt8fntg5Hm7cN07g8lprOTW5nl9LjuTp5omJ7TobWeLR37WiZie8T2mw3WBtQEAAAAAABE/95n6Y40cDt46w2saNMy7l7bp7k5ELdKS+jY9ra8ht0uyjHzWlb2ZSNJTr48+mNPvURW9pTjKxj6e5eKx55vm4+1oiPxNYy7Ed/Tv+Kv8AbX6e5L64z22/GDw6yZ5+p8evx/WGDDa8zHxs2TR4e846zPaO2PX7zFY+XeZ+lEnRQbAgC0C7Ns29sO1foDk36Vjdl0s4darSv10jj6bFsQ/k9FuPj97wsz6OvOTpbgbW+f4F6cfrVw0rH+Du0cvaP1sep48eLWDFMTSvXnUd4mPl3y8lny2/X897d/u92SzsrCgAAAAAAAAACFn7w92f2+nHWHjPc5xLV1s8b6r27On5lLGs/pONzLWYc7Fi/KNqNIY+Pk6bXYfqncp4vZt2VfiVnP0oae0F0jHHcvrdTamLtrcrFcO55a+ldzFSa1tPb0rW2HHT1mPrrzPr3lsr+5+9oi/Wfh1zfgh1Bvxl5noG+TkenK5sn9MzdNb2xXLlxROSZtmy4OS3Nny1pP1mtjr9ZFaeZGzRyXQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3/Z59qu+7ve6Pp10v1+Jfu8esbbH5FzjPt2pXMfV8X0865mRPMrSlY2rGxyrONp6TnWNPjbC3SNfVWNHdfD/pbP1b1Px3GY6WnXrlrsb2SI71xauGfPabz8orktWuGJnt9dkj6UYfa+8eeK9nnwL6y653NjHTl8vH5uH6X1LZIpm3ud5Gsa2GutEzE3y6eHLm5Ga1iZ+HqXmY8sTKyc4vxvT8O43oeJ8ew7Wv0fGtPrNDqMKzGkbeLrdThWMDCsRpSlPPwsbHtQrKvmUqx8yrWta1WOauth09bBqa9Ix4NbDjwYaVjtFceKlcdK/rVrEfdaXXOczyPUfM8tz/L7F9vlOa5Ld5XkdnJMzfPu8hs5dvayzM/Lz5st7do9I79oiIh9173ygAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAASQ/drJeO6Xq3H8PRvZ18fwco4l8/5P6Ui/Zwn/ZPy0fb4fL+9taimX308f9Qnw+t/9ZGjH7fBdQT/AIv+nZNVTNa0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0tlYlk6/Nx4VrSd/Fv2oVj9dJTtyjGtPr+fmtPvPDLWb471j52raI/PmPRydPLXBt62a8RNcWfFktE+sTWl4tMT+fEKrLqtCtvqj1Jt1rWtYc+5jCta/XWseRbGNa1/f80+arnlY7cnyUT8439yP2tjI3w+grRfoXou8ekW6T6ctEfai3D6cx/hcBcB2wBZH+ykuYV32ePaxc1//icunuT8H50r9XKeQxufOny/wtJ/wfV95Yx4WTSfD7pecf4j8D7eX9ba2In9/u0xPb3ps4/bA8d6bf8A8Yr1fh+J6THz4LiJp6T6/wC1zX8/5thLICIQAAAAAACsR74ZY0+7fr9LElSWPXqJt/hyj48V8RsUn48fL5XKSp/DRWf1tNZ6s56aetfwRzdv/F7/AL/dvAezBXNX2ffCauxE1zR0dx3nifn88s1+f26eWf12Krq7PAAAAAAAAAAAAAAAAAAAAAAAAAADfH7vJexLffZZtX60pk3+CcojhU80p5nb0W5nfp4rStZfpNJV/Q1pWn1180Z09n6aR1xEW/FW0dmKfrYc02/ehVT73/FsX9lfJkxR3wYuquCnZntM9q35bja4vWJ7R/TZr84/an5ztU5Gq6AAAAAAAjfe8qXsSHbB0XtX/T9JvdVthTD8ypSXrhoKTvemNa+ZfpFJ0rSlK+KfP6qVR09pCaR0zw0W7ea3K5Ip+fGCJt2+39bE/wCFc17lfHsW8cfEq+LzfBx9Bak7PaszHltys1x+aY9K9ss1+fpM+nz7IVCGTZeeWxZuZN+zj2Y1nev3bdm1Cn1zuXZ0hCNP35SlSlP4X7Ws2tWtY72tMViPtzM9oj9eZeGXJTDiyZslorjxY75Mlp+VaUrNrWn7kViZ/WWj3bBp66Dty6F6qtPEsbpNwCtynj01jdv8X1mRdjWlfqrG5dlGv4a08/fWd9MYfqfp3g8X014rQmfn87auK0/P7s9mi7448j+C3jJ4p78fic/iB1bFZ794mmLnd7DS0T9q1MdZj7ku9X3GLAAAAAAAAAAGHPfp2zabuy7X+qHSTYYkL+1z9BlbXil+luEsnG5PpKR2+nt405xl8KufnYOPgX5UpT1Y+Rcj5p5806f1301h6r6Y5PiclItlya98urbt9dXZwx8XDFZ7T2+JkpXHb/g2lIz2UvG3kfAHxy6G8QdTYti0NTlsGhz+Lz2jDm4PlPNx3I3zVrMeeNTV2s23iie/bLhpbtPbtNabyzjO34XyjkXEN9jTw91xjd7TQbXGuRrGVnYajNv4GXDxL5+KX7E/TX50lHxWla0rSqt/b1sultbGpnrNM2rny6+Wsx2muTDe2O8f/wB1Z7fbj1bqvAc3x/UvB8P1DxOeuzxnOcZo8toZ6Wi1cupyGti2te3ePpnFlr5o9Jie8TETEw4+4764AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc97AzsyvdCO3fL648z030PqD1tpHM130yxWGdquDW78Z6uxarKMa/Rd7bxNdvbc/TWVYXrfpn6K+Kze8B+jZ4Lp6/N7uHychzX1+Pz17XxaMWicVY79vrc8UxZ4nt/XR2ns1bvexe0lj8VfGHX8Lum+R+qOkfDGba259T5Ytrb/VN8U138uSKzMfH4u+xucVevftFsdu9fNHeN/TPSpgAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEj33a2X/hWdWYf/kW20v5uVcPp/D99In2cZ/2VcrH/YbLP/nWp3/xKaffTR/1BPD+3/1maEf+gOop/wASa2me1nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYj3w8DyOmXdv194RlY1cS/pOoe19ePKPorb/ADShj7ePmNaU8euOfGf7/q8+a+fKtDrbQtxnVnPaNq+S2DkMvesx27fEiuWPT7sZO/6/dvAezB1Xi639n7wm6nwZo2MXJ9H8f5c0W80X+orZeOt6957+W2pNPn6eXtPyYqurM8AJ8HsDusuB1K7E+OcOhk2/zR6Q8h23Cb2HW7SuRHErHF31nK+DWXrjj3bu8u2oXKRpblctXI0lWUZUpO7wH5jHyXQ2tpxaPicTsZdK1O/10V+tzxfy/OKzOeaxPymaz6+ktT/3sPhvtdFe1PzHUVsN/qPxD4fQ6nxbEUn4U54tn4nLgnJEeWc1KcXjvakz560vSZiItEzu4ZqVjgAAAAAOC9Tuca7pn065z1C29y1a1vCeKb/lOdO9Olu3TG0WsytlepKda0pSlbeNKn10r+CvlweT3sfG8dvchlmIx6Wpn2rzae0eXBitkt3nvH0Vl2nojpfc626x6X6Q4+mTJu9Tc/xPBatcdZvf43K72DSxzWsRPeYvmiftfbVb/VXk9zmvUzn/AC25erkV5FzHkW3t3q19XrsZu1yr2N4l9+MceVqMa/8ARpRWJymzO7yW/tzbzfVG5sZot9ut8t7V/W8sxEfcb0nQnB06Z6K6S6fpj+DHDdO8Px18fbt5curoYMWfvH0TOauS0x9EzLgLgO1gAAAAAAAAAAAAAAAAAAAAAAAAANknslOtWH0I78uhvLtleja1u23WXwXJpcn6LNbvPdfk8Qwrl2vmNPFjL3Nq7Gsq0jGUaSl8qVZG8KOapwXXXB7eSe2PNmvo27z2r338dtSk2/Q2zRMT9ExHeeyGHvAvDPY8VfZS8UuntLHN93j+M1+qsE0r5ssU6T28PUOzXHHrMzl1+NyY5iImZi3aPVY5QnG5GM4SjOE4xnCca0lGUZUpWMoyp5pWMqVpWlaVrStK+aLEomJjvE94n1iY+Ux9tpr2ralrUtE1tWZratomLVtWe0xMT6xMTExMT6xPo/ofgAAAAACIR7y71j1+y5X0I6HYWXbyMnQ67O5/tLVm5SdMPKz7u20drGyaRrWlrIli27GRG3c9Nytm7buen0SjWsSfaR5jHk2uC4Sl4tbBjyb+WsT38lsk5cEVt9EWmsVt2n17TE/KYbDXuUfDnc0uA8VfFDZ174cPK7mr0lo5MlZrOzg1MfH8pfNgmYib4a575cNr171jJS1JnzVtERXkXV7zsrozoLvKur/SrjNi1K/d5D1H4PpLdqMayrclteTavBpDxSlfPqrf8fyvpcPgna5fi9asTadjkdLBERHeZnLs4qdu3/2nS/EjlcfBeHnXnN5ckYsfEdG9T8nfJMxWKV0OE3tqbd5+XaMXePurSTguonx/hHDtDch8O5pOK8e1E7fjx6J63UYeFKHj73plZrHx+8s80cM6+lp4JjtOHV18Mx9qceGlO363laLPVPIV5bqfqPlaW89OT57l+Qrf+yru8hsbNbf/AGoyxP67lTlPggAAAAAAAAAAINPt/OzyHRDuLweu3FNZ9F4N1vhC/nxxrNLeBrOaYOJXHzcG36Y0/Tdhi62e5v1lOVZXsydaVpStI0hF499IRwnUWPndXF5NHm4ib+WvbHi3cdPLfHHaPxWSmOc1u8zMzeZ+5G0Z7pb2i7+J/g5t+FfP7vx+qfC+98WpObJ59ve6Z2tiM2tt372/2vT2N2vG4orWsVxa9ImJmJmY/rAi2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnv7NrtN3feB3U9PunmLh3rvFdPssflfPs+Fr4tjXca012mTWmXSsZRpY2ewt4WnlWtY187CnprSXirvfhz0pm6u6p4/j60mdTDlrtchkiO9cethnzfXek/W5ckY8M//AMxFH2z/AB+4z2d/Afq/rDPs46c9yOlm4DpLUtfyZdzm+SpOCPqee8TOXR077PJV7RMf6knvEx3hZF6DR6rjGj0/HNHh2ddptDq8DTanAx4+mzh67WYtrCwsa1H51pCxjWLVqPmta+I081rX5rF9fBi1cGHWwUrjw4MWPDipWO1aY8VIpSsR9qtaxEfchpi8tym/znKcjzPKbOTc5Llt7b5Lf2ss+bJs7m9nybOznvP02y5st727do729IiH1nufPAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABI392ul/4WfVWP4eiW5l/NyzhtP6f86RHs4/1V8p+kub+Naam330sf8Awf8AoK3/ANZ3HR/+H+o5TYU0GsyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgue8I9v9/pp3e4nVbAw5x0PWTjeHt8vPparC1c5Xg387A2GJ8TxSM7tnVYWquy+da0jej5Qf8f8AgLcb1dXlcdJjBzOvTNfJ2mKzt47Xx5Kd/lNoxUxWnt9FobSvuiPFvF1r7PGx0FtbFZ5Xw45rZ47X1ZvFslOA28WrtamxNe8zWmTf2d/HX6Jtjt2aCmB1sYDeL7C3vOxO2vucj035ntKYfTvrdXA4zeu5Fz0Ymq5VK9csaHL9Va0hYjnZ+Vh4ubkXf0q3jWaSnK3GNZs2eB/WVOm+po47cy+Tj+b+Hq2m09qYtqZmuC/f5Vi97UrktPeIrXvPbt3Vfe9L9m3Y8afBC3WfTej9U9Y+GEbfOY6YaebY3+Brjpl5bX7RE2yzq6mDZz62Gn1982Wa1i8zFU9C3ct3rdu7anC5auwjct3LcqThctzjSUJwlGtYyhONaSjKla0rStK0rWlU64mJiJiYmJiJiY+UxPrEx9yYapV6Xx3vjyVtTJS1qXpeJrel6zNbVtWYia2raJi0TETExMTHd/b9eIAAAACPJ7f7vTwOkHQXH7cOIbq3DqL1fhC5vbGLep9M0/BbeVW1lTvwjKtKWN/TH2mplG5GkqRhKUa080qj7499Z4+I4KvTmpmiOR5eInPWsx58WjF/LebRE+ldjy5cU94ifSey3/3Sns1bXiH4r5vGbqLjL36O8O7XpxWXPjn6m5Hqq+D4mCmK0xEzl4icujyFbVnt3tWJ7/JCCQpbPID6+g0O35Ru9Txzj+vyttvN7scPU6jWYVm5kZefsdhkW8XDxMaxajO5dv5GRdt2rVuEZSnOcYxpWtaUe3BgzbWfFra+O2XPnyUxYcVIm18mTJaK0pWsd5m1rTERER3mZfP5bleO4PjOQ5nltzBx/F8Vp7PIchvbWSmHX1NPUw3z7Oxny5JrTHiw4cd8l72tFa1rMzMRDeTwT3ezvd5bxnV8g3NzhHD8naYtnMhpdju9bm5uPYyLcLtmmVXH2luli/WE6fFxrtuF6zOlYXI0lStGbtHwA6229bFsZZ0tS2WsXjDkz4r3rW0RMeby5Y8tu0+tZiLVnvEx3Vd9Ve959mLp/m97iONr1P1Fh0c+XWvyenxm7raubLhvbHk+BGbRvOXF5qz8PNS1seWva1JmJhzH87kd437benn/AG7F/thy/wCd36x/trj/APwlP8865/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o4/O5HeN+23p5/27F/tg/nd+sf7a4//wAJT/PH9GS9nL8oOr/3Lsf6OPzuR3jftt6ef9uxf7YP53frH+2uP/8ACU/zx/RkvZy/KDq/9y7H+jj87kd437benn/bsX+2D+d36x/trj//AAlP88f0ZL2cvyg6v/cux/o5p87qu2fmvaT1j5F0U5/ma3P5NxqmJXNyNVONzCnTMxLGZb+FOF7IjXxbyIxl4uV/RUqxH1T03u9J8xscNv3x32dbyee2KYmn19K3jtMWtE+lo+n5rE/Afxs6Z9oHw44bxM6S193V4Xmp2I1sO/S1Nms62xl1r+etseKY73w2mO9I9JiWOLrrMgAAAAAAAAAAD6Go2ufotrrN3qsm5h7TT7DC2uty7VfTdxc/X5NrLw8m1WtK+LljIs27sK+K+JRpXxV7MWXJgy4s+K00y4clMuO8fOmTHaL0tH3a2iJj7sOJyGhqcpob3Gb+Gmzo8jp7Ohu6+SO+PPqbmG+vsYbxExM0y4cl6WjvHetp9Vjl7MTvI4z3j9sHDOUYmdY/u44frcLiHULT/FpXKwd5qca1Ys5M4SrW5O3stb+Z+wlfjStr4+XO1Ssaw9EbEfDPrDW6w6Z09ml6/Vunjpp8hi797Uz4axWLTE+sxkx/DyTPy815j6O0aa/twezjzfs5eOXUvBbGrl/Cv1FubPUXSHI+Ttg2uL5DNfLkw0tWIpS2lu/VenXFMxk+Fr1vMTFvNOxZkNDoAAAABwbqZ1E4v0m4Dy3qPzPZY2q41w7Q7Pf7TKyb1uxGuPrMO9l1xrMrlaUuZeXWz9Hw7EaSuZGTctWbUJ3JxjXg8lyGrxOht8ju5K4tbTwZc+W9piv1uOlr+Wvf53v28tKx62tMViJmYh2nono7nfEDqzp/ozprSzb/ADXUfK6PE6GDBivlmM29s49eM2StImaa+v8AE+NsZbdqYcNL5Mlq0ra0Vpnev3Jbvuv7k+p3WfbXrlcTke+vWuPYkqzpawePay1Z1ept2bc61la+kYeFZy78Pl/vi/dr6Y+fTSt7rPqPP1V1HyfMZbTNNjPMa9J+VNfHFcWKKxPy81KVvaPpta0+nfs3VfZn8F+M8AvBbojw14/HSNjhuJx35jYiKzfa5jdyZN7kL5L19MnwtnZya+K0f9ZxY47z27zim6sz025exR7eL/Xvvk4DkZeBLM4r0vt5PPeSXqW/XDCu63Fy7vGr061pWkPXyPH19uNa0r+ir4pWlfFWWfBjp63Pdb6Fr45vq8XFt/Znt3ik463nWmfojvsVxx+ur595j4wY/Cf2XercWvtxr891zbB0nw2KbeW2zj3c+CnN469pibeXhsu3eYiflE94mFhMn+1DQAAAAAAAAAAAGv8A9pj2pa3u67Teo3T/AOiQucs02qyeW8HzI2qXczF32gjHafRcKlaS8Xt1jYVzTV/QyrWGbKkaUlWladB8SelcfVvSnI8f5Inbw4rbeleI81659ePi+SkfbzVpOH5TPa8xHaZ7pbexN497vs9eP/RvV31RanAclv4en+qNa1/JrZ+K5abaPx9qe8f0rjM21Tko9Y7W1ome9e8TW87nUbDQbfa6LbY1zD2ul2WdqdliXaVjdxc/XZV3DzMe5GtKVjOzkWbludK0pWko1pVXTmxZNfNlwZazTLhyXxZaT865Mdppes/drasxP5zc143kNTluO0OV4/NXY0OT0tXkNLYpMTTPqbuDHs62akxMxNcuHJS9ZiZiYtExL5r1uaAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/aUrWtKUpWta1pSlKfXWtflSlP361CZiImZntEeszPyiPtync+wd7Mbvbz22T6vcx1H0TqN1vja3NuuVZ9ObquFVnG5pMSzOsYy+ibrEsaze1pL1V9d2PplSP6FOXwL6Nnp7pyeX3MXk5Hm4jNHmj6/Fpd++CkT2j6zNSuLP+fMfnNVv3q/tJ4/F/xpr4edOch9UdG+F85ONv8DJ5tbf6mik05TYyV7zH1Rxuxl3uL7x5Y8tJ7xM/XN7zOaqsAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAEjL3a+X/AIXfVSP4ehm7l/Ny/hVP6apDezj/AFW8pH/YPP8Av7en/wAinH30kf8Aweug7f8A1pcZH7fTvU0/4k2ZNJrKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANPPtse0zI7m+z3kG245r45fPOjlczn2grC38TIu6rBsWsvlGFYtw8XcjJy9Vra2cSxCs5VvzpSFucpeK4h8aOlLdS9IbGXWxxff4fz7+D072tipFbbNIiPrrWvix9qRHf675RPdYr7svx/w+CPtF8Rx/M7dtfpTxHjW6T5aJv5MNN/ay5NfgtrLe3fHhw6+/uRk2Mt4rWMVZm961r3V+N21dsXbti9bnavWbk7V21cjWFy3dtyrC5bnCVKSjOEqVjKMqUrGtK0rSlaIDTE1ma2iYmJmJifSYmJ7TEx9ExPpLbgx5KZaUy471yY8lK5Md6TFq3peItS9bR3i1bVmJrMekxMTDxvx5vPjZOThZFjLw797Fysa7bv42Tj3J2b9i9alSdu9Zu26xnbuW50pKE4SpKMqUlGtK0pV+1talq3paa2rMWraszFq2ie8TEx6xMT6xMesS9WfBh2cOXX2MWPPgz474s2HNSuTFlxZKzW+PJjvE1vS9Zmtq2iYtEzEx2TWvY4+1u471p4rx/tu7geR4Wn6t8exrOq4fyjb5FvBxOda21CkcPBycrInDEpyKzKk8SzbhOzXPt0wrNnFllSncvTO8H/FjX5nV1+nOf2KYeW16xi09rLaKU3sUR2pS1rdqfVEfiYiJr548la0m0zM6z/vG/d98x4ac9y/jP4R8Ntcl4fcvmvv9R8Fx+G2zsdK7uS8zs7WHBhrbYnh8kTXYy5L1yRq3nZy5c9cEVpjkbRlSUaSjWkoypSUZUr5pWlaeaVpWnyrStPnStProkT8/kptmJiZiYmJiZiYmO0xMekxMT6xMT84fo/AAAGCXfh37dI+xjpZseX802mFsOa52FkQ4RwOxlQnuN9tZwlawZ3cGzKWZa1McusKZebW3bsws28ivx7dbU5R6N1z13xPRHF5Nvcy0ybt6WjS0YtE5s+WYmKTNKz564vP281+0ViIt9dHaZSo9lX2UPEH2pOu9Pp3prS2tPprV2cNup+q8uC1eO4nQrauTZrTayVjWychbXi06+r57ZbZL4u2K8XrFq8TuL6/8/7murvLusHUfa5Gz5BynZXcmNu7clKxq8ClfRhazBt1lKNjFxbMY0pbt+Iyu1uXa+Z3JVrX31Dz2/1Ly23y/I5bZdjayTaIme9cWP5UxUj5VpWv0R6d+8/OZluA+DnhL0l4JeHvT3h10ZoYdHiOC0seCb0pEZd7bmPNs721eIi2XPnyzaZvf66McUxx2rSsR0e+IyeAlk+wl9mLkQv6vvH64aD02PTcudIeL7XH9M7koxlZry7Nx70aXYUtZNblNVblSzOGTgQypVu2bsIpV+BvhnaLYusObwfW9pniNXLXtM+k1+q71mO/paZ+FH1va2PzfXVmFA3vUfbfw2xb3s4+F/LebN5qV8ROd0M3mrSJmuSOntbNjnyWm+GKzv3rOSt8O1bBHw8lJsln0pSlKUpSlKUp4pSnypSlPqpSn3qUStUATMzMzM95n1mZ+cz9uQAAAAAAAAAAFfN7cuv/ANId1d+X1Q0FP4f+AdZXzT+fx/DRAPxu+yBy37B/AYm3P7rn8iB4e/o+W/W/123v/wB7UAxGsRAAAAAAAAAAAAZ9+zz77+fdiXWvXc50N29s+Dbq9j63qHxC5O5XD3WkuypZv5Vq3Cca29prrU65mDft/OWRjY9u/byLFJWJ988Puud/obmse9gmcujmmuLkNSZmaZsEz2teIiY7ZccT56Wj52rWLRaseWYm+197KvSftUeGe50ty1Mej1TxmPLu9H9RUrSNnjeTx1nJiwZL2rMX0Ny9Y19rFeO1cObNfFbDlmMtbCHty7lekndN010nU/pFynXch0u1xbdzMw7GVZntdBn+PGTqt3gUlTK1+Zj3KVpS3l2bEr9iVnKtQrYyLUpT+6d6k4nqjjcHJ8TtY9jDlrE3pW8TlwZP67Fmp+Kx3rP0XrWbV8t4jy2iZ1EfGTwV8QfAnrXk+h/EPgdzh+T0M96a2zlwZK6HLasT3w7/ABm3MTg3NbLTt3vr5MtcWWMmC9vi4r1jvx95icAAB8bkPItFxPS7LkXJdtr9FotRiXs7Z7ba5djBwMLFx7crt6/k5WTctWLNuEIyrWVycafL63p2NjBqYcmxs5seDBhpN8uXLeuPHSlY7za17TFYiI+mZfS4jh+U5/ktLh+F4/c5TlOQ2MerpaGhr5drb2tjLeKY8WHBgpfLkva1oiK0rMzM/JCT9sr7WCPc/t7/AG/dB9rmYvRnjefW3yjf487tifP9zg5PxKfBl+l1px7Ev27H0eMI1rm38WWTTJu4WRC1WFnjD4q/hmzW4Dgst6cPrZO21sVmazv5qW7/AFvymMFLRXy9o+vtWbea1LRDZu93B7AtvA3j8Xi54q6Gvn8Sea1IvwXEZq48tekeN2sEU/ptfr4nl9jFfL8WbWiNbFnjDOHHsYpvEexgBbw8+NjZGbk4+Hh2L2Vl5d+1jYuNj253r+RkX7kbVixZtW6SndvXrs427duEaznOUYxpWtaUeVa2vatKVm172ita1iZta1p7VrWI9ZmZmIiI9Zme0PVnz4dbDm2djLjwa+viyZ8+fNeuPFhw4qTky5cuS8xTHjx0ra972mK1rE2tMREyn3exU7ErnaR27W+a8zwIWerHWWzi8i3kb0IfTNDx+9bsV0/H6ThSni1dx8bF3F61P1XrOXm3rVyUawrbhPHwY6GnpPp6N3dxxXleYrXYzxaPr9fXmK/B1+/aPrbVrTNMT61ve0T2mJiNTX3l/tUU9oLxiv0z01tWydAeG2TPw3F2x2t9T8ty+O+WOR5eaWmf6ZjzZ8/HY8le2PJr62PJSLRaLzujZlVrAAAAAAAAAAAAPytKSpWMqUrGtK0rStKVpWlaeK0rSvyrStPlWlflWh8/m/YmYmJiZiYmJiYntMTHrExMesTE/KUCL26HZ7Ttw7qszqFxrW1xOnvW63XlGtpj2q0wtbyH0Vx93rpXaU9FMvOzsLP3MrUpeulvKrOkfh+mqCPjh0j+F3qm/Ia2PycfzUfVWPyx9Zj2O01z4+/y8970vm7TPftbv8m197rb2iv5svgNrdIc1uxsdX+GFo4LdnNkidnd4fzRm4zcjHM+adfV1dnV42Mla+Tz4PLNpv3hpFYVWcgAAAAAAAAAAAAAAAAAAAAAAAAAAAANh/sw+0Xb94PdbwThUcS9c4ZxfPx+ZdQM6Nuk7OFx/TXo37Nu/wCqMo1tbPbU12quR8er0Z1axrGtKSpkHwz6TzdXdVaOlFLTp6uSu5v3iO8U18NomInvExMZM3w8Ux9q/fvCH/twe0Jx/s6+AnVXU87GOnUnOaubpvpHVtfyZNnmOSxWx5L4e1q2jJpcfO5v0t37efViJifxM2PGn1Ou0Gp1mj0+JZwNTptfharWYOPH0WMPX6/Gt4mHi2Y+a+m1j41m3at081rSEKU81WJ4cWPBixYMNIx4sOOmLFjrHatMeOsUpWI+1WsREfchpp8hyG5y2/vcpyOxk2+Q5Lb2d/e2s0+bLs7m5mvsbOxlt6d8mbNkvkvPaO9rT6PovY4YAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAACRX7thLx3h9UYfh6D76v83MeEf96/yJC+zj/Vfyn6RZ/wCOaSnb30kd/Z06Ft9rxW4qPl9vpzqf07ptqabWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDKxcbOxsjDzLFrKxMqzcx8nGvwjcs37F2NYXbV23KlYzt3ISrGcZUrSUa1pWnh43pXJW1L1i9LxNbVtETW1ZjtMTE+kxMekxL24M+bVzYtnWy5MGxgyUy4c2K00yYsuO0Wpkx3rMWreloi1bRMTExExPdAA9sd7P3cdoPXzac24nqMiXRLqpn5G74xn2bU54uh3GRdnXaccyr0aVjC7C9SOfZnOsIzhsbdm3StbdUCvF/oHN0jz2Xd1MNvwF5S9s2tkiJmuDNaZ+Lr2n6Jie16zPaJjJFY9Yba3u5fa3472h/CfR6Z5/kMMeJvQmph4znNTJetc/K8dhpWNHmcGOZibY7Y/NqZK1i1q3075bzEXhptYeWOgPc1+xz9TmY+x1ebl67PxLsL+Lm4ORdxcvGvW5Unbu2MixOF21chKlJRnCcZRlSlaVpWjzx5MmK9cmK98eSkxal6Wml62ie8TW1ZiYmJ+UxPdx9vU1N/Xzae9ra+5qbGO2LPrbWHHnwZsd4mt8eXDlrbHkpaszFq2rMTEzEwkA9jvt8Ot/QbF1HA+4DX3Os3T3C+Bh4+6lcpic302HSkbUYW863WODm4eJGnxq27+tyc+95uwpkVrK36c99E+O/NcFXDoc/jnmOPp5aVzd4pu4aRER2i8dsd6V/FTFsdslu8x5vkqT9qH3T/hj4r5+R6r8JNynht1fs/F2c3GxSdjpfktmZtkta+raLbWtsbEz8Pz4t3Dq4+1LThiIv5pKPRf2v/Yd1pwdde1/WnR8Mz8yFumRruoNyPDqYF+VfErN3N5BXW41yEK1p5yIVpalTzWlflVI7hvFzoXmaY5x8zg08l+3mx8hMacY7fTW19icVZ7f2Uen2lLXiX7u/2q/DTa28e34acp1Lqa9rTh3OkKT1HO1ir6xkpq8RG7mpNoj/AGq0TePSJ9ZZfWu6rtlv24XrPcH0Yu2rkaTt3bfUvh87c41+qUJx29YyjX71aVrSrt9eqOmrRFq8/wANasx3iY5LTmJj7cT8b1hHjJ4D+NuK9seXwi8SceSkzW9L9FdRVvW0fOLVtx0TEx9MTES6j6le0Y7KelWNdyeTdxPTHKlZhKd3C4zyzR8o2UKRp6vTLX6XPy8uk60+cYVteqVK0rSnzp5+RyXiH0ZxdZts9Q8beaxM2prbeDayR2+iceHJe/f7nZkHov2OfaY68z0wcJ4O9cYK5LVrTa5vp/lOD0reae3mrucnqa+vNIn0taL9omJiZ9Gi/vE94v41ia/acS7Q+J39vtL0L+JTqPzLCz8PAxaTpKzXI1WhufmXnRzcevqvY1/LllYc5/CrKxchScZYQ6v9ofWpjy6nSOpbNltFqfgjuUyUx17+nmw68xiyRevzra/mpM9u9ZjvE2lezp7nLms+5o9Qe0P1Bi4/Rx2xZ7dGdN7OpsbeaaTXJGHf5ak72rbVzemPNi14wbFa+eK5aWmsxFm6xdcOqnX3mWz571a5puuacl2mRO/ezNrk+u3YpL5RsYeJajaxMOxbhSkI28axapWlKyn6pynKUX+Y5vlOe3Mm/wAtu5t3Zy2m03y27xX7VaUiIpSsR6RFax9ue8zMzex4deGHQfhP03pdKeH/AE1xvTXCaOKuLHraGHy3yzHrbLs7GS2TZ2ct7d7Wvmy3mJny18tYrWOqHynfQG/b2Pnsnt13Scq1fXXrbpNhqeg3GNnZytXrs2xcwr/UbZ4MreTDFxKX4Ru3OOwv/Bs5+fjw+FlRpmYeLmWsqxOtvPHhF4VZ+p9vFznNYMmHgtXLFsWPJWaTyOXHMWitYtEWnXi3aMl6x2vEXpS9b1ma1N+8T9vrjPArgd7ws8MuT1OQ8Vuc0cuDe3NXLTZxdG6W1W+C2fYnDa2PHzNsU5Mupq5rfEwWnW2c+tk18tYvOP0ul1XHNRrdDo8DF1en1GFj6/W67CtRsYuHh4tuNqxYs2oUpSMIQjSn35Sr5lOUpSlKs28OHFrYceDBjriw4aVx48dIitaUrHatYiPlER+3859WrzyXJb/Mchucrym3n3+R5DZy7e7ubOS2XPs7Oe83y5ct7d5m1rTM/RFY7VrEViIj6b2uCAAAAAAAAAAAr5vbl18+0O6u/vQ0FP4P+ANXX+nygH43fZA5b9g/gMTbo91z+Q/8Pfu25f7778NQDEaxAAAAAAAAAAAAABkx20d3nXztL5hj8x6K882vGr9L1qWy0/xI5Wi3WNCUfjYWy12TC7ZrayrVJWL17Gpj5lLUv0rJtzjCUeydN9W890puV3OF38utbvHxcPeL4M9Y+dMmO0THa0fWzavlvET6WhhPxq9nrwn9oDp3N054mdKaHN4px3rpcj5Jwcrxma1Z+Hs6W7hmmSL4Mkxlx4s/xtabx/TMN6zaJlS9rHvGPRLlWr12k7oeK7TpvyW1atY+Vyni+u2m/wCObLJ8UhC7a1OHa2ezwI3ZVj8e5lZkrVufxLv6C14pGUfS/tD8LtYseDqfVy8dsxEVvtauPLsa2S3yiYw0jLlx9/TzTa/aJ7z6R2UP+O/ucfE3gd7c5PwM57R604W975tfged3NHieZ0sMTNr0vyGxfR0tuaR5vhUwa0ZLx5Mf11+8zt54D7SXse6jYH5oafuT6VamzWEbnwuX8x0HEcvxLx4p9E32xwr9JU8/OFYeqnivmnyZb0PEbonkcfxMPUfF4qzHftt7mvqX/O8mfJS3f7cdu8K9OrPYv9qDo7a+o+R8Fuvd/J5pp5+nunOW6h1+9fnMbHE6e1imv2rRbtP23Kd7379l3Htdf2eZ3Q9C8qxjxrKdnU9T+GbbNnSlPPi1hYO5vZN2VfvRt25Vr9VKeXKz9d9G6+O2W/U3B2rWJmYxcnp5bz2+1THmte360S+DxXsoe0ry+5i0dfwM8U9fLmtFa5OQ6G6k4/WrM/Tk2dvjcWHHH25teIj6WufuA9v32W9KtZnY/TrN5B1g5dat3oY2q02sz9VqaX6xrGzeub7NwrmsyLELlYzu2rGRG5ct0rGE4ylSVMd8/wCPXRnFY8leOvscxuViYriw4smHF5u0+WZ2L45x2r39Zis95j5T694mP4S+6W9pbrzd1cvWOtxHhz09e+O2bf5Le1d/kJxRMWyY6cTrbNN3FltTvWl8uGaVvMTasxExMW7vZ9qv3Od6Wfl6zkPIZcG6aVvVrhdPOIXMjA1c7UJ+bV3aZVzIytlm5U4UhTJh9Pjg3K0r6cWMZVjWMPWnin1N1ne+LY2PqHje/wBZx+pNqYpiJ+ttlvNrZL2mI+uj4kUn1+s7T2XpezJ7Bngh7NOpr7vEcPHVPW0Y4+qesOoqYdvfre1e2THo4KYsGlrYK2m04bfUk7VImO+ebREtZNa1rWta1rWta+a1r861rX661r9+tWNU3Pl8n9W4TuzhatwlcuXJxhbhClZTnOdaRjCMaeaylKVaUjSlK1rWtKU+ZETMxERMzM9oiPWZmflER9My8bWrStr3tFaUrNrWtMRWtaxM2taZ9IiIiZmZ9IiO8pU3sXvZE7XY7fQd1fczxa7h6TBrb23S3gG6sVsX9plQp5wuUb3Bu0jl2MXHv+cvU4d6ONLIuY2Jmz+kYGRG3clH4N+EuXJmwdU9S6s0wUmMvF6Gava2W0R9ZtZ8doi1a1t9fipaK+by1vPmpaImh73lPvCdDT47lvAXwS52mxymzF9Drrq7jMsZcOjgtPba4Litqk2182xmxdtff2cVs9cNM+xrV+Dt4ZvSXbbt27VuFq1CFq1ahG3bt24xhbt24RpGEIQjSkYQhGlIxjGlIxjSlKUpSiWkRERERERERERER2iIj0iIiPSIiPlDXsve+S9smS1r3va173vabXve0za1rWtMza1pmZtaZmZmZmZ7y/t+vEAAAAAAAAAAAABq+9rf2iYvdr2i811WvwrV7nnTrDyue8JyqxjW9bydLZpl7nEt+PE709horGxwsexSVayyci3WEJTrSlcY+LPSVerOkt3FjpE7/HUtv6V+3rFsEefNWO3rab4K5KVrE+trR2iZTl9317Quf2fvaF6Z39zZyY+lOstjB0n1Pgi0xjvh5PJ9T8bsX+dMddTlcuns5ssxEVw4b+a1axMxXYZeJk4GXlYOZZuY2XhZF7Eyse9CVu7Yyce5Kzfs3bcqUlC5auwlCcJUpKMo1jWlK0rRXvelsd7Y71mt6WtS9ZiYmtqzMWrMT6xMTExMT6xLcN19jDt6+Da1stM2vs4cWxgzY7RfHlw5qVyYsuO9ZmtqZKWretqzMWrMTEzEvXeL3AAAAAAAAAAAAAAAAAAAAAAAAAAAP2MZTlGEI1lKcqRjGNK1lKUq+IxjSnzrWta0pSlPnWvyoREzPaI7zPpER85n7T8mYrE2tMRWImZmZiIiIjvMzM+kREeszPpEJ63sL+zGfbZ2w2OpXLtVTF6k9b4Y/JcqWRbpTL1vEL9Y3+PYNmdKUrTF2mut6rc3bc6zlTInT5wpT0UnZ4H9Gz030zXktvF5eS5uK7N5tH1+LUt2tr44+XauXHGLNMT3mLT9DVH96V7SdfGnxwy9FdP705+i/C+2XhcEYbzOvu9Q4u+LmNrJSZmJz6O7bf42l6xWJw1n0t38zeCzYrAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABIl92xl/4ZXU+Pn6+gXIa+P4OZ8Fp/m+aQns4/1Y8n+kOx/HdH/3qevfRx/8G/oef/rZ4iP2+muqZ/xJuaajWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdB9yvbh007qeknJuj/VPT2tnoOQYd63j5cYQpsdHs/hy+hbnU5MoTrj52BkfCybXqjcsXblm3DJsX7VK26/B6k6d43qnidniOUwxl19ikxW8REZMGXt9Zmw2mJ8uTHbtaveJrMxEWravoyx4K+MvW3gP4gcJ4idCcjfR5fiNnHfNr2tadLlNLzx9U8byGGtq/G1drD8TDk8tqZaVyWthy4sna8V63fx2EdV+xbqvncR5hr8vZcH2uRfyuCc6sY1yuo32rlcn8OxcyrdJY2Pt8Ska28zX3LkMmMKWsqti3YybNa1/9edCcr0Pyt9Tcx3yaOW1raO9Ws/B2MXee1ZtH1tcte3a2OZi3btbyxW1e+3p7J/tX9A+1L0Dq9Q9O7mvpdT6GHFg6q6Vy56xyPE70Up58tMF5rmzcfsTaL6+3SlsFrfEwRltkwZe2BjoqVgAAD6Mdxt4RpCG02MIxpSkYxzsmMY0p9VKRpdpSlKfepSnh7IzZojtGXLER8ojJaIj9bu4duO4+0za2jp2tM95tbWwzMzPzmZmneZ+7L0rt69kXJXb925euy+crl25K5clXx48ynOspV+VKU+da/KjwmZtPe0zM/bmZmf25cnHjx4qRjxY6YqV/E0x1rSlfzq1iIj9aHjfjzAASFfZE+yB3HcpuNV157hNJstL0Q1OZay9Bx7MtTwM3qJl4ko34R+HkW6ZNON1vUtWcvLsQtRy7cczGxM23kW6ytyA8JfCPN1Jmxc71Bgy4eExXi+vr3icd+QvTtaPS0eaNfzdq2vWI88RetbxaO8VC+8J94fx3grx2/4U+EPJ6XJ+KHIa2TX5bl9fJXb1ujtfPFsVrebFecM818Ob5NfXy2vOva2vnz618N4i82XjPGOP8M0Or4xxbUYGh0Glw7OBq9Vrce3i4eHi48KQt2rVq3SlKUpSnmUq+ZzlWs5ylKVa1mjrauvp4MWrq4ceDXw0rjxYsdYrSlKx2iIiP/3zPeZ9Zay3N85y/UnK73Oc9yO3yvLclsZNve393NbPs7OxltNr5MmS8zMzMz6VjtWsRFaxFYiI+8975QAAAAAAAAAAACvm9uX+yHdXfq/UaD6v/wCQav6/wV/o8VQD8bvsgct+wfwGJt0e65/If+Hv6Ll/vvvtQDEaxAAAAAAAAAAAAAAAAAAAB7ut1uw3GwwtTqcHL2e02WVYwdfrsDHu5ebnZmVdjYxsTExbELl7IyMi9OFqzZtQncu3JxhCMpSpSvnjx5M2SmLFS+TLkvWmPHSs3ve95itaUrWJm1rTMREREzMz2hxtzd0+O1Nnf5Da19LR0sGXa29zbzY9fW1dbBS2XNsbGfLamLDhxY62yZMmS1aUpWbWmIiZS9fZM+xPxeIU473E92mix9jvrtrH3PCelewhSuNppSjG7gbTk9mMvjXM+zPxmWdfcnj0s3I49vMxbsKXrdyW3hT4L11PqfqHqzBXJnmtc2lxeT8ThmY70ybVYnvOSs9rxjma+WYrW9ZjzROvN7f3vM8/UP4M+Dvs/crl0+Jpkzcb1P15p2/p3JVi0029Hg8sx8Ompkr318u5SuaclLZb62fHacdqSkMbGx8PHs4mJYs42LjWoWMfHsW4WrNizajSFu1atW6Rhbt24RpGEI0pGMaUpSlKUSdrWtK1pSsVrWIrWtYiK1rEdoiIj0iIj0iI9IUW5s2bYy5M+xlyZ8+a9subNlvbJly5L2m18mTJeZte97TNrWtMzMzMzMy8zyesAAAAAAAAAAAAAB47tq1ftXLF63C7ZvW52rtq5Gk7dy1cjWFy3OMqVjKE4VrGUa0rSUa1pWnir8mItE1tETExMTE+sTEx2mJj6YmPSXnjvfFemXHe2PJjvW+O9Jmt6XpMWreto7TW1bRE1mJiYmImPVXu+2Z7Prvar3cckztJr5Y3Tzq7K/z3idy3CsrFi/sb0vzfwrl6FPhW71d/Da37GNWlucMStuVLdYUpOsAPGLpG3S3VmzfDj8vH8tNt7UmImYrbJP8Aqik2+UW+PGW1a+kxTtPbt6tu/wB277ROPx59nzhdbk9uM3V/h7XF0n1BS9orly4tOkfgTs0x2+vvj/Am2hiy54m9bbEXibRfvWNRrE6wYAAAAAAAAAAAAAAAAAAAAAAAAAABsp9lX2fbTvB7r+FcavYd65wPhGZj836gZtIUlZx9Np78LmHjTrOMoTpn7qWrwb1nxKdcbKuypSNKeuOR/C3pHL1d1Vpa1qTOho3ru8hft9bXDitHkrPeJifiZpxUmPWfLaZ9I9Yhb7ePtFaPs7eAXU3N49nHTqvqfXy9MdI6s3mMmbkuRxWps56xWa3r9ScZG9tY8netYzYMdZme/lmxi1uuwdRrsDU6zFs4Ot1eFi67X4WPH0WMTBwrEMbExrMPn6bVixat2rcfP6GEKU+8sOx46YcePFirFMeKlceOlY7VpSlYrStY+iK1iIiPtQ04t3c2uR3NvkN7Pk2d3e2c+5ubOWfNl2NrZy3zbGfJb+uyZct75Lz9NrTL3Xm4wAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAJD/u2Uv/DR6mR/D2/cjl/NzXglP6apBezj/Vnyf6n9j+O6P/Kp+99FH/wauiJ+j+a7w0f/AIY6rn/Em8prNYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0D3I9tPSbup6Y7zpZ1c43i7zR7fFv28XMrbhHa6LPnbrHG22nzPTWeNm4d74eRapKlzGu3LUI5WPfteq3X4PUfTfFdU8Zn4vltaufBlpaKX7RGXBkmPrcuG/zrek9rR371mYiLVtHeGWfBjxr8QPAfrfi+u/D3ms/F8px2fFfPrRe1tDldSt4nNx/I63eK5tbYx+fFkms0z0pkvODNiyTF4hD9+vsXe4ftNzNpzHgmuz+r3SCWTdu4e341r72w5DosWs61+DvtNgRvZvw8W3WNy9tYYWNgUtVlWtY/Au1pCnrvwa6h6Uvl3NHHk5fiJtM0za2O2TYwV7/ic+HHE37Vj1nLFK4/L3+Xlls7+yj7ynwf8f8AX0enOqtzU8PPESuHHj2OO5rbx6nD8rn8sR8TiuS27Y9bz57xamPQts5tv4kRERMZKQ0wXLdyzcuWbsJ2rtqc7d23cjWFy3chKsZwnCVKSjOEqVjKMqUrGVK0rSlaMOTExMxMTExMxMTHaYmPSYmJ9YmJ9JifksmpemSlMmO1b471rel6TFqXpaItW1bRMxatqzE1mJmJiYmJ7P4fjyAAAAeS1au37tuzZtzvXrs427Vq3GU7ly5OtIwhCEaVlKcpVpSMY0rWta0pSnl+xE2mK1iZmZ7RERMzMz8oiI9ZmftQ8cmSmKl8mS9cePHWb3ve0VpSlY72ta1piK1rETMzMxER6yk9+yY9iptOe5PHO4ruu0N/XcIjKxtuFdMNjbnibDkFbUviY+15LjT9Obh6+V6MZY2BcjhZF63ZrflO7jZNmiTHhT4MZd+2v1D1Vgtj0u9culxmSJpk2JrPeuXZrPa9MczETXHPktaImZma2hR57f3vMNHpTDzPg74B8ri3Op5rl4/qbrjTvXY0+HjJWaZtDhM9Ztq7O5GK0xm2622cOK2T4Va482DJKYNpdLqOOarA0eh1uHqNPq8W1ha7W6+xbxsPDxbEaQtWbFm1GMIQjSn3qeZSrWcqylKUqy6w4cOtix4MGOmHDirFMePHWK0pWsdoitY7REf4fnPq12uS5LkOY39vlOV3NnkOR38+TZ3N3by3z7Ozny2818uXLeZta0z9ue1YiK1iKxER9N7XBAAAAAAAAAAAAAV83ty/2Q7q78vH6DQfy/8AAOs+f9H8iAfjd9kDlv2D+AxNuj3XP5D/AMPf0XLfrf677/8A+/8AXagGI1iAAAAAAAAAAAAAAAAAADlfCOD8s6kcq0nCeD6HZcl5RyLOsa7UabU4l/NzcrJv3Iwp6bGNbu3KWrVJVu5F6sPh49iFy9dlG3CUqcrS0tvkdrBpaWDLs7Wxkrjw4cVLXve1p7elaxM9o+dp7dq1iZn0h8HqfqjgOjOB5PqfqjldLhOC4fVy7nIclyGxi1dbXw4qTafNlzXpScl5jyYccW8+XLauOkWvasTNu9lR7G7iva/r9T1q6+6/W8u627HDtZun0eVas5en6eQyLVPRS3bp8S1l76tmcq3ci7dv2cT40YW8exm49bsZp+Fvg9q9MUxczz2PFt81kpF8OC8Vvi4+LR6do9Yvn7T3m0zaKd4iK1vWZayHt6e8d57xy2+Q8NPCbb3enfDHT2L63I8rgyZNfkesLYb/AF03vPkya/FfErWMeKlMWTY+Ha1suXWzRSd/1KUjSkY0pGMaUpGNKUpSlKU8UpSlPlSlKfKlKfKlGe/l8lSszMzMzMzMzMzMz3mZn1mZmfWZmfWZn5v0fgAAAAAAAAAAAAAAADT17ans/j3R9pO/3eh18cnqH0cpe51xu5bt0rfv67At1ryLDnKlPXcs29FLaZVqzSVPOTGMo0lKtI1xD4zdIR1P0nnz4McW5Dh4tva8xH11sdI/1RSZ+c1jBOW8Vj52iPSe6xX3aPtEz4Ge0FxPGctt2w9IeI84uleape0/Cw7m3eI4fZrWfraZL8rXRwZMsxPbBa0TMR6xX3XITtTnauQlbuW5yhchOlYzhOFaxlCUa+KxlGVK0lStKVpWlaV+aAsxMTMTExMT2mJ9JiY+cTH0TDbhrat61vS1b0vWLUvWYtW1bRE1tW0d4mtomJiYntMT3h/I8gAAAAAAAAAAAAAAAAAAAAAAAAH927dy9ct2rUJ3Lt2cbdu3bjWc7lycqRhCEY0rKU5yrSMY0pWta1pSlK1q/YiZmIiJmZmIiIjvMzPpEREeszM/KHje9MdLZMlq0pStr3vaYrWlKxNrWtae0VrWImZmZiIiJmfRPz9iN2Xy7XO1rXcz5TroWOpXWu1i8v3Fy5CH0jX8czYRyON661OlPXbtZOorq8/Lx7kpShm0l6qW6xrbjPLwV6NnpjpfHubWPy8lzUV3M0zEebHr3jza2OJ+cRbD8LJes95i/eJ7THZqZe869pSPHTx13OmuC3LZeivDLJsdO8dSlrfB2+Z1rTh5ndvWZ8t74eQje1dfNSK1trdu03ifPO6JmVWsAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQ17tnXx3r9SqeflXt65L/AD/3b8CSB9nKf9mnJR9vp/Z/e3tBUF76GP8A4M3RU/a8X+E/f6Y6rTfk12sIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GVi4ubYu4ubjWMvFvwlbvY2VZt5Fi9blSsZQu2bsZ27kJRrWkozjWNaVrStK0q8bVres0vWt62iYtW0RasxPpMTExMTEx84mHtwZ8+tlx59bNl18+K0XxZsGS+LLjvWe9b48mOa3paJ9YtW0TE+sS1l903sjezPunhlZ+96f2+AcxyviVuc16eVs6fbzrKn6GM8LJtZ2g9MJ+qfqjqI3ZSnL1zl8vGNeqPCbo7qiL5M+hGhuX7993j+2HNPePTvS0X1+0T6+mGJ9fmm34Fe8H9pLwItg1OK6tv1b05g8kU6Z6wjJyXH18s/XTXaw5Nblu9q9q9rchNKxWPLWvr30PdYvdq+q+s2WTldFOsvHeSaSUp1w9TyvCrhby1Gla+imTs439brLspU8UrW1i26UrSta/KtKMGcv7OHK4slr8NzOvs4fXyYtqnkzxH0ebJ5sWKZ/OrC1Xw599P0DvaeHX8TPDfmOF5OsV+qOQ4HZjZ4vJMxEW+Bozj3d6kVnvP9Mz2mY7RHqwa5r7Bv2iHEfjX8bpzxnkmut+r0Zen53xa9kXfT5rX06y3s72bTzGlK08wr58+Kea0q6Ru+BfiFqd7V47W2ccfK+He1ZtPb/wCSjLa/53olF0z71j2Puofh4s3WXN8LuX7ebX5HpXnceHH37R67ttLHrT2mZie1vSI7z6TDGjc+y577NHdrZyu3jnuRKk/h+rW6bP2VusvPjzS5h4t2FY/f9VK+nx8/LrWbwx64wTMW6f3rdpiO+LDkyx6/dpSWbON9uf2V+UxxkweMPSeGs183bd5LV0rxHbv2mmzmx2i30RXt3mfSIcn4v7I7v85Zet2Nf0E5BhTu1jSkt7ctaK3Gsvq9dzaUxoQ/f9VaePv+HK1vCbr3bmK4+B2KTP055jBEfnzl8vb7v2vpfD5z3g3smdP475dzxX4jZrjiZmOKpflbzEd/xNNGc1rfL07RPf6GcHST3dTvI5jexrnU3e8E6UYM5W53pXdrr+X5FbFa0rOkLfH9rOtu7WPmkaXIV9MvHqjXxWju3E+zz1huWrPJ59Hisc9pnvlx7l/L9MRGDLPa3b5d4mIn5oweIPvivZw6cx5q9EcV1V1/tVreuOMeht9O4PixExWbX5bRrF8cW7ebyWjvHfyz8m/Ds09iJ2sdrG11vNuR2c7rJ1EwfhZGPtOZRxL2j02wh483tJqMTD18JWq1jGVLe4psq0l5r5pTxSmd+jvBXpfpfLj3dmt+Y5Gna1cu5FLYMOSP67BhrSkdp+fbN8T1VP8AtIe878d/HfQ3emeGyanhv0dtefDm0em52MfK8lqW79sXJ8jsbO3at47zE346dLvXtHb6W5yzZs41m3j49m1YsWYRt2bNm3C1ZtW4UpGFu3bhSMIQjGlKRhGNIxpSlKUpRmOIisRWsRWsRERERERER8oiI9IiPoiFbWTLkzZL5c2S+XLkta+TLkvbJkyXtPe173tM2ta0zM2taZmZnvM93lfrwAAAAAAAAAAAAAAV83ty/wBkO6u/On6jQfyf8A6z5V/f+/8AwVogH43fZA5b9g/gMTbo91z+Q/8AD39Hy36/+u+9/wDuagGI1iAAAAAAAAAAAAAAAAAD7fGuP7PlvI+P8V0tiuTueTbvVcf1ONStKVyNnuc/H1uBYpWVaUpW7lZNq35rWlKerzWtKPdra+Xb2NfVwV82bZzYtfDX+yy5slceOv697RH675nNcvo9P8Ny3Pcnl+BxvCcZv8vyGbtM/B0eN1cu5t5e0d5n4eDDkv2iJme3aE/b2XvssOmXZbwfVc45NiYnMeuvKdViZ+75Hsca1ds8Xjm49u7TRcdsSt0piwxrUowysm7XIy7mZLKlbyYY8rVm3PTwy8LuN6M0sW7s0puc5s4q5M+zkrExq/ErE/A169vrYrHaLWnzXm83mLRXyxGph7cvt39b+0t1Rv8AS/CbGfpvws4Lf2NTjOF0816ZOdtrZr0nleYzVvM57Z71m2DBjjDgprV14vhtmrky33DsvK6QAAAAAAAAAAAAAAAAAHq5+DibPBzNbsMe3l4GwxMjBzcW9H1WcnEy7M8fJx7sf+dbvWbk7c4/fjKtPvvDJSmWl8eSsXx5KWpes+sWpeJrasx9q1ZmJ+5L36u1saO1rbupmvr7ennw7Wtnxz5cmDY18lcuHNjt9F8eSlb0n6LViVc/7V3tJzu0ju653xzGw7lnhHOc3I53wXKrb+HYyNZvLv0vY4+PSkYxpZ1m6v5+ttR+ulvEj85ePVWvPxU6Tv0n1bva9KTGlvXtvaN+3atseefPkrX0j0xZrZMcR9qjcb9gf2gdb2gvZ76V5rPsUydT9La2HpXqnBF/Plxb3F4/qfTzZpmZmcm9xuLU3clu/ab57fL5NaLGyawAAAAAAAAAAAAAAAAAAAAAAAADaN7JHs42Hd53Y8S1+dhXLvTzptkY/O+e5UoeLNcLV37dNXgwuXIytXL2TvbuqjfxqUnclhSvz9FIUrcjk7wn6PydXdV6mO9Jnj+NtXf37TH1s0xWj4WPvPpM2zzii1fWZp5p7dvVBj3gntG6ns8+APUO3q7NKdYdaYc3SnSmCLd8kbW/iv8AV+1alZjJTHg4rHv2xZu9aV2a4q+abTFbWJOHh4uvxMXAwbFrFwsHGsYeJi2Y0hZxsXGtRs49i1Cnyhas2oQt240+UYRpSnyosIpSuOlMdKxSlK1pStY7VrWsRWtYj6IiIiIj6Ihp6bOxn29jPt7WW+fZ2s2XY2M+W03y5s+e9smbLktPra+TJa172n1m1pmfm9l5PSAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQp7tvLx3tdRaf8AS7fuS0/9teCVoz/7Oc9uteQ+7wGzH7e7oKhffP17+zJ0dP8AY+LvCT/+Geq4/wAKcImy1gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfN7cv9kO6vfxNB/7g1aAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagGI1iAAAAAAAAAAAAAAAAADLXsR1+Ds+8LtzxdhZpfx6dXeB5FLdaeaVv43JdZkY8q0r5pWkL9u3KtK/Kvh2vobHTL1f07TJXzV/BfQt2n7ddnHas/rWiJR/wDap3NrR9nXxkz6eScWafDzqvDN4ntMYs/CbuHNET3jtNsV7Vifo791nFSlKUpSlKUpSlKUpSnilKU+VKUpT5UpSnypSn1LLWkRMzMzMzMzM95mfWZmfnMz9My/R+AAAAAAAAAAAAAAAAAAANGft3OzuXcR2u3OqHFtZ9K6g9DrkuQ2Potn4mdtOKSnKzutdOfplWmHrMbNzd7KlPTWk8Wtay8eaMIeOfSE9Q9MTyerj83IcJM7FfLXvfLq9+2bHM+vamOt7557ev1k+v0LR/dWe0XHg/46U6G53ejB0h4oUjh8vx8nl1dDn60jJxm5WveInZ3c+vq8VWZ7/W54iK9/VAz+r60Fm1iAAAAAAAAAAAAAAAAAAAAAAAA8tmzdyb1nHx7c71+/dt2bNm1CVy5du3Z0hbt24RpWU53JyjGEI0rKUq0pSla1pR+1rNrRWsTa1pitaxHeZmZ7RERHrMzPpER85eGTJjw48mbLemLFipfJlyZLRSmPHSs2ve97TFa0pWJta1piKxEzMxELA72LfZn/ALlPtS0m75Jr7VjqT1js4nOOSXpQh8fF1OytUyuN62lfFbtj0aS7rZ5uLcl6oZ1u5Wdu3ONYRnz4NdHfhV6VwZ9jHEcjzFab2zMxHmriyV82tj+3X+kzjm9ZnvF4nvETHaNR73lXtI/ze/HvlOM4Xbvl6L8OMmx0vwuKt7fCz7+lknBzW7MR2x5fNyePdrrZ617W1b18tr1t5rbhWXldYAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAACQb7t7L097nPqf9LoHySlPyz4NX/wCf8jP3s6f1a7/6Q7P8d0VRXvm47+zH0n9zxZ4Sf/w31TH+NOLTaavgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAD5W90ut5JpNvx7c4tvN1O91mfp9nh3o+q1k4GyxbuHmWJ0+XmN3HvXIV8VpXxL5VpX5vVnwY9nBm181Yvhz4smHLSfWLY8lZpes/cmszDn8Vye7wvJ8fzHG5763IcXvavI6OxjntfBt6WfHs6+Ws/2WPNjpePo7x6q2z2kPavte0fuv6ldN72NdhxvP3OVyjhWZW1W1i5fHt/KO1s2MKvikbljUXc2enrKNZVpcwpxnWs6SVy+IvS+XpPqrkuOtWY1sma21pX7dq3188xlitPomMM3nF6fTT19e7c/9jLx30PaD8A+ius8Welua1OOw8F1NrRki+fX5jiazoZMuzHmm1MnI49avIxFojvTZrMR5Zhge6MlUAAAAAAAAAAAAAAAAAAAAAAA2w+x67Ncvu27sOM3NtgTvdOOlN2xzvmt+5CsbGRHXX7UNNrbN+dPhTyp7zI1V+9i0pcuTwYZEq26W/VOOVPCLo6/VnVWtObHNuO4qa727aY+tt8O0RhxxafrZt8e2K1qeszSLT27d5iAvvFPaQ1/Z98Aubrx+1XH1n17jy9K9MYqXicuG25ivbkd3JirPxKYK8Xh38OPYny0ptWxV803mtLWGOPj2MTHsYmLZt4+Ni2bWPj2LMKW7VixZhG3Zs2oRpSMLdu3GMIQjSlIxjSlKUpRYFWtaVrSsRWtaxWtYjtFa1jtEREekRERERH0Q1Bc2bLsZsuxnyXy58+S+bNlyWm2TLly2m+TJe095te97Ta1pmZm0zM+svM8nrAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABII93Cl6e97nH/ndB+SR/n5hwj/4f96M++zr/VtvfpFs/wAc0lR3vl47+zF0v9zxV4Wf/wAO9Tx/j/xJyCbbV4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAABHn94I7Pp9Ye37U9wPE9XXI5l0Wu2o7z6JY+Lm7HhexzK413HhatRrduUwM/Z/mnkXfTP4WLi3JTrC1brKkfvH3pGeX4DF1BqYvNucLMRnile98mnkv5ZrER6z8PJl+Lae09q0nv2iO8W+e6N9omnh14uch4R8/vRh6c8S8d54v6oy/D1tLqXT14z0zWvefJSdvU0fqHFj71+JnzUisWvaImD+hQ2fAAAAAAAAAAAAAAAAAAAAAAHnxcbIzcnHw8SzcyMrLv2cbGx7MJXLt/Iv3I2rNm1bjSsp3LtycYQhGlZSlKlKUrWtH7Wtr2rSsTa1rRWtYjvNrWntEREeszMzERH0y9WfPh1sObZ2MlMODXxZM+bLktFMeLDipOTJkva0xFaUpW1rWmYitYmZntCwp9jl2aWu0ntO43f3uDatdSOrOPh885fk1hD49rF21n6Zx3WV8+buPLD0eRr7OdiylGsc6zclctwuUrGlgPhB0dHSfSmtOekRyPK1pv7du310Vy18+vj9fWs0wWx1vT0+vrMzHf0jUM9417SF/aB8fuaxcVtZMnRnh/l2OlOncPmtOLJn4/L9T8xux2mMeauzymHcyauesT31ctIre1J7ztoZWV/gAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAAkB+7jSpTvf5l/53Qzkcafw/3W8Mr/Qz37O/9W25+kmx+/t6UKkvfKR39mDpz7ninws//h7qaP8AGnKputXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAABxnmnEtNz3iPJeFcixbeZo+VaLa8f2uNcjGdLmDt8G/gZHppOMo0uRtX5StT8VrbuUjOPiUaVcbd1MO/qbOlsUi+DawZdfLWY7xNMtLUt8+/ae1p7T9E+r7fTXUHJdKdQcJ1Nw+e+tynA8rocvoZqWtWabXH7WLaw+aazEzScmKtb179rUm1Z9JlWid8nbZve1Hua6o9H9vi3LGFp+Q5Wfxq/8OdMbK4zufRt9J9Gv1828muLrc/FxMmdqcqRyrN63OkJxlCNbnW3TefpXqXk+HzVmtMOxa+tbtPltrZu2bB5bfK3kx5KUtMd+14mJ9YmG657L3jTxXj54I9C+IvHZ6ZdnkuHwavNYvPWc2Dm+N83H8p8fFHa+H4+7q59jDW9Ym2DJjvWbVmLTiQ6mkCAAAAAAAAAAAAAAAAAAAAA2++xj7ML/AHX91mi3O+18sjpn0euWebctndhKOPnZeHct29Hq7N+VPhSy47jK1mfcxvM7lzCx78q2/h0lKmXPBzo23VXVODNnxzbjeHmu7tzMfW5L0mIwYotPpN4zWxZJr6zNKzPbsrx95J7SeHwC8BeV43ituuLrbxFpl6Y6epS0WzauDZpe/Kb+XFHfJXXnjsG7qUz9q0ps5sURfz9qzYL2bNrHtWrFi3CzYs24WbNm1GMLdq1bjSFu3bhGlIwhCEaRhGNKRjGlKUpSlE+4iKxFaxEVrERERHaIiI7RER9ERHpENRjJkvlyXy5b2yZcl7ZMmS9pte972m173tMzNrWtM2taZmZmZmZ7y8j9eAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN/vu5da074eWU8/quiPI6f+1fDq/0M9ezx/Vtt/pLsfxrTVLe+Qjv7L/Afc8T+Gn9rgepP+VObTeauAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/AOLoPs/qkA/G77IHLfsH8BibdHuufyH/AIefouX++++1AsRrEAAAAAAAAAAAAAAAAAGX/YJ/jk9uX42eE/aHXu3dBf1Y9Ofpto/xjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAjQe8S9n8+edKuLd0nEdV8Xf9MZ4+g5xLFs+q7k8S2ebOxh5U7dqPxb+Rj7jZYcJ3q+v4WFal6qRhCsoxt9oTpGd/i9XqfUxd8/GeXBvTWve1tTJea0t2iO9rVzZaRM+vakTMxERMrr/c8+0RXpXrznvArqDf8AJxPW9MvLdL1z5fLjwdQaOtGXZwVvknyYsObjdPYtTHHk+JtXjtNr2iswxkOWySAAAAAAAAAAAAAAAAAAAA9rCwsrY5uJr8Gxcyc3PysfCw8azGs7uRlZV2FjHsWoRpWU7l27chbhGNK1lKVKUpWtXlSlsl6Y6Vm18lq0pWI7za1pitaxEeszMzEREfOXo2dnBp62xubWWmDW1cGXZ2M2S0Ux4cGDHbLmy5LWmK1pjx1te1pmIrWJmZiIWIHsiezfH7Qu03imFt8O1b6idTMXD55zbL+HSORSe5sfTtJrLtJUrdsXNXpsrCwcvGlWPpy8a5WduNylaRsF8Jejq9I9KatM1IjkeTrTf3b9u1onNHxMOKe/rWcWG9KXr6fX1nvHeGn37wr2js3tDeP/AD+1x+zkv0d0Tn2OlOmMHnmcM043JGrye9SYnyZab3Ja+zta+aInvr56xS80nvO05lFBIAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG/X3dGXp75OS0/6XRbkUf/AGo4hX/v/P8AeZ59nme3W2z+k2xH/nOp/jVN++Mr39l3hZ/sfEvhp/8AQXUX+PsnRpvtWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAHAeqfTzQ9WenXNem/JsWxmaXmnG9xx7Mt5FuN2Fqmzwb+Jby4wlSVPjYd27DKsS8V9F6zCdKVrGjgcpx+DleO3eO2aVvh3dbNr3i0RMR8XHakW7TEx3pMxes9p7WiJ+h2zoTrDlugOsemus+Ez5dfk+mua47l9a+G847XnR2sWe+va1Zifh7OOlsGWO8ebHktWZ9VZV3V9BuRdtHX7qb0a5Jh3sTJ4hybPx9d8aNaVydBlXPp/H8ukvHpnXJ02Vg3p1j8qTuSjWkZUrGla3VPBbHTfP8nw+zSaW1NnJXH3/rsF5+Jgv3+U+bDalp7fTP0T6N27wG8VuH8bPCXojxI4XYx7GDqLhNXNufDmJjBy2Cv1Ly+vNe/evwOSwbWKsT860iYmYmJnHp19l4AAAAAAAAAAAAAAAAAABuZ9id2W3O6bum1fL+Sa6uT0y6LXLXL+R1v25UxNnt7ErdrR6i3er4t1y7OyzNft5WPVKc8bDu1rbrb9VWYvBfo23VHVGLc2Mfm4zhprt7E2j6zLmrMRgwxb5eeuS+PN5fppSfTt3Vu+8z9pWngT4E7/T3C7kYet/EuuTp3hoxXj6o0eOyxbJyvIXxR3v9T5dLX2+PjL2itc+xSItF/LCf7CELUIW7cI27duMYW7cI0hCEIUpGEIRjSkYxjGlIxjGlKRpSlKUpSiesRERERERERERER2iIj0iIiPSIiPlDUrta17Wve1r3vabXvaZta1rTM2ta0zM2taZmZmZmZmZmZ7v6frxAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABvw93Wl475t/T/pdG+RU/wDabiVf/gzv7PU/7N9iPt8PsftRs6n/ALlT/viY7+y5xP3PEjhp/wDQnUEf4/8AEnUJwtWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAABFV9407Qa7PScK7teIajzkaT4HEOpU8Oz4pLAyL1y3qOQbG54rKd2mXf1ektVpKkaWqW6VhWtPUi37Q/SPxMOl1Zp4frsPl1OSmkfPHa0xh2Mk9u82i9sWCPXt5e0dvRfJ7m/wBoeNLlOpvZ+6i5D+k8p8XqLomuxk7zXbw4635HiNOveIrjnBj3uUvExMzfzzFu3aqIiiW2FAAAAAAAAAAAAAAAAAAHvazXZu42Wv1Gtx7mXsdrnYmuwMW1Gs7uTm51+3i4uPahGlZSuXr923bhGNK1lKVKUpWtXnix3zZMeHHWb5Mt6Y8dIjvNr3tFa1iI+c2tMREfblxt3c1uO09vkN3NTX09HV2Nzbz5JiuPDrauK+fPmvaZiK0x4qXvaZmIitZmZ7LFj2UfZ1hdnnahw3judh24c/53h4nOOeZsrVLeXPYbqx9P1+syKV/RWrmk1uXj6q9a8R/TcOUrkfiearC/Cvo+nSHSunr5KRG/vUpvb1+3a/xM8fEx4rfTE4cd64rR6fXU9Y7tOr2+PaM2vaL8fOo+Y1di9ukuldjY6X6U1ov59eunxmT6k297DMTMZKcnu6+bfx5O9v6XsRFLeTtDZkyUhKAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADfV7u3Xx30bmn/S6P8ip/wC0nFK/0M6+z3PbrjN93h9mP/OdSf8AEqj98LHf2W+N+54icPP/AKG56P8AGnXJxtWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8XQfZ/VIB+N32QOW/YP4DE26Pdc/kP/Dz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/wCwT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAB1B196P8c699HeoXSTlOHjZuq5txjaaekcqHrt4uwvY1yWp2NKeafpmt2cMTOtVr5j8THj6oyp5pX5HPcRrc9xHIcTtUrfFu62XD9fHeKZLVmcWT8/HlimSPu1j0lkTwn8ROY8KPEbpDxB4LZza2/wBMc5o8jM4LeW+fTx56RyGnM/2G7o22NXJ8p8ma3aYntMVknXvo/wAj6CdYeoXSPlWJk4e34RybZ6escu3W1eytfZybktTsawrGNKW9nrJYmfarGNIytZEJR+VaK1Od4jY4Ll+Q4napambS2cuHteO1rY62n4WTt2j0y4ppkjt6drR2buXhR4icN4r+HXSHiFwOxh2OO6o4TS5KJwXi+PBt5MNY5DTi0Tb67R3q7GpkiZmYvhtE+sS6hfJZCAAAAAAAAAAAAAAAAAbufYb9lku5nudxepHKNfXI6adD5w5Js6ZFmssDccl9ELOl00rnilKZOLfz8XexhGcZShr6+qkoeqlc1eCXRn4ZepqcltY5txvCTGzl80fWZtntEYcMz9Fq2vXP2iYmYp9rurH96H7SseCXgfn6M4PcjD1r4oVtw2jOHJFdrjuF81svJclFO/ecGfFq5+LtaazEX247TFu0xPejGMIxhCNIxjSkYxjSkYxjGnikY0p4pSlKUpSlKUpSlKeKJ3RERHaI7RHpER8oj7TVAmZtM2tMzaZmZmZmZmZnvMzM+szM+szPrMv0fgAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAADfJ7vBXx307T9/pLyCn/tDxev8AQzp7Ps9uuMv3eJ2I/b2NVVR74KO/ss6U/a8QeHn/ANEc7H+NO0TkarwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/2Cf45Pbl+NnhP2h17t3QX9WPTn6baP8AGMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAACIb7xp2hU1W/4T3acQ1HoxN7GzxDqPcw7NZU/NPHtXY6re58oUlSzbrh2Nbp7dyXw7c70oR81uS+cSvaI6R+FsaXVepi7Uz+XT5HyV7/ANNrExiz5O34mPJXHhifSJntHz+ewv7m72hp3+J6n9n/AKh5DzbHFTl6i6MrsZIifqHNkpbkOL1ItMTlvGzl3eRvSPNeuOLWiIpHaIrKLi+EAAAAAAAAAAAAAAAB9LTanP3+31Wi1WPcy9putjharXYlqNZXcnO2GTaxMSxbjTzWs71+9btxpT66yo9mHFkz5cWDFWb5c2SmLHSPWbXyWilKx92bTEOHyPIanE8fvcpv5qa+jxuns7+5sZJitMGrp4b7GxlvM+kVx4sd72n7USscPZedoWu7O+1HgnCr2JbjzflGBjcy57nytfDzb+63tuWzta7M+UfFzQYubb0tKUjGtaYVKz9U/Mq2I+GPSOPo/pXR0rUj6t2sddzfyTHa9s2ePixjv8vXBW8Ye3aPxHr3n1abPtze0Pue0Z4+dVdTY9i9umOC283TfSepGSb62LjOKvGlk3dbvM/Wctn1rclMza3rszFe1e1Y2LMhocgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAA3v+7yy9PfXm08+PV0p5BT+H/h7jXyZy9n6e3XN/u8VsR/5fWn/ABKrPe/R39ljW+517xE/+iubj/H/AIk7lOZqtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f/i6D7P6pAPxu+yBy37B/AYm3R7rn8h/4efouX++++1AsRrEAAAAAAAAAAAAAAAAAGX/YJ/jk9uX42eE/aHXu3dBf1Y9Ofpto/wAYxo8e1j+Rx8ZP1AdTfenbWbKyppHAAAAAAAAAAAAAAAAAAAAAAAAMdu6/oHx7ua7fupvRnkWHZyrPLuM51jVyu0hT6LyDEhTP4/lRuy8VtRsbnFwbl2UZR9VqE4Sr6JSo691VwOv1LwHJcNsUrau3rXrj839bsUj4mvbv6dormrSZ9fWImJ9GYvAPxZ5jwR8XOiPEnh9nJr5Onub1cu/GPzT8fiNi06nL680r3jJOXjc+1THE1t5clq2rHmiFZZ1R6eb/AKT9ROZ9N+T4t7E3nC+Sbfjufbv2Z2JXLmrzr+JHKtwuUjWuPmW7UcrGuU8wu2Ltu5blKEoyrWtyfH5+K5Hd43ZramfS2c2vki0TWZnFe1ItET/W3iItWflNZiYmY9W7Z0N1fxPX3R/TXWfB58WxxfUvC8dzOpfFkrlilN/VxbE4L2pMxGbXtktgzUntamXHeloi1ZiOBuC7UAAAAAAAAAAAAAAA3rewj7LadxfcpTq9yzW/SunHQycdzdhlWfXr91y69Zjj6nU3Jen1Uv4NNha31n0Th+j10fXWUfVCWcfA3oz8MXUkcvt4vPxvBz8aYvHfHm27RFcWKfTv5scZI2K9pj1x+vePSasvepe0rPg54Kz4e9P7vwOs/FKJ43HbBk8u5xnT2PJbLyHIUjv2nFtTqX4nJ5q2+t257RFu1ong0pSlKUpSlKUpSlKUp4pSlPlSlKU+VKUp8qUp9Sc7VVmZmZmZmZme8zPrMzPzmZ+mZfo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAb2Pd6peO+2/T/pdLt/T+becbr4/zf5mcfZ/nt1zb7vGbEf8AltdVj73qvf2Vsc/2PXXET8v+xnM/tfa/XTwE52qqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/ABjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAAAAhh+8Sdn8eA9VuK90fEtV8Hj3U+Njj/Nq4tn9LxuX6zBnaw8uduzGkcXGyNNrcWFy9cjGF7Pu1p8St25SNYb+0H0jGhyur1PqYu2vycRg3fJX0rt46TFLzEfia2w46xNpjtN5+feezZM9z17RFuregee8C+od/4nMdDTl5fpmNjL9fm6d3tut9jXrfLM2z58PI7ue1MdLTbHq4/SkY6eaI0aN66wAAAAAAAAAAAAAB9fQaPZcn3um45psa5mbffbTX6bWYlqNZXMjP2eVaw8SzGlPNfNy/etw/BTz5r8ntwYMmznw6+Gs3y58uPDipHrNsmW8UpWPz7WiHz+W5TS4Ti+S5nks1Nbj+K0dvkt7YyTFaYdTSwZNnYy2mflFMWO9v1u0eqyD9mp2kars67Ven/TuOLbpy/ca3H5XzzYStUt5uVyHexltLuDmVjSMZS0MM78xbVYxj+k4cPVWc/M5WLeG/SeLpDpbQ4/yx9V5sddreyTHa9tjPE5Zx39I7zgi/wI7R8qR859WmX7avtBb/ALRnjz1b1jOe89O8du5uA6U1IvN9bBw/FWjRpta0TNprXlrav4J5Im0x8TZt5YrHasZ/O+olgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/VvwP3o3UZpGxdmAAAAAAAAAAAAAAAAA3pe73y8d9/8bpnv4/8Arnj1f6P52cPAH+rn8/jc/wDDa8/4lWvvd47+yr+d1txE/wDo3mP+VPGToaqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAADEbvm7a9J3XdsnVDpDtcS3fz9tx7Kz+M3/AEQrkYvJdP6Ntpvo9yUZVtVy8/Bx8O/KPisse/chWVKSrWnUuuOnMHVXTXJ8RlrFsmXXvfWt2+ups4f6bh8s/R5slK0t9utpjvHzSE9lzxp5TwD8buhvEPQ2LYtXj+XwanN4vNaMOfhOR83H8l8alZiMka+ptZtnFW3eIzYqW7TMRCtF5lxTccF5byXhnIMa5h7viu923Htrj3YStyt52nzr+vyqUjP5+it7HnW3L5xnCsZRrWNaVrW7uaubR29nT2KzTNq58uvlrMTExfDktjt6T9Hes9vtx6t1rpznuO6p4DhepOIzU2OM57itDmNDNS1bxfU5HVxbeCZmvp5ox5qxePSa2iazETExHGnGfaAAAAAAAAAAAAAb8/YJ9lsOvvcRf648v1n0rp70Pn9OxbWVZpc1+65plY8cfXa676o+ZVwMfY13dqVucKRyNfbpKUvFbcs8eBPRkc91Dbm9vH5uP4T6+sXjvjzbt6xXHjmJ9e+OuT49Zj5Xxx3+1NTvvXvaVt4TeD2Lwv6d3fgdX+KFY1c98GTybfGdNYM05dzdp2ntFdvNp/gZkretpnDt3mKx3i8Tpfq+pOBq0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIZnvM36/vbp+LLlf2g1aHXtKfj909+lm1/GMbZF9yX9ibxj/AFb8D96N1GaRsXZgAAAAAAAAAAAAAAAAN5nu+kvT34Wv/O6c76P8+20Vf6Gb/AH+rqP0uz/wuCVXPvc47+ypk+51lxM/+j+Vj/GnmJ0tU0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAEHf3gXs9h0Y7hNZ1+4pq6YvCetcLf5qxxbNLeDrOa6/CrYycWFIwp4u7LD1lzcZE5yn68jKuVpKPqpFCbx86RjhuoMXPauLyaXNRHxYrXtjx7uOnltSPT55KYpzW7zPe15bQPukPaJt4k+EO94S8/vfH6m8Mr5PqCc+Wb7e90zt7MZcGe3e098elsb1OOw1rWvlw4KRMW7TaY97AC3cAAAAAAAAAAAB93i/G9tzDkmh4pocW7m7rke412k1eLZhKdy/nbTLtYWLbpGPz8VvXoeqVfFIx8ylWlKVrT36utl3NnBq4KzfNs5seDFSI7zbJlvFKx+3Md5+iPWfR8rnOZ4/p3huV57lc9NbjeG47c5Te2MlorTFqaOvk2c95mfTvGPHbtHztbtWImZiFkp7OvtO03Z32t9POl+LjW48myNVj8j5zn1txjmZnJ95GW1zsXLnCMI3fzFu513T406R/8WxLdKynX9HWxnw86Uw9IdL8fxdaxGzbFXY3snaPPfaz98t6XmO3m+BN5w1nt+JpHrPznTA9sTx95L2i/HXrDrrPnvPCYd/Nw3S2pF7W1tbg+LtGjq59atptakcnTVpyOasz/t2xeYrWPrYznd4RbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABvH935l4788Sn/AEunu+p/600fhm7wC/q6r+l+f9/LhhV773CO/spbE/a6w4mf/MeU/wDcnop1NUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8AF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAABgZ7SPtV1Xd12odSunF3Ftz5PrtPkcp4Rn0s/FzMLkOgpDa27GDSsZ0pe3NjCuaWVawlX4WfP0+mXiVOi+I3S2Lq3pXkuOmsTtY8NtrRydu96bGDtlitPn65q0nDPpP1t57eqVnsYePO/7Pfj70V1njz3rwe3yOHgup9Scnw9ba4flpto3y7c96zOLjcuzTkoiLV+v1a9+9e9Zrbt5ptjxzdbfj24xrmHttFtM/T7TDu0rG7i7HWZd3Czce5GvzpOxk2LluVK/VKNVc2fDk182bXzVmmXBlyYctJ+dMmK80vWfu1tWYn85ufcXyWnzPG8dy/HZ6bPH8ro6nI6OxjmJpn097Bj2dbNSY9Jrlw5aXrMfOLQ+W9TnAAAAAAAAAAAJCPsA+yyHW3r1n9wnMtZXI4J0UnKWlt5dmksLcc2zcWmPjY04zjWt2Gvwdhe2dq7arGNvNwrVJXPVGtuuf/AXo2Ob52/UG5j82jws98MWr3pm3b08taT3j1jHTJOSJjt2vSI7+kwqI97R7S1vDHwo1PCHpzejD1V4mViOSvr5Zrtcd0xrZ5zZ81ZpPbHfb2tTFpXpkibX1tq81p2mLxOHTZavwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN4Hu/8vT3662n/S4Fvaf+stNX+jz/ACM1+Ak/7O8Ufb0c/wC9kwqwfe2R39lHd/4PVnFT/wCZclH+NPYTtaooAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvl9uV+yHdX/4ug+z+qQD8bvsgct+wfwGJt0e65/If+Hn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/wBgn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAAAD8rSlaVpWlK0rStK0rTzStK/KtK0r8q0rT5VpX6x+xMxMTEzExPeJj0mJj5TE/RMIGXt3Oz2Hbv3SXep3F9b9D6fdcbdeRYsMazWODq+UQt1sbrArd8VpXL2WXhZ+8nblOsvTlVlGMYeKUgr45dIfhe6nnk9bH5OP5uPqikVj+l4tqI8ubH3/ALPLemTPMTMz2t9EdobWXurvaKt4w+BWPofnN36o6u8L7/gPntmyRO1vcHa/xeM24x9+8a+lr7Opxdb1rFfNgiJmbd5nRqwitFAAAAAAAAAAcl4bxPc875ZxvhnHcS7m7zlO71mh1eNZtzuzuZu1zLOFY8xhStaW4TvUndnXxG3ajO5OUYRrKnJ09TNvbetp69Jvn2s+LBirWJmZvlvWlfSPoibd5n5RHeZmIh8XqPn+N6V4DmepOY2MerxfBcZvctv58l64601tDWybOXta0xE3tTHNcdY72vktWlYm1oibKbsG7WdH2g9sfTnpHrca1Dc4unx9xzHNpG3XIzeU7mNdpuIX71uNKX4a/OzcnAw5VrP04li1Ck50pSVbHug+l8HSPTXHcTipEZq4a5ty/aPNfazR8XNFpj8VGPJe2Ok+valYjvPzaWXtY+O3Ke0P439ZeIO7nvbjc/I5uO6c1ptf4OtwPGzGhx1sWO8zOK23q62Hb2KxFe+xlyWmte/ljM13FG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG7r2AkvT376f/zuD72P8PnP1H/wZq8Bf6vMP/aOx/6+FWN72ivf2UOSn+x6o4qf/NeQ/wDenvJ3NUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/8AF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/w8/Rcv9999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAABrM9rF2jYXdv2jc60OHhWrvOuBYOTzvg2ZWMa3rGdo7P0va41r/nXZ7DR2djg2bFPVWd/Jh8OFblYsa+KvSdOrOkt7BSkTvaFLb+lftHmrfBHny1j6ZnJgrkx1r9NrR2jv2Ta9gP2g9n2ffaE6W5XZ2cmPpXqzawdKdU68WmMWXU5TJ8DQz5P63HXT5TJp7WXLPby4sNvNaKd1dHm4eVrszL1+dYu4ubg5N/DzMa/CVq9j5WLdnYyLF63OkZ27tm7Cdu5CcaShONYypStK0V53pbHe+O9ZrelrUvW0TFq2rM1tWYn1iYmJiYn1iY7S3GNbYwbmvr7erlpn1trDi2NfPitF8ebBnpXLhy471ma3pkx2relqzMWrMTEzEvWeL3AAAAAAAAAJGfu+fZdb6t9Z9x3L8z1Vb/D+j054fFYZdmlcbZ812GJTHpOlu9CtMrGwdZn5l6F61T02NjjWqVuUuQ9CQ/gD0bHLczm6k3MXm0+ImaasXr9Zl3clPL37WjtetMWS9omI+tyUj17x2U4e909pS/h94a8d4J9N7/wuo/EatNnnra+Sfj6PTGnsfGmnnx2idfPt72rrY7Y8kxbLp5rzFJpfzJsqaLWWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzPeZv1/e3T8WXK/tBq0OvaU/H7p79LNr+MY2yL7kv7E3jH+rfgfvRuozSNi7MAAAAAAAAAAAAAAAABu19gRLx38aH/wA7hm8j/wDfmsr/AEM0eA/9Xmv/ANp5/wD18Ssr3ssd/ZO5b7nUvFT+1rb/AO180+NPBqeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK+X25X7Id1f8A4ug+z+qQD8bvsgct+wfwGJt0e65/If8Ah5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/GMaPHtY/kcfGT9QHU33p21mysqaRwAAAAAAAAAAAAAAAAAAAAAAAAAAD+Llu3et3LN2ELtq7Cdu7buRpOFy3ONYzhOEqVjKE41rGUZUrSVK1pWlaVfkxFomtoiYmJiYn1iYmO0xMfTEx6S8qXvjvTJjtamSlq3pekzW9L1mLVtW0TE1tW0RNZiYmJiJie6vr9tN2fS7We7ff7fQa+eN076xfH53xicIVnYxs7Pu1ryLCuXYUras3rm+jtcrHxK1hOOHWEoW/hUpJATxl6Q/Cv1ZsZdfHNeP5jzb+rMR3rW+Sf9UUmY9K2nP8W1aT2nydpiOzbl92p7RMeO3s+8Tx/Lblc/WHhz8LpTnK3tFcubV1af6zbNMdp8+THTiZ0MGbPHmrOzFq2tF5msafmI1iIAAAAAAADlvAuF7zqNzXivBONYl7O3vLt9q+P6zHsWbl+dcraZlnEt3JW7VKypZsfFrfyLlfELVi3cu3JRhCUqcvR08/I7mro61Jvn28+LXxVrE2nz5bxSJmI/ra9/NaflFYmZmIju+B1X1LxfR3TXO9Vc1sYtXiun+J3+X3s2XJTFWMGhrZNi9K2vMROXL8P4WGkd7ZMt6UpW1rRWbLTse7Y+P9pHbZ036OaXFs2c7UaTGzuU5UKW5Xc7lW2jXZ76d2/bp+n2rG0zMzHw5SlP0YkLVuMqxjStbIeiemdfpPpzjuHwUiL4sFcm1aO0zfayx8XPM2/rorlvetJnv2pER3aVHtQeN/L+0H409aeI/JZ8mTU5HlM2rwOC03jHq8Dx8xo8TWmK/pivl0dfXzbFYrXzZ7XtasWmWW7tiPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAAN1/sDa+O/rjdP+lxDeU/8AvrW1/oZn8CP6vNb7upn/APWxqzvewx39k3mvudQ8XP8A5Ddj/Gn0p4tTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/APF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/AMPP0XL/AH332oFiNYgAAAAAAAAAAAAAAAAAy/7BP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAGor2zfZ9Z7qe0fkuw0mvjk9ROkVu/zzid2EYUvX8bXW5V3+Fcn4pcu2fzBntb9jHjOnqzI2qxjOdaRriXxj6QjqnpPZyYMcW5DiItv6kxEea1ccf6opM/OY+BOW1a/Tft29Z7TYT7tv2ir+A/tBcLqcpt2w9H+IdsXSnP47WtOPFm3Lx+BG1SvrSmT8FaaGLLmmv1uvbJFrVr3tFe/ct3LNy5ZvW52rtqc7d21chKFy3chKsZ27kJUpKE4SpWM4SpSUZUrStKVpWiAUxMTMTExMTMTEx2mJj0mJifWJifSYn5Nu2l6ZKUyY71yY8la3pelotS9LRFq3paszW1bVmJraJmJiYmJmJfw/HkAAAAAAAko+70dl1vqV1V3/AHS811PxuMdK53dTweOZZ/SM7mOfi0x7+Zbt3o1t5mJh6rN2Nv4tuM4Y+xtW6VnG9bpGkjvZ/wCjY5Llc/U+7i76vFzOLS88fW5NzJXy2vET6XpTFfJHeO8VyRH9dEQpb9757Sl+iuguJ8CemuQjHznXlcfI9UTr5e+XV6b1M85sWte+OfNrbGzv62necd7Vtl08l58k4795mjplNasAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDM95m/X97dPxZcr+0GrQ69pT8funv0s2v4xjbIvuS/sTeMf6t+B+9G6jNI2LswAAAAAAAAAAAAAAAAG6j2CUvT3+cVp8v0XFd3T/wDf6/6mZvAie3Xur93Vzx/42P8Axq0vevV7+yZz0/2PPcXP/ktv/wByfgnk1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfL7cr9kO6v/xdB9n9UgH43fZA5b9g/gMTbo91z+Q/8PP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/ALBP8cnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAHrZmHi7DDy8DNsW8rCzsa/h5eNdj6rWRi5NqdnIsXY/863dtTnbnH78ZVo8b0rkpfHesWpetqXrPytW0TW1Z+5MTMT9x7tbYz6exg29XLfBs6ubFsa+bHPlyYc+C9cuLLS30Xx5K1vWfotESrrPa19o2V2k93fN9Lg4d21wbqDl5XPeEZVbfpsXcLeXqZu1xbHilIxt63dZOdr7NutKSpZxY1p6qfoq16+K/SV+k+rd3DjpaNHkL239K0x2rNM8+fLSvpERXHmtfHWPtV+mPVuJe7+9oPB7QPs9dMcntbFL9U9Ia+DpPqfBFvNlx7PF451uP2MveZta+7xmHV28l+8xOTPb5T3rGsNjNOAAAAAABzfprwHf9UufcQ6d8XxL2bvuY8g1fH9dYsWbl+dL2yy7WNXInbt0lL4GLbuTycifikbVi1cu3JRhCUqc3jdDPym/p8dq0tfPubGLXx1rWbT5sl4r5piO8+WkTNrT8orEzMxEd3WOtOrOJ6F6T6h6w53YxavE9OcRvcvu5cuSmKs49LXyZoxVveYr8XPelcGGvfvfLkpSsTa0RNl92adtnG+1Dt16b9GOPYlmxd47ocS7yLIt+ic8/lOxh+aPIsmd+FPN+3Lc5WdTFrKU/RjfDtxl6Y0WR9HdN63SnT3HcNr0is6+Ck7Fo7d8m1kj4mxaZj5xOa1/L3me1e0RPZpRe0h40c14++MXWniTzGxky05jls+Ph8NvPWurwWnb6j4fDXFb0xXjjtfV+PFa18+bz3tHmmWUbtDBYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/wBW/A/ejdRmkbF2YAAAAAAAAAAAAAAAADdF7Bifp7/uHU/6XGt3H/8Ae4Vf6GZPAr+r3T+7r5v8NJ/xK1/etR39krqP079ua4yf/E2o7/vp+yejUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/wDxdB9n9UgH43fZA5b9g/gMTbo91z+Q/wDDz9Fy/wB999qBYjWIAAAAAAAAAAAAAAAAAMv+wT/HJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAAAABpB9un2d17ju1jK6jcY1v0rqH0PuS5Pg/RrNJ5+141Wssfd6udysZeMLX4mbm72UY+iXxMPz6q08xrhTxw6Q/DF0vfkdbF5+Q4SfqnH5Y75Mut3mubFM/RTHS+TPPb170/PhZ57rT2i48GvHfB0bzm78Do/xQpHB7Xx8k11dDm+1cvGb9axMd9nbz6utxdZtFo8mx2iIn66IEtaVpWtK08Vp8q0r9dK/gqgk2vPn8gAAAAAEm/wB3g7L7XOeoXJO6/m2o+Noensr+h6eUzLPi1lcqzcemPnbWxC9H0ZmJi6zK2eFW5CNyFjPhH9FG9bpSklvZ86Nje5DZ6q3cPfBx/mwcf56+ltq9fLfLWJ9L1rivlp3iJiLx9uPSkX3wXtKZOl+kOF8AumOQjHyvWEYuW6wnXyd8mDgNXN8bV0Mtsc+bX2NjewaOz5LTS2XUtP1tsd57zKUwmuCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADc57B2vj2gHCKefHq4/uqfw/osSvj/MzH4Fz/s90vu6+aP8A1Z/xK2/erR39knqef7Hl+Mn97Yj/AKSn+J6tSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXy+3K/ZDur/wDF0H2f1SAfjd9kDlv2D+AxNuj3XP5D/wAPP0XL/fffagWI1iAAAAAAAAAAAAAAAAADL/sE/wAcnty/Gzwn7Q6927oL+rHpz9NtH+MY0ePax/I4+Mn6gOpvvTtrNlZU0jgAAAAAAAAAAAAAAAAAAAAAAAAAAAAHzd1p9dyDT7XQ7fFtZuq3WuzdVssO9T1WsrA2ONdxMzHuUpWlawvY965bl4rSviVfFaV+b15sOPYw5cGWsXxZsd8WSlvWL48lZpes/ctWZifz3N43kNziOR0OV47PfV3+M3Nbf0tnHPbJr7enmpsa+ak+va2LNjpeveJjvWO8TCt29pd2pbPtF7suo/T6WNdhxXc7fK5dwjMra+Hi5Og5BcjtY4mDWkYxnY0l/Onpa1p6q0nhSpOUpUrWtdHiT0tl6S6r5Lj5rMaubLbb0r9u1LYNifi+TH6R3rgtknD3/wCB85lucexT496PtC+AHRnV9c2O3O8bx+Dp7qjW+J59jBy3D0nQtsbX10zXLymLVryfafLE12YmtYr2hgE6ElmAAAA7C6T9NuRdYOpHCumXFMS/m77mvItZoMG1j2p352652VbtX8uVu3GUvgYOPW7mZE/Hpt2LFy5OtIRlWn0OK47Y5fkdLjdWlr593Yxa9IrE2mPiXitrzEd58uOsze0/RWszPpDqPX3WfD+HfRnU3W/P7GLW4npnh97ltrJmyVxVvGpgvkxa9b2mI+LtZox62GvfvfLlpSsTa0RNmN2ldvHGe1rt/wCnHRjjGHYxrfFePYUNzes0jKufyTMt/TuRZ0rtPMrsMndZOdeseqUqW7NyFu36YRjGlkvSfT2t0vwHHcNrUrWNXXpGa1e39M2bx59i8z85i2a2Sa+vpWYiO0NJv2gfGDm/Hbxb6z8Suc2cufJz3L7NuNx5JtEanC6151uH1Yxz2jHbDxuHVx5e1azfJW17d7TMskHY2GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMz3mb9f3t0/Flyv7QatDr2lPx+6e/Sza/jGNsi+5L+xN4x/q34H70bqM0jYuzAAAAAAAAAAAAAAAAAblvYRSrT2gPAqU/52k3Ma/weMev9DMXgZPbr3R+7hyx/6v8AiVv+9Tjv7I/Vn3OU4yf4aP8AGsAk9mpOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/+LoPs/qkA/G77IHLfsH8BibdHuufyH/h5+i5f7777UCxGsQAAAAAAAAAAAAAAAAAZf9gn+OT25fjZ4T9ode7d0F/Vj05+m2j/ABjGjx7WP5HHxk/UB1N96dtZsrKmkcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj8+8Adn0+tXbnr+u/FdX9I5r0Rv28jaSxLFbuw2fC9hkyw8nBjbhSU7lvBztnHbXpxhWVqxiTnKdLUJUYD8e+kZ5rp3Hzurj827wlotlmte+TLp5LeS1IiO8zGO+T4tp7elaT3ntC3D3SftE18NPGTb8Kue3vg9M+J+K+HRjYyxj1NLqXUwRs4Nm17zFaX2tXRnj8dZtFcmXYrEVm9olBtQjbRAAAACUb7u12XQ5Py3k3dzzfT1uaniX0njfTP6ZYlS3f3+RCmNtN7ieulLeVYxsK7tdTOVKXIWsvz49N2FKxk77PfRsbO3s9W7uHvi1PNrcZ56+ls9o8uXPTv6WitJy4pn1itvtTCjD3w3tKX4Pp/g/Z86Y5Lyb/UPwea63+pstZvi4nDb4+jxWz5Z8+DLn2aaHIViZpbJr/wBljvMTMLS7a6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGZ7zN+v726fiy5X9oNWh17Sn4/dPfpZtfxjG2Rfcl/Ym8Y/1b8D96N1GaRsXZgAAAAAAAAAAAAAAAANyHsJ5en2gnTz6/0Wp3NPl9/wDQWfr/AM7MHgdP+z/j/u4c3/6VcfvT47+yN1h9zkONn/xsn/KsCE+GpGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr5fblfsh3V/wDi6D7P6pAPxu+yBy37B/AYm3R7rn8h/wCHn6Ll/vvvtQLEaxAAAAAAAAAAAAAAAAABl/2Cf45Pbl+NnhP2h17t3QX9WPTn6baP8Yxo8e1j+Rx8ZP1AdTfenbWbKyppHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOO8v4tp+b8V5Hw7f4tvM0vKNJtNDtMa7CM43cHbYV7ByaUpKlaUnS1flK3Px6oTpGca0lGlacfb1cO7q7GnsVi+HawZcGWsxExNMtLY7ek/T2tPafon1h9jp7neR6Y53huouJz31uT4Pk9HltDNS1qzTa4/ZxbWCZmsxM1nJirF6/K1JtW0TEzCtL78O2bd9pvc/1Q6RbTFuWddruQZW14tkUtz+jZXF95WO40kcbIrStvJrha7PxcLKnanP4eVYu27npuRlGlbvXXTWfpTqbk+Iy1mMePYtl1bdp8ttXP/TsMVt8rTTHetLTEz2tWYn1iW6v7KvjZxfj/wCB3Q3iHoZ6Zdzd4jBo87i89fj4Od4vzcdyk5sUdr4Y2dzUz7WCt618+vlx3p3paJnD11FIkAB2h0W6Vck639VeCdKeJYeRm73nHI9bo8W3i2pXrtmxk34/T870RjLzb12BHJz71axrGNnHuSl8qVfT4bitnm+V0OK1KWvn3tnHgrFY801i1v6Zft9rHji2S32orMz6Oj+JXXnC+GPQfVXXvUGxh1uK6Y4bc5TPfPeMePJlw4rfUmr5pmva+5t2w6uKImJtkzVrHrMLMvtg6DcY7aOhfTno1xXDsYuFw7jmBh59yxHxTP3tyzHI32ylKv6KVdht7ubl/OviNL3phSMKUjSyfpngtXpvg+O4fVpWtNPXx0yTX/rmeY82fJ+yZpvf7nm9O0ejSY8cfFbnPGzxT6y8SOe2MufZ6j5nb2dWmWZmdTiqZJw8TpVr8qxqcdj1tee3racXmtNrTMz36+8xMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhme8zfr+9un4suV/aDVode0p+P3T36WbX8YxtkX3Jf2JvGP9W/A/ejdRmkbF2YAAAAAAAAAAAAAAAADcV7CyXj2g3Tan/S124p9f4LVuv8AL9TL/gfPbr/jfu4s8fvQro96XXv7IvWk/wBju8bPy/8AlL/tfa/XWByfLUeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8vtyv2Q7q/8AxdB9n9UgH43fZA5b9g/gMTbo91z+Q/8ADz9Fy/3332oFiNYgAAAAAAAAAAAAAAAAAy/7BP8AHJ7cvxs8J+0Ovdu6C/qx6c/TbR/jGNHj2sfyOPjJ+oDqb707azZWVNI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGv94g7P7nUXpBxnuf4lq6XuRdKJ2dNzOWLZ9WRlcO2mZPHx79bVmPxcm/i7nY4PxLtaXK2MG1OsvRZtylGOPtB9IzyPEa3U2pi77PFTXDueWO9r6eS81rby1jva1c2WnefXy0j17VjvF0nufPaIp0d4ic34HdQb3w+H6+rl5HpqufL5cWDqTR1ozZsUZMk/Dw4c/G6e15ccTSMm1krEea94iYW6GrZUAASr/d1OzKGz2vK+7zm+m+JiaumTxXpbXNs19EthKUcfb8j18q0pS58C1TbaK56qzhGc5+IUnGM6Sl9nno6MuXb6t3cPemLzanF+evpOSe1c2zjn6YrHxcE/OO8z6d4UM++K9pG2jocB7PPTHJeTY35w8911GtkjzRp1icvHcLuViZmnxMn1BytO0Vtata97TSZiZdKWbXtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQy/eZf1/e3X8WfK/8A3/qkOvaU/H7p79LNr+MY2yN7kz7E3jF+rbgfvTvIzaNi7IAAAAAAAAAAAAAAAABuE9hjXx7Qjpf+/h7in/3vSv8AQy74IfZA4v7tM3/q9/8AErs96RHf2Q+ufubPHT/5aY/x/wCJYKJ9tRoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA09uT0X6sXe/Dn3KcLp3zTacd5Rg6XO0u61PGdzs9ZmWbGrxMC7G3nYOFfxvjW8jDvxnYrdpejGNJ1hSEoyrBbxu4blZ6539qnH7mXX2qYcmHNi1s2TFeIxUpMRelLV80WpaPL379o79u0w2sfddeJXQOP2Vek+C2esemtHmOD2+T1eT4zf5vjdHe1smXe2NvHa+rtbOLP8K+HZxTXLFJx2mZrFvNWYjTn9yXqr+5n1B/Izkf9msP/gVyn5W7/wC49j/NrGf5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/8AuPY/zZ/NA6D/ADbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf8AZp+BXKflbv8A7j2P82fzQOg/zbdI/wB8nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/AHHsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P82fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/wDcex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/wA2fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/wCzT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/ALj2P82fzQOg/wA23SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/AGafgVyn5W7/AO49j/Nn80DoP823SP8AfJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/wBx7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/+49j/Nn80DoP823SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f8A3Hsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P8ANn80DoP823SP98nDfy0+5L1V/cz6g/kZyP8As0/ArlPyt3/3Hsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/wC49j/Nn80DoP8ANt0j/fJw38tZrezu6E9ZN13k9A5YfTDnsbGp6h8b3ezzMriW+xMHX6zU7TG2GblZubkYFvGxbVvGxrsoyv3YUnOlLcPVOVI17p4e8HzGbrHgZpxm95cPI62fLe2pnpjx4sOWuS973tjitYitZ9bTHefSPX0Rn9sLxU8OOM9nDxYjY646Utl5Do/meM0dbB1BxWfa293f0s2prYNbWw7d82fJfNmxxNcVLTWsze3asTKyBWKtM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwfqZwHRdUun/MenfJcWzmaTmXHdtx7PtX7cbsIW9nhXsWORGE6Sj8bFuXYZNifitbd61bnH9FGjg8noYOU4/c47ZpW+Dc182veLRExEZaWpFu0/TSZi1Z+i0RPzh2jorqzleherunOsOFz5Nfk+m+Z4/l9TJivbHa19Hax7E4bWrMT8PYpS2DLXvEWx5L1n0mVZh3cdv3IO2DuF6m9GeQ4l7FnxXkmdDUSuxrT6VxzOuV2HHcqNz9Rdle0uVg3LtYV8RuylGVIypWNK2OrOA2OmeoOT4fYpas6uzkjDMxP12vefia9on5T5sNsczMfTPae0+jdq9n3xc4jxx8IOiPEniNjHnpz/AAurbka45j+kczq1+pOYwTT8VSMXJYNqlItHrStbRNqzFpxudcZmdt9B+kHJevfV/p90i4jh5Gbu+c8k1+mtW8aNJ3rGFcu0u7XPpGtJUrDW6u3mbC55jKnw8afmlfqfW4PiNnneX0OI1KWvn3tnHhiK+s1pM98uT6Y7Y8UXyT6T6VY/8VPEPhfCjw86u8QuoNjDrcX0twu3yWS+e01x5dmlJx6GpMxMTFt3eya+pTtMT581fWPms0u3Xolxft26L9Pej3EcLGw9Xwvjet1l6WLD0QzttHGtz3W1nSvzrd2m1ll59z6o0nkSpCMI0pGllHT3C6vT3DcfxGpStMWnrY8VvLHaMmaKxObLP3cuWb5J+jvae0RHo0k/GLxN53xh8S+sPEXqHaz7O91NzW7vY4z2i1tXj7ZrV43Qr29Ph6OhXX1KfOZphrNrWt3tPdb7TGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIZ7yT0p6kco6s9vnLuL8H5VyXj2JwTk+pzdpx/QbXc4uDsb26wb9nEzbuuxMmGLdvWce7dtRvyt1nCFaxpWnzRJ9o3iuR2uW6f29bR2tnXpobOG+XX18uamPJOalq0vbHW0Um1a2mIt27xHdsMe5g696M4Pw/wDF3p/nOqOB4XmM/VXB7+ro8vy2hxuxt6ePjNrHl2NbHuZ8Ns+PFky0x5LYovFbWiJmJRm/uS9Vf3M+oP5Gcj/s1Gz8CuU/K3f/AHHsf5tdl/NA6D/Nt0j/AHycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/8Acex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/zZ/NA6D/Nt0j/fJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/ANx7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/+49j/ADZ/NA6D/Nt0j/fJw38tPuS9Vf3M+oP5Gcj/ALNPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf9mn4Fcp+Vu/8AuPY/zZ/NA6D/ADbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/9x7H+bP5oHQf5tukf75OG/lp9yXqr+5n1B/Izkf8AZp+BXKflbv8A7j2P82fzQOg/zbdI/wB8nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/AHHsf5s/mgdB/m26R/vk4b+Wn3Jeqv7mfUH8jOR/2afgVyn5W7/7j2P82fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/7NPwK5T8rd/wDcex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/uPY/wA2fzQOg/zbdI/3ycN/LT7kvVX9zPqD+RnI/wCzT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/Zp+BXKflbv/ALj2P82fzQOg/wA23SP98nDfy0+5L1V/cz6g/kZyP+zT8CuU/K3f/cex/mz+aB0H+bbpH++Thv5afcl6q/uZ9QfyM5H/AGafgVyn5W7/AO49j/Nn80DoP823SP8AfJw38tPuS9Vf3M+oP5Gcj/s0/ArlPyt3/wBx7H+bP5oHQf5tukf75OG/lrcX7Dboz1Ys99vB+S5nTvmmr4/xvV7XN3O523Gd1q9Zh2ZwtY0IXM7OwrGL8e5dyLfox6XfjThSdyMKwtzrTL/gjw/Kx1zo7N+P3MevrYst82bLrZsWKlZiKx3vela+aZtHavfzTHeYjtE9q5/eieJHQOT2VuqOF1+semt7l+Z3+P1eN43Q5vjd7e2ctbZM1rU1dXZy5/hUx4r+fNOP4VbTStrRa9YmeYnU1TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx9px3j+8rbrutFp9xWzStLNdprMLYVtUr5rWluuXYvVhSta1rWkfH11/C9OXXwZ+3xsGHN5fl8XHTJ2/O89Z7frPo6PMctxcXjjOU5HjoyzE5I0d3Z1IyTHbtN418uPzzHaO3m79u0Pkfc+4F+0jiH5Nab+pPV9QaP9pan7mw/wCQ+h+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Un3PuBftI4h+TWm/qR9QaP9pan7mw/5B+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Un3PuBftI4h+TWm/qR9QaP9pan7mw/5B+G7qv80/UP92uS/lJ9z7gX7SOIfk1pv6kfUGj/AGlqfubD/kH4buq/zT9Q/wB2uS/lJ9z7gX7SOIfk1pv6kfUGj/aWp+5sP+Qfhu6r/NP1D/drkv5Sfc+4F+0jiH5Nab+pH1Bo/wBpan7mw/5B+G7qv80/UP8Adrkv5Sfc+4F+0jiH5Nab+pH1Bo/2lqfubD/kH4buq/zT9Q/3a5L+Un3PuBftI4h+TWm/qR9QaP8AaWp+5sP+Qfhu6r/NP1D/AHa5L+Uvo63ivF9Nfrlafjeh1WTWNYVyNbp9fg36wr5pWNbuLj2rlY1pWtKxrLxXzX5fN7MerrYbebDr4MVu3bzY8OOlu32u9axPZw93nec5LFGDkeZ5XfwxaLRh3eR29rFFo+Vox582SkWjtHae3eO3zfee98oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFk94y7QLm84zwvu04fqazy+MfB4l1Jnh2fr1GTduW9Vv9hOkfVO5bzbuq0tuVJeI2awpWHiPqRf8AaH6RnPraXVeni731vLqclNI/6zaZjFsZJ+czF5xYY9fSO0dvpXte5w9oinF831L7P/UXIRXW5z4vUHRddjJ8uRwY633+J1KzMRSmTWx7/J3jt3tli0+bvPZECRHbDyWZ7un2YwlHlfd/zfTUnStMrifSyudYpWkJwu0x91yXXT8UlS7Gtra6G5WUpQrC5c8W/V4nSVns9dGxP1V1dvYe/wCK1OL89flMT5c2zjnt6THbLgn17dpn079pigT3xftJWieA9nfpjkpr2nB1B139S5fW9bY5zcbwm5XvMTS0ZNDlaRWIt5qU727d6zLMSsUBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPnbLT6nc2aY241eu2uPGXrjY2WDjZ1mM6UrSk6Wsq1dhSXitaeqkfPitaefFavXkw4s0eXNix5a/Py5KVvHf7fa0TDmaXI8hxuWc3Hb25oZprNZy6Wzn1cs1mYmazkwXx3mszETMTPbvET29HwfufcC/aRxD8mtN/Uno+oNH+0tT9zYf8AIfV/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KT7n3Av2kcQ/JrTf1I+oNH+0tT9zYf8g/Dd1X+afqH+7XJfyk+59wL9pHEPya039SPqDR/tLU/c2H/IPw3dV/mn6h/u1yX8pPufcC/aRxD8mtN/Uj6g0f7S1P3Nh/yD8N3Vf5p+of7tcl/KX19Xx3j+jrclpdFp9PW9SlL1dXrMLX1u0p9VLlcSxZrOlPvUl58Pbi19fB3nDgw4Zn5zixUx9/z/ACVjv+u+fvcxy3KRSOT5TkeRjH3nHG9vbO3GOZ+c0jYy5PJ37z38vZ9h7nzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHU/XPpNx7rn0i6g9J+UYePm6jnHGNppJwyoeu1j5mRjTrrM/0/fua7ZQxM+15pWlLuPCsoypSsa/K5zidfnOI5Ditqlb4d3Wy4Zi0d4re1Z+Fk7d49ceSKZI+jvWPSXfvC3r/mPC3xC6R6/4LYza3I9L85o8nW2C3lyZtbFmrG9qd/7Dd0rZ9TJ27T5M1u0xPaYrobPYt1gu95Me0qvFeQx30uoV7Qxyp6zIj6+HWNpcrXldLtbFMb6FPj9v804X/PwazlGx/ha0tK8o6H5eesI6TnV2PjzyE68WnHbvOnXLP+q4ny+XyTrx8WLfie/1vz9G41k9qXw6x+zjPtA/g9w9uJr0hi5a2Cu7ht5eo8ujSI4CccZZzfVNeXvGlbF/tkUicv4iJusWug3R7i/QLpDwDpHxDCxsLTcI41q9NSmLb+HDNz8fFtU2u1nH71/a7H6TsMjxSMa3smfpjGPiNLDOC4jW4HiNDidSlaYdLWxYfrY7RfJWkfFyzH9llyebJb6O9p7RDTp8VvEXnPFjxD6t8QeodnNs8l1PzW9yU/Hv5762pmz3nQ0K2/3LQ0/gaeH1mYxYaRNrT6z24+sx6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA43/cbxD+6CnLP7leN/3VRs1x48m/MPWf3QRsVh8Otim5+i/mjSzW3+grbpk+isP0Pp8fJxvqPU+qPqv6l1vqqI8sbPwMX1RFe3by/G8vxO3b07ebt29Pk+z+GPqH8CJ6f/AAe5n8AZyfGnhPwU3vwInLFvPGWeN+P9Rzki313n+D5vN9d37+rkjkvjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.cs b/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.cs new file mode 100644 index 0000000..fa7f3d4 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250828111857_Modified_UpdatedAt_And_VerifiedAt_To_Nullable.cs @@ -0,0 +1,237 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Modified_UpdatedAt_And_VerifiedAt_To_Nullable : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "VerifiedAt", + table: "DocumentAttachments", + type: "datetime(6)", + nullable: true, + oldClrType: typeof(DateTime), + oldType: "datetime(6)"); + + migrationBuilder.AlterColumn( + name: "UpdatedAt", + table: "DocumentAttachments", + type: "datetime(6)", + nullable: true, + oldClrType: typeof(DateTime), + oldType: "datetime(6)"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8988)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8981)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9059)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9042)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9051)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9038)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9028)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9072)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9034)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9068)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9063)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9055)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9046)); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "VerifiedAt", + table: "DocumentAttachments", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + oldClrType: typeof(DateTime), + oldType: "datetime(6)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "UpdatedAt", + table: "DocumentAttachments", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + oldClrType: typeof(DateTime), + oldType: "datetime(6)", + oldNullable: true); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1227)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1217)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1308)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1293)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1300)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1289)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1275)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1391)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1284)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1388)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1384)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1305)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 11, 44, 468, DateTimeKind.Utc).AddTicks(1297)); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 120c847..af8ae76 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -848,6 +848,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("IsActive") .HasColumnType("tinyint(1)"); + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + b.Property("IsVerified") .HasColumnType("tinyint(1)"); @@ -858,7 +861,7 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("TenantId") .HasColumnType("char(36)"); - b.Property("UpdatedAt") + b.Property("UpdatedAt") .HasColumnType("datetime(6)"); b.Property("UpdatedById") @@ -870,7 +873,7 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("UploadedById") .HasColumnType("char(36)"); - b.Property("VerifiedAt") + b.Property("VerifiedAt") .HasColumnType("datetime(6)"); b.Property("VerifiedById") @@ -928,7 +931,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7887), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8981), Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), Name = "Project Documents", @@ -937,7 +940,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7895), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8988), Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), Name = "Employee Documents", @@ -1023,7 +1026,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7958), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9028), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1038,7 +1041,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7966), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9034), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1053,7 +1056,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7971), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9038), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1068,7 +1071,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7975), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9042), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1083,7 +1086,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7980), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9046), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1098,7 +1101,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7984), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9051), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1112,7 +1115,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7991), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9055), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1126,7 +1129,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(7995), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9059), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1140,7 +1143,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8000), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9063), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1154,7 +1157,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8004), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9068), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1168,7 +1171,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", - CreatedAt = new DateTime(2025, 8, 28, 9, 22, 46, 902, DateTimeKind.Utc).AddTicks(8008), + CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9072), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, diff --git a/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs index 8f11dd3..3b228c0 100644 --- a/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs +++ b/Marco.Pms.Model/DocumentManager/DocumentAttachment.cs @@ -11,19 +11,20 @@ namespace Marco.Pms.Model.DocumentManager public string Name { get; set; } = string.Empty; public string? DocumentId { get; set; } public string Description { get; set; } = string.Empty; + public bool IsCurrentVersion { get; set; } = true; public DateTime UploadedAt { get; set; } public Guid UploadedById { get; set; } // References the employee who uploaded the document [ValidateNever] [ForeignKey("UploadedById")] public Employee? UploadedBy { get; set; } - public DateTime UpdatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } public Guid? UpdatedById { get; set; } // References the employee who updates the document [ValidateNever] [ForeignKey("UpdatedById")] public Employee? UpdatedBy { get; set; } - public DateTime VerifiedAt { get; set; } + public DateTime? VerifiedAt { get; set; } public bool? IsVerified { get; set; } public Guid? VerifiedById { get; set; } // Associates the document with a specific employee, if applicable diff --git a/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs index acf2003..64ef351 100644 --- a/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs +++ b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs @@ -7,7 +7,7 @@ namespace Marco.Pms.Model.Dtos.DocumentManager public required string Name { get; set; } public string? DocumentId { get; set; } public required string Description { get; set; } - public Guid EntityId { get; set; } + public required Guid EntityId { get; set; } public required Guid DocumentTypeId { get; set; } // References the type of the document public required FileUploadModel Attachment { get; set; } public List? Tags { get; set; } diff --git a/Marco.Pms.Model/Filters/DocumentFilter.cs b/Marco.Pms.Model/Filters/DocumentFilter.cs index 4b5538e..f2c79be 100644 --- a/Marco.Pms.Model/Filters/DocumentFilter.cs +++ b/Marco.Pms.Model/Filters/DocumentFilter.cs @@ -3,8 +3,9 @@ public class DocumentFilter { public List? UploadedByIds { get; set; } + public List? DocumentCategoryIds { get; set; } public List? DocumentTypeIds { get; set; } - public bool IsActive { get; set; } = true; + public List? DocumentTagIds { get; set; } public bool IsUploadedAt { get; set; } = true; public bool? IsVerified { get; set; } public DateTime? StartDate { get; set; } diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs index f900959..b27358c 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs @@ -9,9 +9,11 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public string? DocumentId { get; set; } public string? Description { get; set; } public DateTime UploadedAt { get; set; } + public Guid? ParentAttachmentId { get; set; } + public int Version { get; set; } + public bool IsActive { get; set; } + public bool? IsVerified { get; set; } public BasicEmployeeVM? UploadedBy { get; set; } public DocumentTypeVM? DocumentType { get; set; } - public bool IsActive { get; set; } - public bool IsVerified { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 57604f9..3e3b80b 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -48,60 +48,181 @@ namespace Marco.Pms.Services.Controllers _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); tenantId = userHelper.GetTenantId(); } - // GET: api/ - [HttpGet("list/{entityTypeId}")] - public async Task Get(Guid entityTypeId, [FromQuery] Guid entityId, [FromQuery] string filter, - [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) + + + /// + /// Fetch documents for a given entity (Project/Employee) with filtering, searching, and pagination. + /// + [HttpGet("list/{entityTypeId}/entity/{entityId}")] + public async Task GetDocumentList(Guid entityTypeId, Guid entityId, [FromQuery] string? filter, [FromQuery] string? searchString, + [FromQuery] bool isActive = true, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { using var scope = _serviceScope.CreateScope(); await using var _context = await _dbContextFactory.CreateDbContextAsync(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var _permission = scope.ServiceProvider.GetRequiredService(); - var isViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); - if (!isViewPermission) + try { - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document", 403)); - } - if (ProjectEntity != entityTypeId && EmployeeEntity != entityTypeId) - { - return NotFound(ApiResponse.ErrorResponse("Entity type not found", "Entity Type not found in database", 404)); - } - if (ProjectEntity == entityTypeId) - { - var isHasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, entityId); - if (!isHasProjectPermission) + _logger.LogInfo("Fetching documents for EntityTypeId: {EntityTypeId}, EntityId: {EntityId}", entityTypeId, entityId); + + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Check global permission + var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + if (!hasViewPermission && loggedInEmployee.Id != entityId) { - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document to this project", 403)); + _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to view documents", 403)); } - } - else if (EmployeeEntity == entityTypeId) - { - var isEmployeeExists = await _context.Employees.AnyAsync(e => e.Id == entityId && e.TenantId == tenantId); - if (!isEmployeeExists) + + // Validate entity type + if (ProjectEntity != entityTypeId && EmployeeEntity != entityTypeId) { - return NotFound(ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404)); + _logger.LogWarning("Invalid EntityTypeId: {EntityTypeId}", entityTypeId); + return NotFound(ApiResponse.ErrorResponse("Entity type not found", "Entity Type not found in database", 404)); } + + // Project permission check + if (ProjectEntity == entityTypeId) + { + var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, entityId); + if (!hasProjectPermission) + { + _logger.LogWarning("Employee {EmployeeId} does not have project access for ProjectId {ProjectId}", loggedInEmployee.Id, entityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to access project documents", 403)); + } + } + // Employee validation + else if (EmployeeEntity == entityTypeId) + { + var isEmployeeExists = await _context.Employees + .AnyAsync(e => e.Id == entityId && e.TenantId == tenantId); + + if (!isEmployeeExists) + { + _logger.LogWarning("Employee {EmployeeId} not found for Tenant {TenantId}", entityId, tenantId); + return NotFound(ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404)); + } + } + + // Base Query (with includes to avoid lazy loading) + IQueryable documentQuery = _context.DocumentAttachments + .AsNoTracking() // Optimization: Read-only query + .Include(da => da.UploadedBy) + .ThenInclude(e => e!.JobRole) + .Include(da => da.DocumentType!) + .ThenInclude(dt => dt.DocumentCategory) + .Where(da => da.DocumentType != null && + da.DocumentType.DocumentCategory != null && + da.DocumentType.DocumentCategory.EntityTypeId == entityTypeId && + da.IsActive == isActive && + da.TenantId == tenantId); + + // Apply filter if provided + var documentFilter = TryDeserializeFilter(filter); + if (documentFilter != null) + { + _logger.LogInfo("Applying document filters for EntityId {EntityId}", entityId); + + if (documentFilter.IsVerified != null) + documentQuery = documentQuery.Where(da => da.IsVerified == documentFilter.IsVerified); + + if (documentFilter.DocumentCategoryIds?.Any() ?? false) + documentQuery = documentQuery.Where(da => documentFilter.DocumentCategoryIds.Contains(da.DocumentType!.DocumentCategoryId)); + + if (documentFilter.DocumentTypeIds?.Any() ?? false) + documentQuery = documentQuery.Where(da => documentFilter.DocumentTypeIds.Contains(da.DocumentTypeId)); + + if (documentFilter.DocumentTagIds?.Any() ?? false) + { + var filteredIds = await _context.AttachmentTagMappings + .AsNoTracking() + .Where(at => at.DocumentTag != null && documentFilter.DocumentTagIds.Contains(at.DocumentTag.Id) && at.TenantId == tenantId) + .Select(at => at.AttachmentId) + .ToListAsync(); + + documentQuery = documentQuery.Where(da => filteredIds.Contains(da.Id)); + } + + if (documentFilter.UploadedByIds?.Any() ?? false) + documentQuery = documentQuery.Where(da => documentFilter.UploadedByIds.Contains(da.UploadedById)); + + // Date Range Filtering (Uploaded vs Verified date) + if (documentFilter.StartDate != null && documentFilter.EndDate != null) + { + if (documentFilter.IsUploadedAt) + { + documentQuery = documentQuery.Where(da => + da.UpdatedAt.HasValue && + da.UpdatedAt.Value.Date >= documentFilter.StartDate.Value.Date && + da.UpdatedAt.Value.Date <= documentFilter.EndDate.Value.Date); + } + else + { + documentQuery = documentQuery.Where(da => + da.VerifiedAt.HasValue && + da.VerifiedAt.Value.Date >= documentFilter.StartDate.Value.Date && + da.VerifiedAt.Value.Date <= documentFilter.EndDate.Value.Date); + } + } + else + { + documentQuery = documentQuery.Where(da => da.IsCurrentVersion); + } + } + else + { + // Default: only latest version + documentQuery = documentQuery.Where(da => da.IsCurrentVersion); + } + + // Apply search filter + if (!string.IsNullOrWhiteSpace(searchString)) + { + documentQuery = documentQuery.Where(da => + da.Name.Contains(searchString) || + (da.DocumentId != null && da.DocumentId.Contains(searchString)) + ); + } + + // Apply pagination & ordering + var documents = await documentQuery + .OrderByDescending(t => t.UploadedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(); + + var documentIds = documents.Select(da => da.Id).ToList(); + + // Get versions for the selected documents + var versions = await _context.AttachmentVersionMappings + .AsNoTracking() + .Where(av => documentIds.Contains(av.ChildAttachmentId) && av.TenantId == tenantId) + .ToListAsync(); + + // Map to ViewModel + var response = documents.Select(doc => + { + var version = versions.FirstOrDefault(v => v.ChildAttachmentId == doc.Id); + var vm = _mapper.Map(doc); + vm.ParentAttachmentId = version?.ParentAttachmentId; + vm.Version = version?.Version ?? 1; + return vm; + }).ToList(); + + _logger.LogInfo("Fetched {Count} documents for EntityId {EntityId}", response.Count, entityId); + + return Ok(ApiResponse.SuccessResponse(response, "Document list fetched successfully", 200)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error fetching documents for EntityId {EntityId}", entityId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", ex.Message, 500)); } - - var documentQuery = _context.DocumentAttachments - .Include(da => da.DocumentType) - .ThenInclude(dt => dt!.DocumentCategory) - .Where(da => da.DocumentType != null && - da.DocumentType.DocumentCategory != null && - da.DocumentType.DocumentCategory.EntityTypeId == entityTypeId); - - var documents = await documentQuery - .OrderByDescending(t => t.UploadedAt) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize) - .ToListAsync(); - - return Ok(ApiResponse.SuccessResponse(documents, "Document list fetched successfully", 200)); } + // GET api//5 [HttpGet("{id}")] public async Task Get(int id) @@ -111,194 +232,6 @@ namespace Marco.Pms.Services.Controllers //string preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); } - // POST api/ - [HttpPost] - public async Task Post([FromBody] DocumentAttachmentDto model) - { - using var scope = _serviceScope.CreateScope(); - await using var _context = await _dbContextFactory.CreateDbContextAsync(); - - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - var _permission = scope.ServiceProvider.GetRequiredService(); - var isUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); - - if (!isUploadPermission || loggedInEmployee.Id != model.EntityId) - { - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload document", 403)); - } - - var documentType = await _context.DocumentTypeMasters - .Include(dt => dt.DocumentCategory) - .FirstOrDefaultAsync(dt => dt.Id == model.DocumentTypeId && dt.TenantId == tenantId && dt.DocumentCategory != null); - - if (documentType == null) - { - return NotFound(ApiResponse.ErrorResponse("Document Type not found in database", "Document Type not found in database", 404)); - } - if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) - { - return BadRequest(ApiResponse.ErrorResponse("Document ID is missing", "User must provide the document ID fro this document", 400)); - } - if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId)) - { - bool isValid = Regex.IsMatch(model.DocumentId, documentType.RegexExpression ?? ""); - if (!isValid) - { - return BadRequest(ApiResponse.ErrorResponse("Invaid Document ID", "Provided document ID is not valid", 400)); - } - } - - var employeeExistTask = Task.Run(async () => - { - if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity) - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.Employees.AnyAsync(e => e.Id == model.EntityId && e.TenantId == tenantId); - } - return false; - }); - var projectExistTask = Task.Run(async () => - { - if (documentType.DocumentCategory!.EntityTypeId == ProjectEntity) - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.Projects.AnyAsync(p => p.Id == model.EntityId && p.TenantId == tenantId); - } - return false; - }); - - await Task.WhenAll(employeeExistTask, projectExistTask); - - var employeeExist = employeeExistTask.Result; - var projectExist = projectExistTask.Result; - if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity && !employeeExist) - { - return NotFound(ApiResponse.ErrorResponse("Employee Not Found", "Employee not found in database", 404)); - } - if (documentType.DocumentCategory.EntityTypeId == ProjectEntity && !projectExist) - { - return NotFound(ApiResponse.ErrorResponse("Project Not Found", "Project not found in database", 404)); - } - - var documentDetails = _mapper.Map(model); - documentDetails.UploadedAt = DateTime.UtcNow; - documentDetails.UploadedById = loggedInEmployee.Id; - documentDetails.TenantId = tenantId; - - var _s3Service = scope.ServiceProvider.GetRequiredService(); - var batchId = Guid.NewGuid(); - List documents = new List(); - if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) - { - return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", - $"File size exceeded. Maximum allowed is {documentType.MaxSizeAllowedInMB} MB.", 400)); - } - - - string base64 = model.Attachment.Base64Data?.Split(',').LastOrDefault() ?? ""; - if (string.IsNullOrWhiteSpace(base64)) - return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Image data missing", 400)); - - var fileType = _s3Service.GetContentTypeFromBase64(base64); - - var validContentType = documentType.AllowedContentType.Split(',').ToList(); - if (!validContentType.Contains(fileType)) - { - return BadRequest(ApiResponse.ErrorResponse("Unsupported file type.", - $"Unsupported file type. {fileType}", 400)); - } - - string? fileName = null; - string? objectKey = null; - if (documentType.DocumentCategory!.EntityTypeId == EmployeeEntity) - { - fileName = _s3Service.GenerateFileName(fileType, tenantId, "EmployeeDocuments"); - objectKey = $"tenant-{tenantId}/Employee/{model.EntityId}/EmployeeDocuments/{fileName}"; - } - else if (documentType.DocumentCategory!.EntityTypeId == ProjectEntity) - { - fileName = _s3Service.GenerateFileName(fileType, tenantId, "ProjectDocuments"); - objectKey = $"tenant-{tenantId}/project-{model.EntityId}/ProjectDocuments/{fileName}"; - } - if (!string.IsNullOrWhiteSpace(objectKey) && !string.IsNullOrWhiteSpace(fileName)) - { - - _ = Task.Run(async () => - { - var _s3UploadService = scope.ServiceProvider.GetRequiredService(); - var _threadLogger = scope.ServiceProvider.GetRequiredService(); - - await _s3UploadService.UploadFileAsync(base64, fileType, objectKey!); - - _threadLogger.LogInfo("File stored successfully {ObjectKey}", objectKey!); - }); - - Document document = new Document - { - BatchId = batchId, - UploadedById = loggedInEmployee.Id, - FileName = model.Attachment.FileName ?? fileName, - ContentType = model.Attachment.ContentType, - S3Key = objectKey, - FileSize = model.Attachment.FileSize, - UploadedAt = DateTime.UtcNow, - TenantId = tenantId - }; - _context.Documents.Add(document); - - documentDetails.DocumentDataId = document.Id; - } - - - - _context.DocumentAttachments.Add(documentDetails); - - if (model.Tags != null && model.Tags.Any()) - { - var names = model.Tags.Select(t => t.Name).ToList(); - var existingTags = await _context.DocumentTagMasters.Where(t => names.Contains(t.Name) && t.TenantId == tenantId).ToListAsync(); - List attachmentTagMappings = new List(); - foreach (var tag in model.Tags) - { - var existingTag = existingTags.FirstOrDefault(t => t.Name == tag.Name); - if (existingTag != null && tag.IsActive) - { - AttachmentTagMapping attachmentTagMapping = new AttachmentTagMapping - { - DocumentTagId = existingTag.Id, - AttachmentId = documentDetails.Id, - TenantId = tenantId - }; - attachmentTagMappings.Add(attachmentTagMapping); - } - else if (existingTag == null && tag.IsActive) - { - var newTag = new DocumentTagMaster - { - Id = Guid.NewGuid(), - Name = tag.Name, - Description = tag.Name, - TenantId = tenantId - }; - _context.DocumentTagMasters.Add(newTag); - AttachmentTagMapping attachmentTagMapping = new AttachmentTagMapping - { - DocumentTagId = newTag.Id, - AttachmentId = documentDetails.Id, - TenantId = tenantId - }; - attachmentTagMappings.Add(attachmentTagMapping); - } - } - _context.AttachmentTagMappings.AddRange(attachmentTagMappings); - } - - await _context.SaveChangesAsync(); - var response = _mapper.Map(documentDetails); - return Ok(ApiResponse.SuccessResponse(response, "Document Added Successfully", 200)); - } - /// /// Uploads a document attachment for an Employee or Project. /// Validates permissions, document type, entity existence, tags, and uploads to S3. @@ -345,9 +278,9 @@ namespace Marco.Pms.Services.Controllers return BadRequest(ApiResponse.ErrorResponse("Document ID missing", "User must provide the document ID for this document", 400)); } - if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId)) + if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId) && !string.IsNullOrWhiteSpace(documentType.RegexExpression)) { - if (!Regex.IsMatch(model.DocumentId, documentType.RegexExpression ?? "")) + if (!Regex.IsMatch(model.DocumentId, documentType.RegexExpression)) { logger.LogWarning("Invalid DocumentId format for DocumentTypeId: {DocumentTypeId}, Provided: {DocumentId}", documentType.Id, model.DocumentId); return BadRequest(ApiResponse.ErrorResponse("Invalid Document ID", "Provided document ID is not valid", 400)); @@ -443,6 +376,17 @@ namespace Marco.Pms.Services.Controllers dbContext.DocumentAttachments.Add(attachment); + //Process Versioning + + var versionMapping = new AttachmentVersionMapping + { + ParentAttachmentId = attachment.Id, + ChildAttachmentId = attachment.Id, + Version = 1, + TenantId = tenantId + }; + dbContext.AttachmentVersionMappings.Add(versionMapping); + // Process Tags if (model.Tags?.Any() == true) { @@ -487,6 +431,9 @@ namespace Marco.Pms.Services.Controllers var response = _mapper.Map(attachment); response.UploadedBy = _mapper.Map(loggedInEmployee); + response.ParentAttachmentId = versionMapping.ParentAttachmentId; + response.Version = versionMapping.Version; + return Ok(ApiResponse.SuccessResponse(response, "Document added successfully", 200)); } catch (Exception ex) -- 2.43.0 From d2af05b6a04b9b8f28b9fec912abeac2275ad513 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 11:29:04 +0530 Subject: [PATCH 20/63] Added the update document API --- .../DocumentManager/DocumentAttachmentDto.cs | 11 + .../Controllers/DocumentController.cs | 344 ++++++++++++++++-- 2 files changed, 331 insertions(+), 24 deletions(-) diff --git a/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs index 64ef351..72a047b 100644 --- a/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs +++ b/Marco.Pms.Model/Dtos/DocumentManager/DocumentAttachmentDto.cs @@ -12,4 +12,15 @@ namespace Marco.Pms.Model.Dtos.DocumentManager public required FileUploadModel Attachment { get; set; } public List? Tags { get; set; } } + + public class UpdateDocumentAttachmentDto + { + public required Guid Id { get; set; } + public required string Name { get; set; } + public string? DocumentId { get; set; } + public required string Description { get; set; } + public FileUploadModel? Attachment { get; set; } + public List? Tags { get; set; } + } } + diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 3e3b80b..b6da516 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -1,9 +1,11 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Filters; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.DocumentManager; @@ -34,6 +36,7 @@ namespace Marco.Pms.Services.Controllers private static readonly Guid ProjectEntity = Guid.Parse("c8fe7115-aa27-43bc-99f4-7b05fabe436e"); private static readonly Guid EmployeeEntity = Guid.Parse("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"); + private static readonly string Collection = "DocumentModificationLog"; public DocumentController(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScope, @@ -54,7 +57,7 @@ namespace Marco.Pms.Services.Controllers /// Fetch documents for a given entity (Project/Employee) with filtering, searching, and pagination. /// [HttpGet("list/{entityTypeId}/entity/{entityId}")] - public async Task GetDocumentList(Guid entityTypeId, Guid entityId, [FromQuery] string? filter, [FromQuery] string? searchString, + public async Task GetDocumentListAsync(Guid entityTypeId, Guid entityId, [FromQuery] string? filter, [FromQuery] string? searchString, [FromQuery] bool isActive = true, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { using var scope = _serviceScope.CreateScope(); @@ -237,13 +240,12 @@ namespace Marco.Pms.Services.Controllers /// Validates permissions, document type, entity existence, tags, and uploads to S3. /// [HttpPost("upload")] - public async Task UploadDocument([FromBody] DocumentAttachmentDto model) + public async Task UploadDocumentAsync([FromBody] DocumentAttachmentDto model) { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); - var logger = scope.ServiceProvider.GetRequiredService(); - logger.LogInfo("Document upload initiated for EntityId: {EntityId}, DocumentTypeId: {DocumentTypeId}", model.EntityId, model.DocumentTypeId); + _logger.LogInfo("Document upload initiated for EntityId: {EntityId}, DocumentTypeId: {DocumentTypeId}", model.EntityId, model.DocumentTypeId); try { @@ -256,7 +258,7 @@ namespace Marco.Pms.Services.Controllers if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId) { - logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId); + _logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId); return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); } @@ -267,14 +269,14 @@ namespace Marco.Pms.Services.Controllers if (documentType == null) { - logger.LogWarning("DocumentTypeId {DocumentTypeId} not found for Tenant {TenantId}", model.DocumentTypeId, tenantId); + _logger.LogWarning("DocumentTypeId {DocumentTypeId} not found for Tenant {TenantId}", model.DocumentTypeId, tenantId); return NotFound(ApiResponse.ErrorResponse("Document Type not found", "Document Type not found in database", 404)); } // Document ID validation if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) { - logger.LogWarning("Mandatory DocumentId missing for DocumentTypeId: {DocumentTypeId}", documentType.Id); + _logger.LogWarning("Mandatory DocumentId missing for DocumentTypeId: {DocumentTypeId}", documentType.Id); return BadRequest(ApiResponse.ErrorResponse("Document ID missing", "User must provide the document ID for this document", 400)); } @@ -282,7 +284,7 @@ namespace Marco.Pms.Services.Controllers { if (!Regex.IsMatch(model.DocumentId, documentType.RegexExpression)) { - logger.LogWarning("Invalid DocumentId format for DocumentTypeId: {DocumentTypeId}, Provided: {DocumentId}", documentType.Id, model.DocumentId); + _logger.LogWarning("Invalid DocumentId format for DocumentTypeId: {DocumentTypeId}, Provided: {DocumentId}", documentType.Id, model.DocumentId); return BadRequest(ApiResponse.ErrorResponse("Invalid Document ID", "Provided document ID is not valid", 400)); } } @@ -302,7 +304,7 @@ namespace Marco.Pms.Services.Controllers if (!entityExists) { - logger.LogWarning("Entity not found. EntityType: {EntityType}, EntityId: {EntityId}", entityType, model.EntityId); + _logger.LogWarning("Entity not found. EntityType: {EntityType}, EntityId: {EntityId}", entityType, model.EntityId); return NotFound(ApiResponse.ErrorResponse($"{(entityType == EmployeeEntity ? "Employee" : "Project")} Not Found", "Entity not found in database", 404)); } @@ -310,19 +312,20 @@ namespace Marco.Pms.Services.Controllers var attachment = _mapper.Map(model); attachment.UploadedAt = DateTime.UtcNow; attachment.UploadedById = loggedInEmployee.Id; + attachment.IsCurrentVersion = true; attachment.TenantId = tenantId; // Validate Attachment if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) { - logger.LogWarning("File size {FileSize} exceeded max allowed {MaxSize}MB", model.Attachment.FileSize, documentType.MaxSizeAllowedInMB); + _logger.LogWarning("File size {FileSize} exceeded max allowed {MaxSize}MB", model.Attachment.FileSize, documentType.MaxSizeAllowedInMB); return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", $"Max allowed {documentType.MaxSizeAllowedInMB} MB.", 400)); } string base64 = model.Attachment.Base64Data?.Split(',').LastOrDefault() ?? ""; if (string.IsNullOrWhiteSpace(base64)) { - logger.LogWarning("Missing Base64 data for attachment."); + _logger.LogWarning("Missing Base64 data for attachment."); return BadRequest(ApiResponse.ErrorResponse("Base64 data missing", "File data required", 400)); } @@ -332,7 +335,7 @@ namespace Marco.Pms.Services.Controllers var validContentTypes = documentType.AllowedContentType.Split(',').ToList(); if (!validContentTypes.Contains(fileType)) { - logger.LogWarning("Unsupported file type {FileType} for DocumentType {DocumentTypeId}", fileType, documentType.Id); + _logger.LogWarning("Unsupported file type {FileType} for DocumentType {DocumentTypeId}", fileType, documentType.Id); return BadRequest(ApiResponse.ErrorResponse("Unsupported file type", $"Unsupported file type: {fileType}", 400)); } @@ -346,6 +349,7 @@ namespace Marco.Pms.Services.Controllers // Fire-and-forget upload _ = Task.Run(async () => { + var logger = scope.ServiceProvider.GetRequiredService(); try { await s3Service.UploadFileAsync(base64, fileType, objectKey); @@ -427,7 +431,7 @@ namespace Marco.Pms.Services.Controllers await dbContext.SaveChangesAsync(); - logger.LogInfo("Document uploaded successfully. AttachmentId: {AttachmentId}, DocumentId: {DocumentId}", attachment.Id, document.Id); + _logger.LogInfo("Document uploaded successfully. AttachmentId: {AttachmentId}, DocumentId: {DocumentId}", attachment.Id, document.Id); var response = _mapper.Map(attachment); response.UploadedBy = _mapper.Map(loggedInEmployee); @@ -438,19 +442,313 @@ namespace Marco.Pms.Services.Controllers } catch (Exception ex) { - logger.LogError(ex, "Unexpected error during document upload."); + _logger.LogError(ex, "Unexpected error during document upload."); return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while uploading the document", 500)); } } - - // PUT api//5 - [HttpPut("{id}")] - public async Task Put(int id, [FromBody] string value) + [HttpPut("edit/{id}")] + public async Task UpdateDocumentAsync(Guid id, [FromBody] UpdateDocumentAttachmentDto model) { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + // Logger initialization at the start for consistent logging + using var scope = _serviceScope.CreateScope(); + _logger.LogInfo("Start UpdateDocument API for AttachmentId: {AttachmentId}", id); + + try + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + + // Get logged-in employee details + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var permissionService = scope.ServiceProvider.GetRequiredService(); + var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); + + // Fetch the existing attachment + var oldAttachment = await dbContext.DocumentAttachments + .Include(da => da.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) + .FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId); + + if (oldAttachment == null) + { + _logger.LogWarning("Attachment not found for Id: {AttachmentId}", id); + return NotFound(ApiResponse.ErrorResponse("Attachment not found", "Attachment not found in database", 404)); + } + + // Permission check: ensure uploader is authorized + if (!hasUploadPermission && loggedInEmployee.Id != oldAttachment.EntityId) + { + _logger.LogWarning("Access denied for EmployeeId: {EmployeeId}", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); + } + + // Validate the document type + var documentType = oldAttachment.DocumentType; + if (documentType == null) + { + _logger.LogWarning("Document type not found for AttachmentId: {AttachmentId}", id); + return NotFound(ApiResponse.ErrorResponse("Document Type not found", "Document Type not found in database", 404)); + } + + // Mandatory DocumentID check + if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) + { + _logger.LogWarning("Document ID missing for mandatory DocumentTypeId: {DocumentTypeId}", documentType.Id); + return BadRequest(ApiResponse.ErrorResponse("Document ID missing", "User must provide the document ID for this document", 400)); + } + + // DocumentID Regex validation + if (documentType.IsValidationRequired && !string.IsNullOrWhiteSpace(model.DocumentId) && !string.IsNullOrWhiteSpace(documentType.RegexExpression)) + { + if (!Regex.IsMatch(model.DocumentId, documentType.RegexExpression)) + { + _logger.LogWarning("Provided document ID does not match regex for DocumentTypeId: {DocumentTypeId}", documentType.Id); + return BadRequest(ApiResponse.ErrorResponse("Invalid Document ID", "Provided document ID is not valid", 400)); + } + } + + // Validate entity existence and project-level permission + var entityType = documentType.DocumentCategory!.EntityTypeId; + bool entityExists; + if (entityType.Equals(EmployeeEntity)) + { + entityExists = await dbContext.Employees.AnyAsync(e => e.Id == oldAttachment.EntityId && e.TenantId == tenantId); + } + else if (entityType.Equals(ProjectEntity)) + { + entityExists = await dbContext.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId); + if (entityExists) + { + entityExists = await permissionService.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId); + } + } + else + { + entityExists = false; + } + + if (!entityExists) + { + _logger.LogWarning("Entity not found (Employee/Project) for AttachmentId: {AttachmentId}", id); + return NotFound(ApiResponse.ErrorResponse($"{(entityType == EmployeeEntity ? "Employee" : "Project")} Not Found", "Entity not found in database", 404)); + } + + // Prepare for versioning + var oldVersionMapping = await dbContext.AttachmentVersionMappings + .FirstOrDefaultAsync(av => av.ChildAttachmentId == oldAttachment.Id && av.TenantId == tenantId); + + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var existingEntityBson = updateLogHelper.EntityToBsonDocument(oldAttachment); + + DocumentAttachment newAttachment; + AttachmentVersionMapping newVersionMapping; + + if (model.Attachment != null) + { + // File size check + if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) + { + _logger.LogWarning("Attachment exceeded max file size for DocumentTypeId: {DocumentTypeId}", documentType.Id); + return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", $"Max allowed {documentType.MaxSizeAllowedInMB} MB.", 400)); + } + + // Base64 validation + string base64 = model.Attachment.Base64Data?.Split(',').LastOrDefault() ?? ""; + if (string.IsNullOrWhiteSpace(base64)) + { + _logger.LogWarning("Base64 data missing for new attachment"); + return BadRequest(ApiResponse.ErrorResponse("Base64 data missing", "File data required", 400)); + } + + // Content type verification + var s3Service = scope.ServiceProvider.GetRequiredService(); + var fileType = s3Service.GetContentTypeFromBase64(base64); + var validContentTypes = documentType.AllowedContentType.Split(',').ToList(); + if (!validContentTypes.Contains(fileType)) + { + _logger.LogWarning("Unsupported file type: {FileType}", fileType); + return BadRequest(ApiResponse.ErrorResponse("Unsupported file type", $"Unsupported file type: {fileType}", 400)); + } + + // S3 keys and folder structure + string folderName = entityType == EmployeeEntity ? "EmployeeDocuments" : "ProjectDocuments"; + string fileName = s3Service.GenerateFileName(fileType, tenantId, folderName); + string objectKey = entityType == EmployeeEntity + ? $"tenant-{tenantId}/Employee/{oldAttachment.EntityId}/{folderName}/{fileName}" + : $"tenant-{tenantId}/project-{oldAttachment.EntityId}/{folderName}/{fileName}"; + + // Asynchronous S3 upload with logging + _ = Task.Run(async () => + { + var logger = scope.ServiceProvider.GetRequiredService(); + try + { + await s3Service.UploadFileAsync(base64, fileType, objectKey); + logger.LogInfo("File uploaded successfully to S3: {ObjectKey}", objectKey); + } + catch (Exception ex) + { + logger.LogError(ex, "S3 upload failed for {ObjectKey}.", objectKey); + } + }); + + // Create Document record + var document = new Document + { + BatchId = Guid.NewGuid(), + UploadedById = loggedInEmployee.Id, + FileName = model.Attachment.FileName ?? fileName, + ContentType = model.Attachment.ContentType ?? fileType, + S3Key = objectKey, + FileSize = model.Attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + + dbContext.Documents.Add(document); + + // Record new document attachment as the current version + var attachment = new DocumentAttachment + { + Name = model.Name, + DocumentId = model.DocumentId, + Description = model.Description, + IsCurrentVersion = true, + EntityId = oldAttachment.EntityId, + DocumentDataId = document.Id, + UploadedAt = DateTime.UtcNow, + UploadedById = loggedInEmployee.Id, + DocumentTypeId = oldAttachment.DocumentTypeId, + TenantId = oldAttachment.TenantId + }; + + dbContext.DocumentAttachments.Add(attachment); + + // Mark old version as not current + oldAttachment.IsCurrentVersion = false; + + // Version mapping + AttachmentVersionMapping versionMapping; + if (oldVersionMapping != null) + { + versionMapping = new AttachmentVersionMapping + { + ParentAttachmentId = oldVersionMapping.ParentAttachmentId, + ChildAttachmentId = attachment.Id, + Version = (oldVersionMapping.Version + 1), + TenantId = tenantId + }; + } + else + { + versionMapping = new AttachmentVersionMapping + { + ParentAttachmentId = attachment.Id, + ChildAttachmentId = attachment.Id, + Version = 1, + TenantId = tenantId + }; + } + dbContext.AttachmentVersionMappings.Add(versionMapping); + + newAttachment = attachment; + newVersionMapping = versionMapping; + _logger.LogInfo("Created new current version for AttachmentId: {AttachmentId}", attachment.Id); + } + else + { + // Update attachment metadata only (no file upload) + oldAttachment.Name = model.Name; + oldAttachment.DocumentId = model.DocumentId; + oldAttachment.Description = model.Description; + if (oldAttachment.IsVerified == true) + { + oldAttachment.IsVerified = false; + _logger.LogInfo("Reset verification flag for AttachmentId: {AttachmentId}", oldAttachment.Id); + } + oldAttachment.UpdatedAt = DateTime.UtcNow; + oldAttachment.UpdatedById = loggedInEmployee.Id; + + newAttachment = oldAttachment; + newVersionMapping = oldVersionMapping ?? new AttachmentVersionMapping(); + _logger.LogInfo("Attachment metadata updated for AttachmentId: {AttachmentId}", oldAttachment.Id); + } + + // Tag management + if (model.Tags?.Any() == true) + { + var names = model.Tags.Select(t => t.Name).ToList(); + var existingTags = await dbContext.DocumentTagMasters + .Where(t => names.Contains(t.Name) && t.TenantId == tenantId) + .ToListAsync(); + + var attachmentTagMappings = new List(); + var oldTagNames = await dbContext.AttachmentTagMappings + .Include(dt => dt.DocumentTag) + .Where(dt => dt.DocumentTag != null && dt.AttachmentId == newAttachment.Id && dt.TenantId == tenantId) + .Select(dt => dt.DocumentTag!.Name) + .ToListAsync(); + + foreach (var tag in model.Tags.Where(t => t.IsActive && !oldTagNames.Contains(t.Name))) + { + var existingTag = existingTags.FirstOrDefault(t => t.Name == tag.Name); + var tagEntity = existingTag ?? new DocumentTagMaster + { + Id = Guid.NewGuid(), + Name = tag.Name, + Description = tag.Name, + TenantId = tenantId + }; + + if (existingTag == null) + { + dbContext.DocumentTagMasters.Add(tagEntity); + } + + attachmentTagMappings.Add(new AttachmentTagMapping + { + DocumentTagId = tagEntity.Id, + AttachmentId = newAttachment.Id, + TenantId = tenantId + }); + } + + dbContext.AttachmentTagMappings.AddRange(attachmentTagMappings); + _logger.LogInfo("Tags processed for AttachmentId: {AttachmentId}", newAttachment.Id); + } + + // Persist changes to database + await dbContext.SaveChangesAsync(); + _logger.LogInfo("Database changes committed for AttachmentId: {AttachmentId}", newAttachment.Id); + + // Update logs + await updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = oldAttachment.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + _logger.LogInfo("Update logs pushed for AttachmentId: {AttachmentId}", oldAttachment.Id); + + // Prepare response + var response = _mapper.Map(newAttachment); + response.UploadedBy = _mapper.Map(loggedInEmployee); + response.ParentAttachmentId = newVersionMapping.ParentAttachmentId; + response.Version = newVersionMapping.Version; + _logger.LogInfo("API completed successfully for AttachmentId: {AttachmentId}", newAttachment.Id); + + return Ok(ApiResponse.SuccessResponse(response, "Document added successfully", 200)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occurred while updating document for AttachmentId: {AttachmentId}", id); + return StatusCode(500, ApiResponse.ErrorResponse("Exception occured", "Exception occured while the updating document", 500)); + } } + // DELETE api//5 [HttpDelete("{id}")] public async Task Delete(int id) @@ -458,11 +756,7 @@ namespace Marco.Pms.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); } - /// - /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). - /// - /// The JSON filter string from the request. - /// An object or null if deserialization fails. + #region =================================================================== Helper Functions =================================================================== private DocumentFilter? TryDeserializeFilter(string? filter) { @@ -502,5 +796,7 @@ namespace Marco.Pms.Services.Controllers } return documentFilter; } + + #endregion } } -- 2.43.0 From 7e98429e10f767cda749302e7437dc54dd6011f2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 12:25:43 +0530 Subject: [PATCH 21/63] Added the get filter for documents --- .../Controllers/DocumentController.cs | 100 ++++++++++++++++-- 1 file changed, 94 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index b6da516..5f6fc27 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -52,10 +52,6 @@ namespace Marco.Pms.Services.Controllers tenantId = userHelper.GetTenantId(); } - - /// - /// Fetch documents for a given entity (Project/Employee) with filtering, searching, and pagination. - /// [HttpGet("list/{entityTypeId}/entity/{entityId}")] public async Task GetDocumentListAsync(Guid entityTypeId, Guid entityId, [FromQuery] string? filter, [FromQuery] string? searchString, [FromQuery] bool isActive = true, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) @@ -225,16 +221,108 @@ namespace Marco.Pms.Services.Controllers } } - // GET api//5 [HttpGet("{id}")] public async Task Get(int id) { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); //string preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); } + [HttpGet("get/filter{entityTypeId}")] + public async Task GetFilterObjectAsync(Guid entityTypeId) + { + // Log: Starting filter fetch process + _logger.LogInfo("Initiating GetFilterObjectAsync to retrieve document filter data."); + + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + + // Get current logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + _logger.LogDebug("Fetched current employee: {EmployeeId}", loggedInEmployee.Id); + + // Fetch all relevant document attachments for the tenant with related data + var documentList = await dbContext.DocumentAttachments + .Include(da => da.UploadedBy) + .Include(da => da.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) + .Where(da => da.DocumentType != null && + da.DocumentType.DocumentCategory != null && + da.DocumentType.DocumentCategory.EntityTypeId == entityTypeId && + da.TenantId == tenantId) + .ToListAsync(); + _logger.LogInfo("Fetched {Count} document attachments for tenant {TenantId}", documentList.Count, tenantId); + + // Select IDs for attachments present in documentList + var documentIds = documentList.Select(da => da.Id).ToList(); + + // Preload tags for given ids + var documentTags = await dbContext.AttachmentTagMappings + .Where(at => documentIds.Contains(at.AttachmentId) && at.DocumentTag != null) + .Select(at => new + { + Id = at.DocumentTag!.Id, + Name = at.DocumentTag.Name + }) + .Distinct() + .ToListAsync(); + _logger.LogInfo("Loaded {Count} document tags", documentTags.Count); + + // Gather unique UploadedBy users + var uploadedBy = documentList + .Where(da => da.UploadedBy != null) + .Select(da => new + { + Id = da.UploadedBy!.Id, + Name = $"{da.UploadedBy.FirstName} {da.UploadedBy.LastName}" + }) + .Distinct() + .ToList(); + _logger.LogInfo("Collected {Count} unique uploaders", uploadedBy.Count); + + // Gather unique DocumentCategories + var documentCategories = documentList + .Where(da => da.DocumentType?.DocumentCategory != null) + .Select(da => new + { + Id = da.DocumentType!.DocumentCategory!.Id, + Name = da.DocumentType.DocumentCategory.Name + }) + .Distinct() + .ToList(); + _logger.LogInfo("Collected {Count} unique document categories", documentCategories.Count); + + // Gather unique DocumentTypes + var documentTypes = documentList + .Where(da => da.DocumentType != null) + .Select(da => new + { + Id = da.DocumentType!.Id, + Name = da.DocumentType.Name + }) + .Distinct() + .ToList(); + _logger.LogInfo("Collected {Count} unique document types", documentTypes.Count); + + // Compose response + var response = new + { + UploadedBy = uploadedBy, + DocumentCategory = documentCategories, + DocumentType = documentTypes, + DocumentTag = documentTags + }; + + _logger.LogInfo("Returning filter response successfully."); + return Ok(ApiResponse.SuccessResponse(response, "Filters for documents fetched successfully", 200)); + } + + /// /// Uploads a document attachment for an Employee or Project. /// Validates permissions, document type, entity existence, tags, and uploads to S3. @@ -739,7 +827,7 @@ namespace Marco.Pms.Services.Controllers response.Version = newVersionMapping.Version; _logger.LogInfo("API completed successfully for AttachmentId: {AttachmentId}", newAttachment.Id); - return Ok(ApiResponse.SuccessResponse(response, "Document added successfully", 200)); + return Ok(ApiResponse.SuccessResponse(response, "Document Updated successfully", 200)); } catch (Exception ex) { -- 2.43.0 From 0cdbd574db73b96794468405a923d8c8a45187f3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 12:42:27 +0530 Subject: [PATCH 22/63] changing the documentDataId if attachment is not verified --- .../Controllers/DocumentController.cs | 109 +++++++++++------- 1 file changed, 68 insertions(+), 41 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 5f6fc27..adb872e 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -327,6 +327,7 @@ namespace Marco.Pms.Services.Controllers /// Uploads a document attachment for an Employee or Project. /// Validates permissions, document type, entity existence, tags, and uploads to S3. /// + [HttpPost("upload")] public async Task UploadDocumentAsync([FromBody] DocumentAttachmentDto model) { @@ -535,6 +536,17 @@ namespace Marco.Pms.Services.Controllers } } + [HttpPost("verify/{id}")] + public async Task VerifyDocumentAsync(Guid id) + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + return Ok(ApiResponse.SuccessResponse(new { }, "Document is verified successfully", 200)); + } + [HttpPut("edit/{id}")] public async Task UpdateDocumentAsync(Guid id, [FromBody] UpdateDocumentAttachmentDto model) { @@ -696,53 +708,68 @@ namespace Marco.Pms.Services.Controllers dbContext.Documents.Add(document); - // Record new document attachment as the current version - var attachment = new DocumentAttachment + if (oldAttachment.IsVerified == true) { - Name = model.Name, - DocumentId = model.DocumentId, - Description = model.Description, - IsCurrentVersion = true, - EntityId = oldAttachment.EntityId, - DocumentDataId = document.Id, - UploadedAt = DateTime.UtcNow, - UploadedById = loggedInEmployee.Id, - DocumentTypeId = oldAttachment.DocumentTypeId, - TenantId = oldAttachment.TenantId - }; - - dbContext.DocumentAttachments.Add(attachment); - - // Mark old version as not current - oldAttachment.IsCurrentVersion = false; - - // Version mapping - AttachmentVersionMapping versionMapping; - if (oldVersionMapping != null) - { - versionMapping = new AttachmentVersionMapping + // Record new document attachment as the current version + var attachment = new DocumentAttachment { - ParentAttachmentId = oldVersionMapping.ParentAttachmentId, - ChildAttachmentId = attachment.Id, - Version = (oldVersionMapping.Version + 1), - TenantId = tenantId + Name = model.Name, + DocumentId = model.DocumentId, + Description = model.Description, + IsCurrentVersion = true, + EntityId = oldAttachment.EntityId, + DocumentDataId = document.Id, + UploadedAt = DateTime.UtcNow, + UploadedById = loggedInEmployee.Id, + DocumentTypeId = oldAttachment.DocumentTypeId, + TenantId = oldAttachment.TenantId }; + + dbContext.DocumentAttachments.Add(attachment); + + // Mark old version as not current + oldAttachment.IsCurrentVersion = false; + + // Version mapping + AttachmentVersionMapping versionMapping; + if (oldVersionMapping != null) + { + versionMapping = new AttachmentVersionMapping + { + ParentAttachmentId = oldVersionMapping.ParentAttachmentId, + ChildAttachmentId = attachment.Id, + Version = (oldVersionMapping.Version + 1), + TenantId = tenantId + }; + } + else + { + versionMapping = new AttachmentVersionMapping + { + ParentAttachmentId = attachment.Id, + ChildAttachmentId = attachment.Id, + Version = 1, + TenantId = tenantId + }; + } + dbContext.AttachmentVersionMappings.Add(versionMapping); + + newAttachment = attachment; + newVersionMapping = versionMapping; + _logger.LogInfo("Created new current version for AttachmentId: {AttachmentId}", attachment.Id); } else { - versionMapping = new AttachmentVersionMapping - { - ParentAttachmentId = attachment.Id, - ChildAttachmentId = attachment.Id, - Version = 1, - TenantId = tenantId - }; - } - dbContext.AttachmentVersionMappings.Add(versionMapping); + oldAttachment.Name = model.Name; + oldAttachment.DocumentId = model.DocumentId; + oldAttachment.Description = model.Description; + oldAttachment.DocumentDataId = document.Id; + + newAttachment = oldAttachment; + newVersionMapping = oldVersionMapping ?? new AttachmentVersionMapping(); + _logger.LogInfo("Attachment metadata updated for AttachmentId: {AttachmentId}", oldAttachment.Id); + } - newAttachment = attachment; - newVersionMapping = versionMapping; - _logger.LogInfo("Created new current version for AttachmentId: {AttachmentId}", attachment.Id); } else { @@ -752,7 +779,7 @@ namespace Marco.Pms.Services.Controllers oldAttachment.Description = model.Description; if (oldAttachment.IsVerified == true) { - oldAttachment.IsVerified = false; + oldAttachment.IsVerified = null; _logger.LogInfo("Reset verification flag for AttachmentId: {AttachmentId}", oldAttachment.Id); } oldAttachment.UpdatedAt = DateTime.UtcNow; -- 2.43.0 From 87cf37ca035dd4b00de4479a03bd2911bb3d18ca Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 13:10:31 +0530 Subject: [PATCH 23/63] Added the API to verify or reject the document --- .../Controllers/DocumentController.cs | 81 ++++++++++++++++++- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index adb872e..85e4e3b 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -536,17 +536,90 @@ namespace Marco.Pms.Services.Controllers } } + /// + /// Verifies a document attachment by its ID. Checks permissions, logs the operation, and updates verification fields. + /// + /// Document Attachment ID (Guid) + /// Flag to verify or unverify the document (default: true) + [HttpPost("verify/{id}")] - public async Task VerifyDocumentAsync(Guid id) + public async Task VerifyDocumentAsync(Guid id, [FromQuery] bool isVerify = true) { + // Begin: Create DbContext and DI scope await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + try + { + // Get current logged-in employee for authentication/auditing + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var tenantId = loggedInEmployee.TenantId; - return Ok(ApiResponse.SuccessResponse(new { }, "Document is verified successfully", 200)); + _logger.LogInfo("Attempting to verify document. EmployeeId: {EmployeeId}, DocumentId: {DocumentId}, IsVerify: {IsVerify}", + loggedInEmployee.Id, id, isVerify); + + // Fetch active/current document by Id, TenantId, and relevant conditions + var documentAttachment = await dbContext.DocumentAttachments + .FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId); + + if (documentAttachment == null) + { + _logger.LogWarning("Document attachment not found. Requested Id: {DocumentId}, TenantId: {TenantId}", id, tenantId); + return NotFound(ApiResponse.ErrorResponse("Attachment not found", "Attachment not found in database", 404)); + } + + // Permission service: check if employee is authorized to verify documents + var permissionService = scope.ServiceProvider.GetRequiredService(); + var hasVerifyPermission = await permissionService.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id); + + if (!hasVerifyPermission) + { + _logger.LogWarning("Access denied for document verification. EmployeeId: {EmployeeId}, DocumentId: {DocumentId}", loggedInEmployee.Id, id); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to verify this document", 403)); + } + + // Log existing entity state before update (for audit trail) + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var existingEntityBson = updateLogHelper.EntityToBsonDocument(documentAttachment); + + // Update document verification status and audit fields + documentAttachment.IsVerified = isVerify; + documentAttachment.VerifiedAt = DateTime.UtcNow; + documentAttachment.VerifiedById = loggedInEmployee.Id; + + // Commit changes + await dbContext.SaveChangesAsync(); + + // Log the update to MongoDB for change tracking + await updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentAttachment.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + var versionMapping = await dbContext.AttachmentVersionMappings.FirstOrDefaultAsync(av => av.ChildAttachmentId == documentAttachment.Id); + + var response = _mapper.Map(documentAttachment); + if (versionMapping != null) + { + response.ParentAttachmentId = versionMapping.ParentAttachmentId; + response.Version = versionMapping.Version; + } + + _logger.LogInfo("Document verified successfully. DocumentId: {DocumentId}, VerifiedBy: {EmployeeId}", documentAttachment.Id, loggedInEmployee.Id); + return Ok(ApiResponse.SuccessResponse(new { }, "Document is verified successfully", 200)); + } + catch (Exception ex) + { + // Handle unexpected errors gracefully + _logger.LogError(ex, "Error occurred during document verification. DocumentId: {DocumentId}", id); + return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An error occurred while verifying the document", 500)); + } } + [HttpPut("edit/{id}")] public async Task UpdateDocumentAsync(Guid id, [FromBody] UpdateDocumentAttachmentDto model) { @@ -568,7 +641,7 @@ namespace Marco.Pms.Services.Controllers var oldAttachment = await dbContext.DocumentAttachments .Include(da => da.DocumentType) .ThenInclude(dt => dt!.DocumentCategory) - .FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId); + .FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId); if (oldAttachment == null) { -- 2.43.0 From ec85fd8eb3676914f6f7e43f77539526eda68bd7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 15:44:15 +0530 Subject: [PATCH 24/63] Added the API to get old version list --- .../DocumentManager/AttachmentVersionVM.cs | 18 ++ .../Controllers/DocumentController.cs | 160 +++++++++++++----- .../MappingProfiles/MappingProfile.cs | 2 +- 3 files changed, 140 insertions(+), 40 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs new file mode 100644 index 0000000..e0c45af --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs @@ -0,0 +1,18 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class AttachmentVersionVM + { + public Guid Id { get; set; } + public string? Name { get; set; } + public string? DocumentId { get; set; } + public string? PreSignedUrl { get; set; } + public int Version { get; set; } + public DateTime UploadedAt { get; set; } + public BasicEmployeeVM? UploadedBy { get; set; } + public DateTime? UpdatedAt { get; set; } + public BasicEmployeeVM? UpdatedBy { get; set; } + public bool? IsVerified { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 85e4e3b..1d6101d 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -223,23 +223,27 @@ namespace Marco.Pms.Services.Controllers // GET api//5 [HttpGet("{id}")] - public async Task Get(int id) + public async Task GetDetails(int id) { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - //string preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); + //if (versionMapping.ChildAttachment != null && versionMapping.ChildAttachment.Document != null) + //{ + // var s3Service = scope.ServiceProvider.GetRequiredService(); + // documentVM.PreSignedUrl = s3Service.GeneratePreSignedUrl(versionMapping.ChildAttachment.Document.S3Key); + //} + return Ok(ApiResponse.SuccessResponse(new { }, "Filters for documents fetched successfully", 200)); } - [HttpGet("get/filter{entityTypeId}")] + [HttpGet("get/filter/{entityTypeId}")] public async Task GetFilterObjectAsync(Guid entityTypeId) { // Log: Starting filter fetch process _logger.LogInfo("Initiating GetFilterObjectAsync to retrieve document filter data."); - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); // Get current logged-in employee @@ -247,7 +251,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogDebug("Fetched current employee: {EmployeeId}", loggedInEmployee.Id); // Fetch all relevant document attachments for the tenant with related data - var documentList = await dbContext.DocumentAttachments + var documentList = await _context.DocumentAttachments .Include(da => da.UploadedBy) .Include(da => da.DocumentType) .ThenInclude(dt => dt!.DocumentCategory) @@ -262,7 +266,7 @@ namespace Marco.Pms.Services.Controllers var documentIds = documentList.Select(da => da.Id).ToList(); // Preload tags for given ids - var documentTags = await dbContext.AttachmentTagMappings + var documentTags = await _context.AttachmentTagMappings .Where(at => documentIds.Contains(at.AttachmentId) && at.DocumentTag != null) .Select(at => new { @@ -322,6 +326,60 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Filters for documents fetched successfully", 200)); } + [HttpGet("list/versions/{parentAttachmentId}")] + public async Task GetAllVersionsAsync(Guid parentAttachmentId) + { + _logger.LogInfo("Start fetching document versions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); + + // Create a new DbContext instance asynchronously + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + try + { + // Retrieve currently logged in employee details for potential security or filtering checks + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("No logged in employee found while fetching versions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized access", 401)); + } + + // Retrieve all version mappings linked to the parent attachment and tenant + var versionMappings = await _context.AttachmentVersionMappings + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.UploadedBy) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.UpdatedBy) + .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId) + .ToListAsync(); + + _logger.LogInfo("Found {Count} versions for ParentAttachmentId: {ParentAttachmentId}", versionMappings.Count, parentAttachmentId); + + // Map the retrieved child attachments to view models with version info + var response = versionMappings.Select(versionMapping => + { + var documentVM = _mapper.Map(versionMapping.ChildAttachment); + documentVM.Version = versionMapping.Version; + return documentVM; + }).ToList(); + + _logger.LogInfo("Successfully mapped version data for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); + + return Ok(ApiResponse.SuccessResponse(response, "Document versions fetched successfully", 200)); + } + catch (Exception ex) + { + // Log the exception and return an internal server error response + _logger.LogError(ex, "Error occurred while fetching document versions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); + return StatusCode(500, ApiResponse.ErrorResponse("An error occurred while fetching document versions", 500)); + } + finally + { + _logger.LogInfo("End processing GetAllVersions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); + } + } + + /// /// Uploads a document attachment for an Employee or Project. @@ -331,7 +389,7 @@ namespace Marco.Pms.Services.Controllers [HttpPost("upload")] public async Task UploadDocumentAsync([FromBody] DocumentAttachmentDto model) { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); _logger.LogInfo("Document upload initiated for EntityId: {EntityId}, DocumentTypeId: {DocumentTypeId}", model.EntityId, model.DocumentTypeId); @@ -352,7 +410,7 @@ namespace Marco.Pms.Services.Controllers } // Validate Document Type - var documentType = await dbContext.DocumentTypeMasters + var documentType = await _context.DocumentTypeMasters .Include(dt => dt.DocumentCategory) .FirstOrDefaultAsync(dt => dt.Id == model.DocumentTypeId && dt.TenantId == tenantId && dt.DocumentCategory != null); @@ -384,11 +442,11 @@ namespace Marco.Pms.Services.Controllers bool entityExists = false; if (entityType.Equals(EmployeeEntity)) { - entityExists = await dbContext.Employees.AnyAsync(e => e.Id == model.EntityId && e.TenantId == tenantId); + entityExists = await _context.Employees.AnyAsync(e => e.Id == model.EntityId && e.TenantId == tenantId); } else if (entityType.Equals(ProjectEntity)) { - entityExists = await dbContext.Projects.AnyAsync(p => p.Id == model.EntityId && p.TenantId == tenantId); + entityExists = await _context.Projects.AnyAsync(p => p.Id == model.EntityId && p.TenantId == tenantId); } if (!entityExists) @@ -405,7 +463,8 @@ namespace Marco.Pms.Services.Controllers attachment.TenantId = tenantId; // Validate Attachment - if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) + var allowedSize = documentType.MaxSizeAllowedInMB * 1024; + if (model.Attachment.FileSize > allowedSize) { _logger.LogWarning("File size {FileSize} exceeded max allowed {MaxSize}MB", model.Attachment.FileSize, documentType.MaxSizeAllowedInMB); return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", $"Max allowed {documentType.MaxSizeAllowedInMB} MB.", 400)); @@ -463,11 +522,11 @@ namespace Marco.Pms.Services.Controllers TenantId = tenantId }; - dbContext.Documents.Add(document); + _context.Documents.Add(document); attachment.DocumentDataId = document.Id; - dbContext.DocumentAttachments.Add(attachment); + _context.DocumentAttachments.Add(attachment); //Process Versioning @@ -478,13 +537,13 @@ namespace Marco.Pms.Services.Controllers Version = 1, TenantId = tenantId }; - dbContext.AttachmentVersionMappings.Add(versionMapping); + _context.AttachmentVersionMappings.Add(versionMapping); // Process Tags if (model.Tags?.Any() == true) { var names = model.Tags.Select(t => t.Name).ToList(); - var existingTags = await dbContext.DocumentTagMasters + var existingTags = await _context.DocumentTagMasters .Where(t => names.Contains(t.Name) && t.TenantId == tenantId) .ToListAsync(); @@ -503,7 +562,7 @@ namespace Marco.Pms.Services.Controllers if (existingTag == null) { - dbContext.DocumentTagMasters.Add(tagEntity); + _context.DocumentTagMasters.Add(tagEntity); } attachmentTagMappings.Add(new AttachmentTagMapping @@ -514,11 +573,11 @@ namespace Marco.Pms.Services.Controllers }); } - dbContext.AttachmentTagMappings.AddRange(attachmentTagMappings); + _context.AttachmentTagMappings.AddRange(attachmentTagMappings); } - await dbContext.SaveChangesAsync(); + await _context.SaveChangesAsync(); _logger.LogInfo("Document uploaded successfully. AttachmentId: {AttachmentId}, DocumentId: {DocumentId}", attachment.Id, document.Id); @@ -546,7 +605,7 @@ namespace Marco.Pms.Services.Controllers public async Task VerifyDocumentAsync(Guid id, [FromQuery] bool isVerify = true) { // Begin: Create DbContext and DI scope - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScope.CreateScope(); try @@ -559,7 +618,7 @@ namespace Marco.Pms.Services.Controllers loggedInEmployee.Id, id, isVerify); // Fetch active/current document by Id, TenantId, and relevant conditions - var documentAttachment = await dbContext.DocumentAttachments + var documentAttachment = await _context.DocumentAttachments .FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId); if (documentAttachment == null) @@ -588,7 +647,7 @@ namespace Marco.Pms.Services.Controllers documentAttachment.VerifiedById = loggedInEmployee.Id; // Commit changes - await dbContext.SaveChangesAsync(); + await _context.SaveChangesAsync(); // Log the update to MongoDB for change tracking await updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject @@ -599,7 +658,7 @@ namespace Marco.Pms.Services.Controllers UpdatedAt = DateTime.UtcNow }, Collection); - var versionMapping = await dbContext.AttachmentVersionMappings.FirstOrDefaultAsync(av => av.ChildAttachmentId == documentAttachment.Id); + var versionMapping = await _context.AttachmentVersionMappings.FirstOrDefaultAsync(av => av.ChildAttachmentId == documentAttachment.Id); var response = _mapper.Map(documentAttachment); if (versionMapping != null) @@ -629,7 +688,7 @@ namespace Marco.Pms.Services.Controllers try { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); // Get logged-in employee details var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -638,7 +697,7 @@ namespace Marco.Pms.Services.Controllers var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); // Fetch the existing attachment - var oldAttachment = await dbContext.DocumentAttachments + var oldAttachment = await _context.DocumentAttachments .Include(da => da.DocumentType) .ThenInclude(dt => dt!.DocumentCategory) .FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId); @@ -686,11 +745,11 @@ namespace Marco.Pms.Services.Controllers bool entityExists; if (entityType.Equals(EmployeeEntity)) { - entityExists = await dbContext.Employees.AnyAsync(e => e.Id == oldAttachment.EntityId && e.TenantId == tenantId); + entityExists = await _context.Employees.AnyAsync(e => e.Id == oldAttachment.EntityId && e.TenantId == tenantId); } else if (entityType.Equals(ProjectEntity)) { - entityExists = await dbContext.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId); + entityExists = await _context.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId); if (entityExists) { entityExists = await permissionService.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId); @@ -708,7 +767,7 @@ namespace Marco.Pms.Services.Controllers } // Prepare for versioning - var oldVersionMapping = await dbContext.AttachmentVersionMappings + var oldVersionMapping = await _context.AttachmentVersionMappings .FirstOrDefaultAsync(av => av.ChildAttachmentId == oldAttachment.Id && av.TenantId == tenantId); var updateLogHelper = scope.ServiceProvider.GetRequiredService(); @@ -720,7 +779,8 @@ namespace Marco.Pms.Services.Controllers if (model.Attachment != null) { // File size check - if (model.Attachment.FileSize > documentType.MaxSizeAllowedInMB) + var allowedSize = documentType.MaxSizeAllowedInMB * 1024; + if (model.Attachment.FileSize > allowedSize) { _logger.LogWarning("Attachment exceeded max file size for DocumentTypeId: {DocumentTypeId}", documentType.Id); return BadRequest(ApiResponse.ErrorResponse("File size limit exceeded", $"Max allowed {documentType.MaxSizeAllowedInMB} MB.", 400)); @@ -779,7 +839,7 @@ namespace Marco.Pms.Services.Controllers TenantId = tenantId }; - dbContext.Documents.Add(document); + _context.Documents.Add(document); if (oldAttachment.IsVerified == true) { @@ -798,7 +858,7 @@ namespace Marco.Pms.Services.Controllers TenantId = oldAttachment.TenantId }; - dbContext.DocumentAttachments.Add(attachment); + _context.DocumentAttachments.Add(attachment); // Mark old version as not current oldAttachment.IsCurrentVersion = false; @@ -825,7 +885,7 @@ namespace Marco.Pms.Services.Controllers TenantId = tenantId }; } - dbContext.AttachmentVersionMappings.Add(versionMapping); + _context.AttachmentVersionMappings.Add(versionMapping); newAttachment = attachment; newVersionMapping = versionMapping; @@ -837,6 +897,13 @@ namespace Marco.Pms.Services.Controllers oldAttachment.DocumentId = model.DocumentId; oldAttachment.Description = model.Description; oldAttachment.DocumentDataId = document.Id; + if (oldAttachment.IsVerified == true) + { + oldAttachment.IsVerified = null; + _logger.LogInfo("Reset verification flag for AttachmentId: {AttachmentId}", oldAttachment.Id); + } + oldAttachment.UpdatedAt = DateTime.UtcNow; + oldAttachment.UpdatedById = loggedInEmployee.Id; newAttachment = oldAttachment; newVersionMapping = oldVersionMapping ?? new AttachmentVersionMapping(); @@ -867,17 +934,18 @@ namespace Marco.Pms.Services.Controllers if (model.Tags?.Any() == true) { var names = model.Tags.Select(t => t.Name).ToList(); - var existingTags = await dbContext.DocumentTagMasters + var existingTags = await _context.DocumentTagMasters .Where(t => names.Contains(t.Name) && t.TenantId == tenantId) .ToListAsync(); var attachmentTagMappings = new List(); - var oldTagNames = await dbContext.AttachmentTagMappings + var oldTags = await _context.AttachmentTagMappings .Include(dt => dt.DocumentTag) .Where(dt => dt.DocumentTag != null && dt.AttachmentId == newAttachment.Id && dt.TenantId == tenantId) - .Select(dt => dt.DocumentTag!.Name) .ToListAsync(); + var oldTagNames = oldTags.Select(dt => dt.DocumentTag!.Name).ToList(); + foreach (var tag in model.Tags.Where(t => t.IsActive && !oldTagNames.Contains(t.Name))) { var existingTag = existingTags.FirstOrDefault(t => t.Name == tag.Name); @@ -891,7 +959,7 @@ namespace Marco.Pms.Services.Controllers if (existingTag == null) { - dbContext.DocumentTagMasters.Add(tagEntity); + _context.DocumentTagMasters.Add(tagEntity); } attachmentTagMappings.Add(new AttachmentTagMapping @@ -902,12 +970,26 @@ namespace Marco.Pms.Services.Controllers }); } - dbContext.AttachmentTagMappings.AddRange(attachmentTagMappings); + _context.AttachmentTagMappings.AddRange(attachmentTagMappings); + + var deletedTagMappings = new List(); + + foreach (var tag in model.Tags.Where(t => !t.IsActive && oldTagNames.Contains(t.Name))) + { + var deletedTagMapping = oldTags.FirstOrDefault(at => at.DocumentTag!.Name == tag.Name); + + if (deletedTagMapping != null) + { + deletedTagMappings.Add(deletedTagMapping); + } + } + _context.AttachmentTagMappings.RemoveRange(deletedTagMappings); + _logger.LogInfo("Tags processed for AttachmentId: {AttachmentId}", newAttachment.Id); } // Persist changes to database - await dbContext.SaveChangesAsync(); + await _context.SaveChangesAsync(); _logger.LogInfo("Database changes committed for AttachmentId: {AttachmentId}", newAttachment.Id); // Update logs diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 4b05f39..ea49414 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -310,7 +310,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); - CreateMap(); + CreateMap(); CreateMap(); CreateMap(); -- 2.43.0 From ac69bcb33990960b45b8eb0236af3db6443a5c6f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 16:11:58 +0530 Subject: [PATCH 25/63] Added the API to get Pre-Signed Url by attachment ID --- .../Controllers/DocumentController.cs | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 1d6101d..1a6b6ef 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -327,7 +327,7 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("list/versions/{parentAttachmentId}")] - public async Task GetAllVersionsAsync(Guid parentAttachmentId) + public async Task GetListAllVersionsAsync(Guid parentAttachmentId) { _logger.LogInfo("Start fetching document versions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); @@ -379,6 +379,41 @@ namespace Marco.Pms.Services.Controllers } } + [HttpGet("get/version/{id}")] + public async Task GetAllVersionsAsync(Guid id) + { + // API endpoint to get all versions of an attachment by its ID + _logger.LogInfo($"Fetching versions for attachment with ID: {id}"); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + // Create a new DbContext from the factory asynchronously + using var scope = _serviceScope.CreateScope(); + // Create a new service scope for scoped services + + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + // Get the currently logged in employee asynchronously + + var versionMapping = await _context.AttachmentVersionMappings + // Retrieve version mapping including the child attachment and its document + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.Document) + .FirstOrDefaultAsync(av => av.ChildAttachmentId == id); + + if (versionMapping == null || versionMapping.ChildAttachment == null || versionMapping.ChildAttachment.Document == null) + // Return 404 if no version mapping or related entities found + { + _logger.LogWarning($"Version mapping not found for attachment ID: {id}"); + return NotFound(ApiResponse.ErrorResponse("Version not found", "Version not found in database", 404)); + } + + var s3Service = scope.ServiceProvider.GetRequiredService(); + // Resolve S3UploadService from the scope to generate pre-signed URL + var preSignedUrl = s3Service.GeneratePreSignedUrl(versionMapping.ChildAttachment.Document.S3Key); + // Generate pre-signed URL for the document stored in S3 + _logger.LogInfo($"Generated pre-signed URL for attachment ID: {id}"); + + return Ok(ApiResponse.SuccessResponse(preSignedUrl, "Pre-Signed Url for old version fetched successfully", 200)); + // Return the pre-signed URL with a success response + } /// -- 2.43.0 From ec4756d888b0f199192caf97a7a73c81cd71d39e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 17:17:38 +0530 Subject: [PATCH 26/63] Added the API to get document attachment details --- .../DocumentAttachmentDetailsVM.cs | 25 ++++++ .../Controllers/DocumentController.cs | 78 ++++++++++++++++--- .../MappingProfiles/MappingProfile.cs | 4 +- 3 files changed, 94 insertions(+), 13 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs new file mode 100644 index 0000000..26d3e78 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs @@ -0,0 +1,25 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.DocumentManager +{ + public class DocumentAttachmentDetailsVM + { + public Guid Id { get; set; } + public string? Name { get; set; } + public string? DocumentId { get; set; } + public string? Description { get; set; } + public int Version { get; set; } + public bool IsCurrentVersion { get; set; } + public Guid ParentAttachmentId { get; set; } + public DateTime UploadedAt { get; set; } + public BasicEmployeeVM? UploadedBy { get; set; } + public DateTime? UpdatedAt { get; set; } + public BasicEmployeeVM? UpdatedBy { get; set; } + public DateTime? VerifiedAt { get; set; } + public bool? IsVerified { get; set; } + public BasicEmployeeVM? VerifiedBy { get; set; } + public Guid EntityId { get; set; } + public DocumentTypeVM? DocumentType { get; set; } + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 1a6b6ef..c0e5091 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -221,20 +221,66 @@ namespace Marco.Pms.Services.Controllers } } - // GET api//5 - [HttpGet("{id}")] - public async Task GetDetails(int id) + [HttpGet("get/details/{id}")] + public async Task GetDetailsAsync(Guid id) { + _logger.LogInfo("Starting GetDetails API for AttachmentId: {AttachmentId}", id); + + // Create a new DbContext instance to fetch data await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + // Create a new scoped service provider to resolve scoped dependencies using var scope = _serviceScope.CreateScope(); + // Resolve the permission service from the scoped service provider + var _permission = scope.ServiceProvider.GetRequiredService(); + + // Get the currently logged-in employee var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - //if (versionMapping.ChildAttachment != null && versionMapping.ChildAttachment.Document != null) - //{ - // var s3Service = scope.ServiceProvider.GetRequiredService(); - // documentVM.PreSignedUrl = s3Service.GeneratePreSignedUrl(versionMapping.ChildAttachment.Document.S3Key); - //} - return Ok(ApiResponse.SuccessResponse(new { }, "Filters for documents fetched successfully", 200)); + + _logger.LogDebug("Logged in employee id: {EmployeeId}", loggedInEmployee.Id); + + // Fetch the AttachmentVersionMapping with all necessary related data loaded eagerly + var versionMapping = await _context.AttachmentVersionMappings + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.UploadedBy) + .ThenInclude(e => e!.JobRole) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.VerifiedBy) + .ThenInclude(e => e!.JobRole) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.DocumentType) + .FirstOrDefaultAsync(av => av.ChildAttachmentId == id && av.TenantId == tenantId); + + // If no mapping found, return 404 + if (versionMapping == null || versionMapping.ChildAttachment == null) + { + _logger.LogWarning("AttachmentVersionMapping not found for AttachmentId: {AttachmentId}, TenantId: {TenantId}", + id, tenantId); + return NotFound(ApiResponse.ErrorResponse("Document Attachment not found", "Document Attachment not found in database", 404)); + } + + // Check if the logged in employee has permission to view the document OR is the owner of the attachment entity + var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + if (!hasViewPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId) + { + _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", + loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to view documents", 403)); + } + + // Map the domain entity to the view model + var documentAttachmentVM = _mapper.Map(versionMapping.ChildAttachment); + documentAttachmentVM.Version = versionMapping.Version; + documentAttachmentVM.ParentAttachmentId = versionMapping.ParentAttachmentId; + + _logger.LogInfo("Document details fetched successfully for AttachmentId: {AttachmentId}", id); + + // Return success response with document details + return Ok(ApiResponse.SuccessResponse(documentAttachmentVM, "Document details fetched successfully", 200)); } [HttpGet("get/filter/{entityTypeId}")] @@ -333,6 +379,9 @@ namespace Marco.Pms.Services.Controllers // Create a new DbContext instance asynchronously await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScope.CreateScope(); + + var _permission = scope.ServiceProvider.GetRequiredService(); try { @@ -353,6 +402,16 @@ namespace Marco.Pms.Services.Controllers .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId) .ToListAsync(); + var entityId = versionMappings.Select(av => av.ChildAttachment?.EntityId).FirstOrDefault(); + + // Check global permission + var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + if (!hasViewPermission && loggedInEmployee.Id != entityId) + { + _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId ?? Guid.Empty); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to view documents", 403)); + } + _logger.LogInfo("Found {Count} versions for ParentAttachmentId: {ParentAttachmentId}", versionMappings.Count, parentAttachmentId); // Map the retrieved child attachments to view models with version info @@ -415,7 +474,6 @@ namespace Marco.Pms.Services.Controllers // Return the pre-signed URL with a success response } - /// /// Uploads a document attachment for an Employee or Project. /// Validates permissions, document type, entity existence, tags, and uploads to S3. diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index ea49414..8549bcf 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -311,13 +311,11 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); CreateMap(); - CreateMap(); + CreateMap(); CreateMap(); - CreateMap(); CreateMap(); - CreateMap(); #endregion -- 2.43.0 From 242c345ce1f1d89ae8f35f160f5c5dcde7d3950f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 18:23:55 +0530 Subject: [PATCH 27/63] Added the API to activate and deactivate the document --- .../Controllers/DocumentController.cs | 68 +++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index c0e5091..4e986a6 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -1111,14 +1111,74 @@ namespace Marco.Pms.Services.Controllers } } - - // DELETE api//5 - [HttpDelete("{id}")] - public async Task Delete(int id) + [HttpDelete("delete/{id}")] + public async Task DeleteDocumentAsync(Guid id, [FromQuery] bool isActive = false) { + // Create a new DbContext instance asynchronously + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + // Create a new service scope to resolve scoped services like permission and logging helpers + using var scope = _serviceScope.CreateScope(); + var _permission = scope.ServiceProvider.GetRequiredService(); + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + // Message to indicate whether the document is being activated or deactivated + var message = isActive ? "activated" : "deactivated"; + + // Get the currently logged-in employee var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Log the start of the delete operation for traceability + _logger.LogInfo("DeleteDocument started for document ID: {DocumentId} by employee ID: {EmployeeId}", id, loggedInEmployee.Id); + + // Retrieve the document attachment matching the criteria from the database + var documentAttachment = await _context.DocumentAttachments + .FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId && da.IsActive != isActive); + + // If the document attachment is not found, log a warning and return 404 Not Found + if (documentAttachment == null) + { + _logger.LogWarning("DocumentAttachment not found for ID: {DocumentId}", id); + return NotFound(ApiResponse.ErrorResponse("Document Attachment not found", "Document Attachment not found in database", 404)); + } + + // Check if the logged in employee has permission to delete OR is the owner of the document attachment + var hasDeletePermission = await _permission.HasPermission(PermissionsMaster.DeleteDocument, loggedInEmployee.Id); + if (!hasDeletePermission && loggedInEmployee.Id != documentAttachment.EntityId) + { + _logger.LogWarning("Access denied for employee ID: {EmployeeId} when attempting to delete document ID: {DocumentId}", loggedInEmployee.Id, id); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to delete documents", 403)); + } + + // Log the current state of the document attachment before updating for audit trail + var existingEntityBson = updateLogHelper.EntityToBsonDocument(documentAttachment); + + // Update document attachment status and metadata + documentAttachment.IsActive = isActive; + documentAttachment.IsVerified = null; + documentAttachment.UpdatedAt = DateTime.UtcNow; + documentAttachment.UpdatedById = loggedInEmployee.Id; + + // Persist changes to the database + await _context.SaveChangesAsync(); + + // Log the update operation to MongoDB for inspection and history + await updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentAttachment.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + // Log the successful completion of the operation + _logger.LogInfo("DocumentAttachment ID: {DocumentId} has been {Message} by employee ID: {EmployeeId}", id, message, loggedInEmployee.Id); + + // Return success response + return Ok(ApiResponse.SuccessResponse(new { }, $"Document attachment is {message}", 200)); } + #region =================================================================== Helper Functions =================================================================== private DocumentFilter? TryDeserializeFilter(string? filter) -- 2.43.0 From e34840fbb892e9abb5360fc8cb4abb8cba7b804d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 29 Aug 2025 18:27:35 +0530 Subject: [PATCH 28/63] Added the entity Id in get list API --- Marco.Pms.Services/Controllers/DocumentController.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 4e986a6..cb0d5fc 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -112,7 +112,8 @@ namespace Marco.Pms.Services.Controllers .ThenInclude(e => e!.JobRole) .Include(da => da.DocumentType!) .ThenInclude(dt => dt.DocumentCategory) - .Where(da => da.DocumentType != null && + .Where(da => da.EntityId == entityId && + da.DocumentType != null && da.DocumentType.DocumentCategory != null && da.DocumentType.DocumentCategory.EntityTypeId == entityTypeId && da.IsActive == isActive && -- 2.43.0 From 727df6e828eb4301930e0e85c9370c242a8de46f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 30 Aug 2025 10:27:42 +0530 Subject: [PATCH 29/63] Added the download permission to get persigned Url API --- .../Data/ApplicationDbContext.cs | 1 + ...ermission_To_Download_Document.Designer.cs | 5455 +++++++++++++++++ ...ded_New_Permission_To_Download_Document.cs | 211 + .../ApplicationDbContextModelSnapshot.cs | 34 +- .../Entitlements/PermissionsMaster.cs | 1 + .../Controllers/DocumentController.cs | 9 +- 6 files changed, 5697 insertions(+), 14 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index d7484b3..f3f8c39 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -1029,6 +1029,7 @@ namespace Marco.Pms.DataAccess.Data new FeaturePermission { Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Upload Document", Description = "Grants a user the authority to upload the document" }, new FeaturePermission { Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Mofify Document", Description = "Grants a user the authority to modify document" }, new FeaturePermission { Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Delete Document", Description = "Grants a user the authority to delete the document" }, + new FeaturePermission { Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Download Document", Description = "Grants a user the authority to download the document" }, new FeaturePermission { Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), IsEnabled = true, Name = "Verify Document", Description = "Grants a user the authority to verify the document" }, // Directory Management Feature diff --git a/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.Designer.cs new file mode 100644 index 0000000..bb6c3e0 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.Designer.cs @@ -0,0 +1,5455 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250830045512_Added_New_Permission_To_Download_Document")] + partial class Added_New_Permission_To_Download_Document + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2617), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2627), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2684), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2690), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2695), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2700), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2705), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2710), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2714), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2718), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2722), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2727), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2731), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCARuCNwDAREAAhEBAxEB/8QAHwABAAICAgMBAQAAAAAAAAAAAAoLCAkGBwMEBQEC/8QAbRABAAEEAQMBBAMFEQkKCgITAAIBAwQFBgcIERIJChMhFDG2F0FRd5YVGiIjMjc5VldhcXKBkcHU1RYZMziSobHT1xgkJSYnQlJUlPAoNFhil6WmtdHhKTU2ZZWkQ2Znc4KFoqNTdXaDhpOz/8QAHgEBAAICAgMBAAAAAAAAAAAAAAgJBwoEBgIDBQH/xAB4EQEAAgIBAgMEAQYTDwsOCwkAAQIDBAUGEQcSIQgJEzFBFCI3UWG1FRYyNThVVnFydXaBg5GUobO01BcYGSM2QlJUlZaxwdLT1SQlJjNTV2J30dbwJ0NldISFk6KjpKWyw+EoNGNkZmeCl6a2wsTxRHOGkkfF4//aAAwDAQACEQMRAD8An8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.cs b/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.cs new file mode 100644 index 0000000..2a8e7de --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250830045512_Added_New_Permission_To_Download_Document.cs @@ -0,0 +1,211 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_New_Permission_To_Download_Document : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2627)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2617)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2718)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2700)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2710)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2695)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2684)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2731)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2690)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2727)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2722)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2714)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2705)); + + migrationBuilder.InsertData( + table: "FeaturePermissions", + columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, + values: new object[] { new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), "Grants a user the authority to download the document", new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), true, "Download Document" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("404373d0-860f-490e-a575-1c086ffbce1d")); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8988)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8981)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9059)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9042)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9051)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9038)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9028)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9072)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9034)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9068)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9063)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9055)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9046)); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index af8ae76..94d6495 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -931,7 +931,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8981), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2617), Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), Name = "Project Documents", @@ -940,7 +940,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(8988), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2627), Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), Name = "Employee Documents", @@ -1026,7 +1026,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9028), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2684), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1041,7 +1041,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9034), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2690), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1056,7 +1056,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9038), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2695), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1071,7 +1071,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9042), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2700), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1086,7 +1086,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9046), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2705), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1101,7 +1101,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9051), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2710), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1115,7 +1115,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9055), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2714), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1129,7 +1129,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9059), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2718), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1143,7 +1143,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9063), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2722), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1157,7 +1157,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9068), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2727), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1171,7 +1171,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", - CreatedAt = new DateTime(2025, 8, 28, 11, 18, 55, 873, DateTimeKind.Utc).AddTicks(9072), + CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2731), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1586,6 +1586,14 @@ namespace Marco.Pms.DataAccess.Migrations Name = "Delete Document" }, new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new { Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), Description = "Grants a user the authority to verify the document", diff --git a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs index 08b5667..b8ab3f7 100644 --- a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs +++ b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs @@ -44,6 +44,7 @@ public static readonly Guid UploadDocument = Guid.Parse("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"); public static readonly Guid MofifyDocument = Guid.Parse("c423fd81-6273-4b9d-bb5e-76a0fb343833"); public static readonly Guid DeleteDocument = Guid.Parse("40863a13-5a66-469d-9b48-135bc5dbf486"); + public static readonly Guid DownloadDocument = Guid.Parse("404373d0-860f-490e-a575-1c086ffbce1d"); public static readonly Guid VerifyDocument = Guid.Parse("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"); } } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index cb0d5fc..798c255 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -464,7 +464,14 @@ namespace Marco.Pms.Services.Controllers _logger.LogWarning($"Version mapping not found for attachment ID: {id}"); return NotFound(ApiResponse.ErrorResponse("Version not found", "Version not found in database", 404)); } - + var _permission = scope.ServiceProvider.GetRequiredService(); + var hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id); + if (!hasDownloadPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId) + { + _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId} for downloading", + loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to download documents", 403)); + } var s3Service = scope.ServiceProvider.GetRequiredService(); // Resolve S3UploadService from the scope to generate pre-signed URL var preSignedUrl = s3Service.GeneratePreSignedUrl(versionMapping.ChildAttachment.Document.S3Key); -- 2.43.0 From b6243f8100482beafb859fdef15508c70d2d0853 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Sep 2025 12:09:34 +0530 Subject: [PATCH 30/63] Added the document category in details --- Marco.Pms.Services/Controllers/DocumentController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 798c255..0779a38 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -254,6 +254,7 @@ namespace Marco.Pms.Services.Controllers .ThenInclude(e => e!.JobRole) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) .FirstOrDefaultAsync(av => av.ChildAttachmentId == id && av.TenantId == tenantId); // If no mapping found, return 404 -- 2.43.0 From de4d62ba78dc59ed2c288a066def7393b414be67 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Sep 2025 20:56:25 +0530 Subject: [PATCH 31/63] added tags in documents details API --- .../DocumentManager/DocumentAttachmentDetailsVM.cs | 4 +++- .../ViewModels/DocumentManager/DocumentListVM.cs | 1 + Marco.Pms.Services/Controllers/DocumentController.cs | 12 ++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs index 26d3e78..38806ec 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs @@ -1,4 +1,5 @@ -using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.Dtos.DocumentManager; +using Marco.Pms.Model.ViewModels.Activities; namespace Marco.Pms.Model.ViewModels.DocumentManager { @@ -20,6 +21,7 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public BasicEmployeeVM? VerifiedBy { get; set; } public Guid EntityId { get; set; } public DocumentTypeVM? DocumentType { get; set; } + public List? Tags { get; set; } public bool IsActive { get; set; } = true; } } diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs index b27358c..32646f9 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentListVM.cs @@ -10,6 +10,7 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public string? Description { get; set; } public DateTime UploadedAt { get; set; } public Guid? ParentAttachmentId { get; set; } + public bool IsCurrentVersion { get; set; } public int Version { get; set; } public bool IsActive { get; set; } public bool? IsVerified { get; set; } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 0779a38..ed71155 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -273,12 +273,20 @@ namespace Marco.Pms.Services.Controllers loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId); return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to view documents", 403)); } - + var tags = await _context.AttachmentTagMappings + .Include(at => at.DocumentTag) + .Where(at => at.AttachmentId == versionMapping.ChildAttachmentId && at.TenantId == tenantId && at.DocumentTag != null) + .Select(at => new DocumentTagDto + { + Name = at.DocumentTag!.Name, + IsActive = true + }) + .ToListAsync(); // Map the domain entity to the view model var documentAttachmentVM = _mapper.Map(versionMapping.ChildAttachment); documentAttachmentVM.Version = versionMapping.Version; documentAttachmentVM.ParentAttachmentId = versionMapping.ParentAttachmentId; - + documentAttachmentVM.Tags = tags; _logger.LogInfo("Document details fetched successfully for AttachmentId: {AttachmentId}", id); // Return success response with document details -- 2.43.0 From 1d50d4987a0ba5541595ac54fe6559b261f70db9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 14:19:03 +0530 Subject: [PATCH 32/63] added the crud opration for document modules --- .../CreateDocumentCategoryDto.cs | 10 + .../DocumentManager/CreateDocumentTypeDto.cs | 14 + .../Controllers/MasterController.cs | 143 +-- Marco.Pms.Services/Helpers/MasterHelper.cs | 459 ---------- .../MappingProfiles/MappingProfile.cs | 2 + Marco.Pms.Services/Program.cs | 1 - Marco.Pms.Services/Service/MasterService.cs | 816 +++++++++++++++++- .../ServiceInterfaces/IMasterService.cs | 21 + 8 files changed, 906 insertions(+), 560 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentCategoryDto.cs create mode 100644 Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentTypeDto.cs delete mode 100644 Marco.Pms.Services/Helpers/MasterHelper.cs diff --git a/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentCategoryDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentCategoryDto.cs new file mode 100644 index 0000000..743c2cb --- /dev/null +++ b/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentCategoryDto.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.Dtos.DocumentManager +{ + public class CreateDocumentCategoryDto + { + public Guid? Id { get; set; } + public required string Name { get; set; } + public required string Description { get; set; } + public required Guid EntityTypeId { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentTypeDto.cs b/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentTypeDto.cs new file mode 100644 index 0000000..b32302a --- /dev/null +++ b/Marco.Pms.Model/Dtos/DocumentManager/CreateDocumentTypeDto.cs @@ -0,0 +1,14 @@ +namespace Marco.Pms.Model.Dtos.DocumentManager +{ + public class CreateDocumentTypeDto + { + public Guid? Id { get; set; } + public required string Name { get; set; } = string.Empty; + public string? RegexExpression { get; set; } + public required string AllowedContentType { get; set; } + public required double MaxSizeAllowedInMB { get; set; } = 2; + public bool IsValidationRequired { get; set; } + public bool IsMandatory { get; set; } + public required Guid DocumentCategoryId { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index bab2a5c..0c4e0e1 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -9,7 +9,6 @@ using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Forum; using Marco.Pms.Model.ViewModels.Master; -using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; @@ -27,15 +26,13 @@ namespace Marco.Pms.Services.Controllers private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; private readonly ILoggingService _logger; - private readonly MasterHelper _masterHelper; private readonly IMasterService _masterService; private readonly Guid tenantId; - public MasterController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, MasterHelper masterHelper, IMasterService masterService) + public MasterController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, IMasterService masterService) { _context = context; _userHelper = userHelper; _logger = logger; - _masterHelper = masterHelper; _masterService = masterService; tenantId = userHelper.GetTenantId(); } @@ -696,37 +693,32 @@ namespace Marco.Pms.Services.Controllers [HttpGet("work-status")] public async Task GetWorkStatusMasterList() { - var response = await _masterHelper.GetWorkStatusList(); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetWorkStatusList(loggedInEmpoyee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("work-status")] public async Task CreateWorkStatusMaster([FromBody] CreateWorkStatusMasterDto createWorkStatusDto) { - if (!ModelState.IsValid) - { - var errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => e.ErrorMessage) - .ToList(); - _logger.LogWarning("User sent Invalid Date while marking attendance"); - return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); - } - var response = await _masterHelper.CreateWorkStatus(createWorkStatusDto); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateWorkStatus(createWorkStatusDto, loggedInEmpoyee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("work-status/edit/{id}")] public async Task UpdateWorkStatusMaster(Guid id, [FromBody] UpdateWorkStatusMasterDto updateWorkStatusDto) { - var response = await _masterHelper.UpdateWorkStatus(id, updateWorkStatusDto); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateWorkStatus(id, updateWorkStatusDto, loggedInEmpoyee, tenantId); return StatusCode(response.StatusCode, response); } [HttpDelete("work-status/{id}")] public async Task DeleteWorkStatusMaster(Guid id) { - var response = await _masterHelper.DeleteWorkStatus(id); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteWorkStatus(id, loggedInEmpoyee, tenantId); return StatusCode(response.StatusCode, response); } @@ -737,68 +729,44 @@ namespace Marco.Pms.Services.Controllers [HttpGet("contact-categories")] public async Task GetContactCategoryMasterList() { - var response = await _masterHelper.GetContactCategoriesList(); - return Ok(response); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetContactCategoriesList(loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); } [HttpGet("contact-category/{id}")] public async Task GetContactCategoryMaster(Guid id) { - var response = await _masterHelper.GetContactCategoryById(id); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); - } + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetContactCategoryById(id, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } [HttpPost("contact-category")] public async Task CreateContactCategoryMaster([FromBody] CreateContactCategoryDto contactCategoryDto) { - var response = await _masterHelper.CreateContactCategory(contactCategoryDto); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 409) - { - return Conflict(response); - } - else - { - return BadRequest(response); - } + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateContactCategory(contactCategoryDto, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } [HttpPost("contact-category/edit/{id}")] public async Task UpdateContactCategoryMaster(Guid id, [FromBody] UpdateContactCategoryDto updateContactCategoryDto) { - var response = await _masterHelper.UpdateContactCategory(id, updateContactCategoryDto); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); - } + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateContactCategory(id, updateContactCategoryDto, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } [HttpDelete("contact-category/{id}")] public async Task DeletecontactCategoryMaster(Guid id) { - var response = await _masterHelper.DeleteContactCategory(id); - return Ok(response); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteContactCategory(id, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } #endregion @@ -808,61 +776,37 @@ namespace Marco.Pms.Services.Controllers [HttpGet("contact-tags")] public async Task GetContactTagMasterList() { - var response = await _masterHelper.GetContactTags(); - return Ok(response); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetContactTags(loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } [HttpPost("contact-tag")] public async Task CreateContactTagMaster([FromBody] CreateContactTagDto contactTagDto) { - if (!ModelState.IsValid) - { - var errors = ModelState.Values - .SelectMany(v => v.Errors) - .Select(e => e.ErrorMessage) - .ToList(); - _logger.LogWarning("User sent Invalid Date while marking attendance"); - return BadRequest(ApiResponse.ErrorResponse("Invalid data", errors, 400)); - } - var response = await _masterHelper.CreateContactTag(contactTagDto); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 409) - { - return Conflict(response); - } - else - { - return BadRequest(response); - } + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateContactTag(contactTagDto, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } [HttpPost("contact-tag/edit/{id}")] public async Task UpdateContactTagMaster(Guid id, [FromBody] UpdateContactTagDto updateContactTagDto) { - var response = await _masterHelper.UpdateContactTag(id, updateContactTagDto); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateContactTag(id, updateContactTagDto, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); - } } [HttpDelete("contact-tag/{id}")] public async Task DeletecontactTagMaster(Guid id) { - var response = await _masterHelper.DeleteContactTag(id); - return Ok(response); + var loggedInEmpoyee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteContactTag(id, loggedInEmpoyee, tenantId); + return StatusCode(response.StatusCode, response); + } #endregion @@ -961,6 +905,7 @@ namespace Marco.Pms.Services.Controllers } #endregion + #region =================================================================== Document Type APIs =================================================================== [HttpGet("document-type/list")] diff --git a/Marco.Pms.Services/Helpers/MasterHelper.cs b/Marco.Pms.Services/Helpers/MasterHelper.cs deleted file mode 100644 index d50a603..0000000 --- a/Marco.Pms.Services/Helpers/MasterHelper.cs +++ /dev/null @@ -1,459 +0,0 @@ -using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.Directory; -using Marco.Pms.Model.Dtos.Master; -using Marco.Pms.Model.Employees; -using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.Mapper; -using Marco.Pms.Model.Master; -using Marco.Pms.Model.Utilities; -using Marco.Pms.Model.ViewModels.Master; -using Marco.Pms.Services.Service; -using MarcoBMS.Services.Helpers; -using MarcoBMS.Services.Service; -using Microsoft.EntityFrameworkCore; - -namespace Marco.Pms.Services.Helpers -{ - public class MasterHelper - { - private readonly ApplicationDbContext _context; - private readonly ILoggingService _logger; - private readonly UserHelper _userHelper; - private readonly PermissionServices _permission; - private readonly Guid tenantId; - - public MasterHelper(ApplicationDbContext context, ILoggingService logger, UserHelper userHelper, PermissionServices permission) - { - _context = context; - _logger = logger; - _userHelper = userHelper; - _permission = permission; - tenantId = userHelper.GetTenantId(); - } - #region =================================================================== Contact Category APIs =================================================================== - - public async Task> CreateContactCategory(CreateContactCategoryDto contactCategoryDto) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (contactCategoryDto != null) - { - ContactCategoryMaster? existingContactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Name.ToLower() == (contactCategoryDto.Name != null ? contactCategoryDto.Name.ToLower() : "")); - if (existingContactCategory == null) - { - ContactCategoryMaster contactCategory = contactCategoryDto.ToContactCategoryMasterFromCreateContactCategoryDto(tenantId); - _context.ContactCategoryMasters.Add(contactCategory); - await _context.SaveChangesAsync(); - ContactCategoryVM categoryVM = contactCategory.ToContactCategoryVMFromContactCategoryMaster(); - - _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact category {ContactCategoryId}.", LoggedInEmployee.Id, contactCategory.Id); - return ApiResponse.SuccessResponse(categoryVM, "Category Created Successfully", 200); - } - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing contact category.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Category already existed", "Category already existed", 409); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateContactCategory(Guid id, UpdateContactCategoryDto contactCategoryDto) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (contactCategoryDto != null && id == contactCategoryDto.Id) - { - ContactCategoryMaster? contactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Id == id); - if (contactCategory != null) - { - contactCategory.Name = contactCategoryDto.Name ?? ""; - contactCategory.Description = contactCategoryDto.Description ?? ""; - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contactCategory.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - ContactCategoryVM categoryVM = contactCategory.ToContactCategoryVMFromContactCategoryMaster(); - - _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact category {ContactCategoryId}.", LoggedInEmployee.Id, contactCategory.Id); - return ApiResponse.SuccessResponse(categoryVM, "Category Created Successfully", 200); - } - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a contact category but not found in database.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Category not found", "Category not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> GetContactCategoriesList() - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - var categoryList = await _context.ContactCategoryMasters.Where(c => c.TenantId == tenantId).ToListAsync(); - List contactCategories = new List(); - foreach (var category in categoryList) - { - ContactCategoryVM categoryVM = category.ToContactCategoryVMFromContactCategoryMaster(); - contactCategories.Add(categoryVM); - } - _logger.LogInfo("{count} contact categoires are fetched by Employee with ID {LoggedInEmployeeId}", contactCategories.Count, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactCategories, System.String.Format("{0} contact categories fetched successfully", contactCategories.Count), 200); - } - public async Task> GetContactCategoryById(Guid id) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - var category = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); - if (category != null) - { - ContactCategoryVM categoryVM = category.ToContactCategoryVMFromContactCategoryMaster(); - _logger.LogInfo("Employee {EmployeeId} fetched contact category {ContactCategoryID}", LoggedInEmployee.Id, category.Id); - return ApiResponse.SuccessResponse(categoryVM, "Category fetched successfully", 200); - } - - _logger.LogWarning("Employee {EmployeeId} attempted to fetch contact category {ContactCategoryID} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("Category not found", "Category not found", 404); - } - public async Task> DeleteContactCategory(Guid id) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - ContactCategoryMaster? contactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); - if (contactCategory != null) - { - List? existingContacts = await _context.Contacts.AsNoTracking().Where(c => c.ContactCategoryId == contactCategory.Id).ToListAsync(); - if (existingContacts.Count > 0) - { - List? contacts = new List(); - foreach (var contact in existingContacts) - { - contact.ContactCategoryId = null; - contacts.Add(contact); - } - _context.Contacts.UpdateRange(contacts); - } - _context.ContactCategoryMasters.Remove(contactCategory); - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted contact category {ContactCategoryId}", LoggedInEmployee.Id, id); - } - - _logger.LogWarning("Employee {EmployeeId} tries to delete Category {CategoryId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Category deleted successfully", 200); - } - #endregion - - #region =================================================================== Contact Tag APIs =================================================================== - - public async Task> GetContactTags() - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - var taglist = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); - List contactTags = new List(); - foreach (var tag in taglist) - { - ContactTagVM tagVm = tag.ToContactTagVMFromContactTagMaster(); - contactTags.Add(tagVm); - } - _logger.LogInfo("{count} contact Tags are fetched by Employee with ID {LoggedInEmployeeId}", contactTags.Count, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactTags, System.String.Format("{0} contact tags fetched successfully", contactTags.Count), 200); - } - public async Task> CreateContactTag(CreateContactTagDto contactTagDto) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (contactTagDto != null) - { - ContactTagMaster? existingContactTag = await _context.ContactTagMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Name.ToLower() == (contactTagDto.Name != null ? contactTagDto.Name.ToLower() : "")); - if (existingContactTag == null) - { - ContactTagMaster contactTag = contactTagDto.ToContactTagMasterFromCreateContactTagDto(tenantId); - _context.ContactTagMasters.Add(contactTag); - await _context.SaveChangesAsync(); - ContactTagVM tagVM = contactTag.ToContactTagVMFromContactTagMaster(); - - _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact tag {ContactTagId}.", LoggedInEmployee.Id, contactTag.Id); - return ApiResponse.SuccessResponse(tagVM, "Tag Created Successfully", 200); - } - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing contact tag.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Tag already existed", "Tag already existed", 409); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateContactTag(Guid id, UpdateContactTagDto contactTagDto) - { - Employee LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (contactTagDto != null && contactTagDto.Id == id) - { - ContactTagMaster? contactTag = await _context.ContactTagMasters.AsNoTracking().FirstOrDefaultAsync(t => t.TenantId == tenantId && t.Id == contactTagDto.Id); - if (contactTag != null) - { - contactTag = contactTagDto.ToContactTagMasterFromUpdateContactTagDto(tenantId); - _context.ContactTagMasters.Update(contactTag); - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contactTag.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - await _context.SaveChangesAsync(); - - ContactTagVM contactTagVm = contactTag.ToContactTagVMFromContactTagMaster(); - - - - _logger.LogInfo("Contact tag master {ConatctTagId} updated successfully by employee {EmployeeId}", contactTagVm.Id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactTagVm, "Contact Tag master updated successfully", 200); - } - _logger.LogWarning("Contact Tag master {ContactTagId} not found in database", id); - return ApiResponse.ErrorResponse("Contact Tag master not found", "Contact tag master not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> DeleteContactTag(Guid id) - { - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - ContactTagMaster? contactTag = await _context.ContactTagMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); - if (contactTag != null) - { - List? tagMappings = await _context.ContactTagMappings.Where(t => t.ContactTagId == contactTag.Id).ToListAsync(); - - _context.ContactTagMasters.Remove(contactTag); - if (tagMappings.Any()) - { - _context.ContactTagMappings.RemoveRange(tagMappings); - } - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted contact tag {ContactTagId}", LoggedInEmployee.Id, id); - } - - _logger.LogWarning("Employee {EmployeeId} tries to delete Tag {ContactTagId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Tag deleted successfully", 200); - } - - #endregion - - #region =================================================================== Work Status APIs =================================================================== - - public async Task> GetWorkStatusList() - { - _logger.LogInfo("GetWorkStatusList called."); - - try - { - // Step 1: Get logged-in employee info - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - // Step 2: Check permission to view master data - bool hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewMasters, loggedInEmployee.Id); - if (!hasViewPermission) - { - _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have access", "Don't have access to take action", 403); - } - - // Step 3: Fetch work statuses for the tenant - var workStatusList = await _context.WorkStatusMasters - .Where(ws => ws.TenantId == tenantId) - .Select(ws => new - { - ws.Id, - ws.Name, - ws.Description, - ws.IsSystem - }) - .ToListAsync(); - - _logger.LogInfo("{Count} work statuses fetched for tenantId: {TenantId}", workStatusList.Count, tenantId); - - // Step 4: Return successful response - return ApiResponse.SuccessResponse( - workStatusList, - $"{workStatusList.Count} work status records fetched successfully", - 200 - ); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while fetching work status list"); - return ApiResponse.ErrorResponse("An error occurred", "Unable to fetch work status list", 500); - } - } - public async Task> CreateWorkStatus(CreateWorkStatusMasterDto createWorkStatusDto) - { - _logger.LogInfo("CreateWorkStatus called with Name: {Name}", createWorkStatusDto.Name ?? ""); - - try - { - // Step 1: Get logged-in employee - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - // Step 2: Check if user has permission to manage master data - var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); - if (!hasManageMasterPermission) - { - _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have access", "Don't have access to take action", 403); - } - - // Step 3: Check if work status with the same name already exists - var existingWorkStatus = await _context.WorkStatusMasters - .FirstOrDefaultAsync(ws => ws.Name == createWorkStatusDto.Name && ws.TenantId == tenantId); - - if (existingWorkStatus != null) - { - _logger.LogWarning("Work status already exists: {Name}", createWorkStatusDto.Name ?? ""); - return ApiResponse.ErrorResponse("Work status already exists", "Work status already exists", 400); - } - - // Step 4: Create new WorkStatusMaster entry - var workStatus = new WorkStatusMaster - { - Name = createWorkStatusDto.Name?.Trim() ?? "", - Description = createWorkStatusDto.Description?.Trim() ?? "", - IsSystem = false, - TenantId = tenantId - }; - - _context.WorkStatusMasters.Add(workStatus); - await _context.SaveChangesAsync(); - - _logger.LogInfo("Work status created successfully: {Id}, Name: {Name}", workStatus.Id, workStatus.Name); - return ApiResponse.SuccessResponse(workStatus, "Work status created successfully", 200); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while creating work status"); - return ApiResponse.ErrorResponse("An error occurred", "Unable to create work status", 500); - } - } - public async Task> UpdateWorkStatus(Guid id, UpdateWorkStatusMasterDto updateWorkStatusDto) - { - _logger.LogInfo("UpdateWorkStatus called for WorkStatus ID: {Id}, New Name: {Name}", id, updateWorkStatusDto.Name ?? ""); - - try - { - // Step 1: Validate input - if (id == Guid.Empty || id != updateWorkStatusDto.Id) - { - _logger.LogWarning("Invalid ID provided for update. Route ID: {RouteId}, DTO ID: {DtoId}", id, updateWorkStatusDto.Id); - return ApiResponse.ErrorResponse("Invalid data provided", "The provided work status ID is invalid", 400); - } - - // Step 2: Get logged-in employee - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - // Step 3: Check permissions - var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); - if (!hasManageMasterPermission) - { - _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have Manage Master permission.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access denied", "You do not have permission to update this work status", 403); - } - - // Step 4: Retrieve the work status record - var workStatus = await _context.WorkStatusMasters - .FirstOrDefaultAsync(ws => ws.Id == id && ws.TenantId == tenantId); - - if (workStatus == null) - { - _logger.LogWarning("Work status not found for ID: {Id}", id); - return ApiResponse.ErrorResponse("Work status not found", "No work status found with the provided ID", 404); - } - - // Step 5: Check for duplicate name (optional) - var isDuplicate = await _context.WorkStatusMasters - .AnyAsync(ws => ws.Name == updateWorkStatusDto.Name && ws.Id != id && ws.TenantId == tenantId); - - if (isDuplicate) - { - _logger.LogWarning("Duplicate work status name '{Name}' detected during update. ID: {Id}", updateWorkStatusDto.Name ?? "", id); - return ApiResponse.ErrorResponse("Work status with the same name already exists", "Duplicate name", 400); - } - - // Step 6: Update fields - workStatus.Name = updateWorkStatusDto.Name?.Trim() ?? ""; - workStatus.Description = updateWorkStatusDto.Description?.Trim() ?? ""; - - await _context.SaveChangesAsync(); - - _logger.LogInfo("Work status updated successfully. ID: {Id}", id); - return ApiResponse.SuccessResponse(workStatus, "Work status updated successfully", 200); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while updating work status ID: {Id}", id); - return ApiResponse.ErrorResponse("An error occurred", "Unable to update the work status at this time", 500); - } - } - public async Task> DeleteWorkStatus(Guid id) - { - _logger.LogInfo("DeleteWorkStatus called for Id: {Id}", id); - - try - { - // Step 1: Get logged-in employee - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - // Step 2: Check permission to manage master data - var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); - if (!hasManageMasterPermission) - { - _logger.LogWarning("Delete denied. EmployeeId: {EmployeeId} lacks Manage_Master permission.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have access", "Access denied for deleting work status", 403); - } - - // Step 3: Find the work status - var workStatus = await _context.WorkStatusMasters - .FirstOrDefaultAsync(ws => ws.Id == id && ws.TenantId == tenantId); - - if (workStatus == null) - { - _logger.LogWarning("Work status not found for Id: {Id}", id); - return ApiResponse.ErrorResponse("Work status not found", "Work status not found", 404); - } - - // Step 4: Check for dependencies in TaskAllocations - bool hasDependency = await _context.TaskAllocations - .AnyAsync(ta => ta.TenantId == tenantId && ta.WorkStatusId == id); - - if (hasDependency) - { - _logger.LogWarning("Cannot delete WorkStatus Id: {Id} due to existing task dependency", id); - return ApiResponse.ErrorResponse( - "Work status has a dependency in assigned tasks and cannot be deleted", - "Deletion failed due to associated tasks", - 400 - ); - } - - // Step 5: Delete and persist - _context.WorkStatusMasters.Remove(workStatus); - await _context.SaveChangesAsync(); - - _logger.LogInfo("Work status deleted successfully. Id: {Id}", id); - return ApiResponse.SuccessResponse(new { }, "Work status deleted successfully", 200); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while deleting WorkStatus Id: {Id}", id); - return ApiResponse.ErrorResponse("An error occurred", "Unable to delete work status", 500); - } - } - - #endregion - } -} diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 8549bcf..d58ebe1 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -314,8 +314,10 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); + CreateMap(); CreateMap(); + CreateMap(); #endregion diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 0b06de0..811c3de 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -186,7 +186,6 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 290ec3d..1e3ede3 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1,10 +1,13 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; +using Marco.Pms.Model.Directory; using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Mapper; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; @@ -46,6 +49,410 @@ namespace Marco.Pms.Services.Service _cache = cache; } + #region =================================================================== Contact Category APIs =================================================================== + + public async Task> CreateContactCategory(CreateContactCategoryDto contactCategoryDto, Employee loggedInEmployee, Guid tenantId) + { + if (contactCategoryDto != null) + { + ContactCategoryMaster? existingContactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Name.ToLower() == (contactCategoryDto.Name != null ? contactCategoryDto.Name.ToLower() : "")); + if (existingContactCategory == null) + { + ContactCategoryMaster contactCategory = contactCategoryDto.ToContactCategoryMasterFromCreateContactCategoryDto(tenantId); + _context.ContactCategoryMasters.Add(contactCategory); + await _context.SaveChangesAsync(); + ContactCategoryVM categoryVM = contactCategory.ToContactCategoryVMFromContactCategoryMaster(); + + _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact category {ContactCategoryId}.", loggedInEmployee.Id, contactCategory.Id); + return ApiResponse.SuccessResponse(categoryVM, "Category Created Successfully", 200); + } + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing contact category.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Category already existed", "Category already existed", 409); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> UpdateContactCategory(Guid id, UpdateContactCategoryDto contactCategoryDto, Employee loggedInEmployee, Guid tenantId) + { + if (contactCategoryDto != null && id == contactCategoryDto.Id) + { + ContactCategoryMaster? contactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Id == id); + if (contactCategory != null) + { + contactCategory.Name = contactCategoryDto.Name ?? ""; + contactCategory.Description = contactCategoryDto.Description ?? ""; + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contactCategory.Id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + + await _context.SaveChangesAsync(); + ContactCategoryVM categoryVM = contactCategory.ToContactCategoryVMFromContactCategoryMaster(); + + _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact category {ContactCategoryId}.", loggedInEmployee.Id, contactCategory.Id); + return ApiResponse.SuccessResponse(categoryVM, "Category Created Successfully", 200); + } + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a contact category but not found in database.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Category not found", "Category not found", 404); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> GetContactCategoriesList(Employee loggedInEmployee, Guid tenantId) + { + var categoryList = await _context.ContactCategoryMasters.Where(c => c.TenantId == tenantId).ToListAsync(); + List contactCategories = new List(); + foreach (var category in categoryList) + { + ContactCategoryVM categoryVM = category.ToContactCategoryVMFromContactCategoryMaster(); + contactCategories.Add(categoryVM); + } + _logger.LogInfo("{count} contact categoires are fetched by Employee with ID {LoggedInEmployeeId}", contactCategories.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactCategories, System.String.Format("{0} contact categories fetched successfully", contactCategories.Count), 200); + } + public async Task> GetContactCategoryById(Guid id, Employee loggedInEmployee, Guid tenantId) + { + var category = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); + if (category != null) + { + ContactCategoryVM categoryVM = category.ToContactCategoryVMFromContactCategoryMaster(); + _logger.LogInfo("Employee {EmployeeId} fetched contact category {ContactCategoryID}", loggedInEmployee.Id, category.Id); + return ApiResponse.SuccessResponse(categoryVM, "Category fetched successfully", 200); + } + + _logger.LogWarning("Employee {EmployeeId} attempted to fetch contact category {ContactCategoryID} but not found in database", loggedInEmployee.Id, id); + return ApiResponse.ErrorResponse("Category not found", "Category not found", 404); + } + public async Task> DeleteContactCategory(Guid id, Employee loggedInEmployee, Guid tenantId) + { + ContactCategoryMaster? contactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); + if (contactCategory != null) + { + List? existingContacts = await _context.Contacts.AsNoTracking().Where(c => c.ContactCategoryId == contactCategory.Id).ToListAsync(); + if (existingContacts.Count > 0) + { + List? contacts = new List(); + foreach (var contact in existingContacts) + { + contact.ContactCategoryId = null; + contacts.Add(contact); + } + _context.Contacts.UpdateRange(contacts); + } + _context.ContactCategoryMasters.Remove(contactCategory); + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + await _context.SaveChangesAsync(); + _logger.LogInfo("Employee {EmployeeId} deleted contact category {ContactCategoryId}", loggedInEmployee.Id, id); + } + + _logger.LogWarning("Employee {EmployeeId} tries to delete Category {CategoryId} but not found in database", loggedInEmployee.Id, id); + return ApiResponse.SuccessResponse(new { }, "Category deleted successfully", 200); + } + #endregion + + #region =================================================================== Contact Tag APIs =================================================================== + + public async Task> GetContactTags(Employee loggedInEmployee, Guid tenantId) + { + var taglist = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); + List contactTags = new List(); + foreach (var tag in taglist) + { + ContactTagVM tagVm = tag.ToContactTagVMFromContactTagMaster(); + contactTags.Add(tagVm); + } + _logger.LogInfo("{count} contact Tags are fetched by Employee with ID {LoggedInEmployeeId}", contactTags.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactTags, System.String.Format("{0} contact tags fetched successfully", contactTags.Count), 200); + } + public async Task> CreateContactTag(CreateContactTagDto contactTagDto, Employee loggedInEmployee, Guid tenantId) + { + if (contactTagDto != null) + { + ContactTagMaster? existingContactTag = await _context.ContactTagMasters.FirstOrDefaultAsync(c => c.TenantId == tenantId && c.Name.ToLower() == (contactTagDto.Name != null ? contactTagDto.Name.ToLower() : "")); + if (existingContactTag == null) + { + ContactTagMaster contactTag = contactTagDto.ToContactTagMasterFromCreateContactTagDto(tenantId); + _context.ContactTagMasters.Add(contactTag); + await _context.SaveChangesAsync(); + ContactTagVM tagVM = contactTag.ToContactTagVMFromContactTagMaster(); + + _logger.LogInfo("Employee ID {LoggedInEmployeeId} created a contact tag {ContactTagId}.", loggedInEmployee.Id, contactTag.Id); + return ApiResponse.SuccessResponse(tagVM, "Tag Created Successfully", 200); + } + _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing contact tag.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Tag already existed", "Tag already existed", 409); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> UpdateContactTag(Guid id, UpdateContactTagDto contactTagDto, Employee loggedInEmployee, Guid tenantId) + { + if (contactTagDto != null && contactTagDto.Id == id) + { + ContactTagMaster? contactTag = await _context.ContactTagMasters.AsNoTracking().FirstOrDefaultAsync(t => t.TenantId == tenantId && t.Id == contactTagDto.Id); + if (contactTag != null) + { + contactTag = contactTagDto.ToContactTagMasterFromUpdateContactTagDto(tenantId); + _context.ContactTagMasters.Update(contactTag); + + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = contactTag.Id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + await _context.SaveChangesAsync(); + await _context.SaveChangesAsync(); + + ContactTagVM contactTagVm = contactTag.ToContactTagVMFromContactTagMaster(); + + + + _logger.LogInfo("Contact tag master {ConatctTagId} updated successfully by employee {EmployeeId}", contactTagVm.Id, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(contactTagVm, "Contact Tag master updated successfully", 200); + } + _logger.LogWarning("Contact Tag master {ContactTagId} not found in database", id); + return ApiResponse.ErrorResponse("Contact Tag master not found", "Contact tag master not found", 404); + } + _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); + } + public async Task> DeleteContactTag(Guid id, Employee loggedInEmployee, Guid tenantId) + { + ContactTagMaster? contactTag = await _context.ContactTagMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); + if (contactTag != null) + { + List? tagMappings = await _context.ContactTagMappings.Where(t => t.ContactTagId == contactTag.Id).ToListAsync(); + + _context.ContactTagMasters.Remove(contactTag); + if (tagMappings.Any()) + { + _context.ContactTagMappings.RemoveRange(tagMappings); + } + _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog + { + RefereanceId = id, + UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow + }); + await _context.SaveChangesAsync(); + _logger.LogInfo("Employee {EmployeeId} deleted contact tag {ContactTagId}", loggedInEmployee.Id, id); + } + + _logger.LogWarning("Employee {EmployeeId} tries to delete Tag {ContactTagId} but not found in database", loggedInEmployee.Id, id); + return ApiResponse.SuccessResponse(new { }, "Tag deleted successfully", 200); + } + + #endregion + + #region =================================================================== Work Status APIs =================================================================== + + public async Task> GetWorkStatusList(Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("GetWorkStatusList called."); + + try + { + // Step 1: Check permission to view master data + bool hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewMasters, loggedInEmployee.Id); + if (!hasViewPermission) + { + _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have access", "Don't have access to take action", 403); + } + + // Step 2: Fetch work statuses for the tenant + var workStatusList = await _context.WorkStatusMasters + .Where(ws => ws.TenantId == tenantId) + .Select(ws => new + { + ws.Id, + ws.Name, + ws.Description, + ws.IsSystem + }) + .ToListAsync(); + + _logger.LogInfo("{Count} work statuses fetched for tenantId: {TenantId}", workStatusList.Count, tenantId); + + // Step 3: Return successful response + return ApiResponse.SuccessResponse( + workStatusList, + $"{workStatusList.Count} work status records fetched successfully", + 200 + ); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while fetching work status list"); + return ApiResponse.ErrorResponse("An error occurred", "Unable to fetch work status list", 500); + } + } + public async Task> CreateWorkStatus(CreateWorkStatusMasterDto createWorkStatusDto, Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("CreateWorkStatus called with Name: {Name}", createWorkStatusDto.Name ?? ""); + + try + { + + // Step 1: Check if user has permission to manage master data + var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManageMasterPermission) + { + _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have access", "Don't have access to take action", 403); + } + + // Step 2: Check if work status with the same name already exists + var existingWorkStatus = await _context.WorkStatusMasters + .FirstOrDefaultAsync(ws => ws.Name == createWorkStatusDto.Name && ws.TenantId == tenantId); + + if (existingWorkStatus != null) + { + _logger.LogWarning("Work status already exists: {Name}", createWorkStatusDto.Name ?? ""); + return ApiResponse.ErrorResponse("Work status already exists", "Work status already exists", 400); + } + + // Step 3: Create new WorkStatusMaster entry + var workStatus = new WorkStatusMaster + { + Name = createWorkStatusDto.Name?.Trim() ?? "", + Description = createWorkStatusDto.Description?.Trim() ?? "", + IsSystem = false, + TenantId = tenantId + }; + + _context.WorkStatusMasters.Add(workStatus); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Work status created successfully: {Id}, Name: {Name}", workStatus.Id, workStatus.Name); + return ApiResponse.SuccessResponse(workStatus, "Work status created successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while creating work status"); + return ApiResponse.ErrorResponse("An error occurred", "Unable to create work status", 500); + } + } + public async Task> UpdateWorkStatus(Guid id, UpdateWorkStatusMasterDto updateWorkStatusDto, Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("UpdateWorkStatus called for WorkStatus ID: {Id}, New Name: {Name}", id, updateWorkStatusDto.Name ?? ""); + + try + { + // Step 1: Validate input + if (id == Guid.Empty || id != updateWorkStatusDto.Id) + { + _logger.LogWarning("Invalid ID provided for update. Route ID: {RouteId}, DTO ID: {DtoId}", id, updateWorkStatusDto.Id); + return ApiResponse.ErrorResponse("Invalid data provided", "The provided work status ID is invalid", 400); + } + + // Step 2: Check permissions + var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManageMasterPermission) + { + _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have Manage Master permission.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access denied", "You do not have permission to update this work status", 403); + } + + // Step 3: Retrieve the work status record + var workStatus = await _context.WorkStatusMasters + .FirstOrDefaultAsync(ws => ws.Id == id && ws.TenantId == tenantId); + + if (workStatus == null) + { + _logger.LogWarning("Work status not found for ID: {Id}", id); + return ApiResponse.ErrorResponse("Work status not found", "No work status found with the provided ID", 404); + } + + // Step 4: Check for duplicate name (optional) + var isDuplicate = await _context.WorkStatusMasters + .AnyAsync(ws => ws.Name == updateWorkStatusDto.Name && ws.Id != id && ws.TenantId == tenantId); + + if (isDuplicate) + { + _logger.LogWarning("Duplicate work status name '{Name}' detected during update. ID: {Id}", updateWorkStatusDto.Name ?? "", id); + return ApiResponse.ErrorResponse("Work status with the same name already exists", "Duplicate name", 400); + } + + // Step 5: Update fields + workStatus.Name = updateWorkStatusDto.Name?.Trim() ?? ""; + workStatus.Description = updateWorkStatusDto.Description?.Trim() ?? ""; + + await _context.SaveChangesAsync(); + + _logger.LogInfo("Work status updated successfully. ID: {Id}", id); + return ApiResponse.SuccessResponse(workStatus, "Work status updated successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while updating work status ID: {Id}", id); + return ApiResponse.ErrorResponse("An error occurred", "Unable to update the work status at this time", 500); + } + } + public async Task> DeleteWorkStatus(Guid id, Employee loggedInEmployee, Guid tenantId) + { + _logger.LogInfo("DeleteWorkStatus called for Id: {Id}", id); + + try + { + // Step 2: Check permission to manage master data + var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManageMasterPermission) + { + _logger.LogWarning("Delete denied. EmployeeId: {EmployeeId} lacks Manage_Master permission.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You don't have access", "Access denied for deleting work status", 403); + } + + // Step 3: Find the work status + var workStatus = await _context.WorkStatusMasters + .FirstOrDefaultAsync(ws => ws.Id == id && ws.TenantId == tenantId); + + if (workStatus == null) + { + _logger.LogWarning("Work status not found for Id: {Id}", id); + return ApiResponse.ErrorResponse("Work status not found", "Work status not found", 404); + } + + // Step 4: Check for dependencies in TaskAllocations + bool hasDependency = await _context.TaskAllocations + .AnyAsync(ta => ta.TenantId == tenantId && ta.WorkStatusId == id); + + if (hasDependency) + { + _logger.LogWarning("Cannot delete WorkStatus Id: {Id} due to existing task dependency", id); + return ApiResponse.ErrorResponse( + "Work status has a dependency in assigned tasks and cannot be deleted", + "Deletion failed due to associated tasks", + 400 + ); + } + + // Step 5: Delete and persist + _context.WorkStatusMasters.Remove(workStatus); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Work status deleted successfully. Id: {Id}", id); + return ApiResponse.SuccessResponse(new { }, "Work status deleted successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while deleting WorkStatus Id: {Id}", id); + return ApiResponse.ErrorResponse("An error occurred", "Unable to delete work status", 500); + } + } + + #endregion + #region =================================================================== Expenses Type APIs =================================================================== public async Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive) @@ -442,7 +849,7 @@ namespace Marco.Pms.Services.Service var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); if (!hasManagePermission) { - _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPENSE STATUS MASTER.", loggedInEmployee.Id); + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing PAYMENT MODE MASTER.", loggedInEmployee.Id); return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } @@ -542,6 +949,206 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Server Error", "Server Error occured", 500); } } + public async Task> CreateDocumentCategoryMasterAsync(CreateDocumentCategoryDto model, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to add new Document Category in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing Document Category Master.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + + } + var oldExists = await _context.DocumentCategoryMasters + .AnyAsync(dc => dc.Name == model.Name && dc.EntityTypeId == model.EntityTypeId && dc.TenantId == tenantId); + if (oldExists) + { + _logger.LogWarning("Document Category of {Name} is already exists in database for {TenantId}", model.Name, tenantId); + return ApiResponse.ErrorResponse("Document Category already exists.", "Document Category already exists in database", 409); + } + // Mapping the DTO to Document Category Master Model + var documentCategory = _mapper.Map(model); + documentCategory.CreatedAt = DateTime.UtcNow; + documentCategory.TenantId = tenantId; + + _context.DocumentCategoryMasters.Add(documentCategory); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Document Category {DocumentCategoryId} was added by employee {EmployeeId}", documentCategory.Id, loggedInEmployee.Id); + + // Mapping the Document Category Master Model to View Model + var response = _mapper.Map(documentCategory); + return ApiResponse.SuccessResponse(response, "Document Category craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while adding new Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } + public async Task> UpdateDocumentCategoryMasterAsync(Guid id, CreateDocumentCategoryDto model, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to update Document Category in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Checking permssion for managing masters + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing DOCUMENT CATEGORY MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + // Validating the prvided data + if (model.Id != id) + { + _logger.LogWarning("Employee {EmployeeId} provide different Ids in payload and path variable", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid Data", "User has send invalid payload", 400); + } + + var categoryTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.DocumentCategoryMasters.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); + }); + var oldCategoryExistsTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.DocumentCategoryMasters.AnyAsync(dc => dc.Name == model.Name && dc.EntityTypeId == model.EntityTypeId && dc.TenantId == tenantId); + }); + + await Task.WhenAll(categoryTask, oldCategoryExistsTask); + + var documentCategory = categoryTask.Result; + var oldCategoryExists = oldCategoryExistsTask.Result; + + // Checking if Document Category exists + if (documentCategory == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to update Document Category, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Document Category not found", "Document Category not found", 404); + } + if (oldCategoryExists) + { + _logger.LogWarning("Document Category of {Name} is already exists in database for {TenantId} while updating document category", model.Name, tenantId); + return ApiResponse.ErrorResponse("Document Category already exists.", "Document Category already exists in database", 409); + } + + // Mapping DocumentCategoryMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(documentCategory); + + // Mapping DocumentCategoryDto to DocumentCategoryMaster + _mapper.Map(model, documentCategory); + + _context.DocumentCategoryMasters.Update(documentCategory); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Document Category {DocumentCategoryId} was updated by employee {EmployeeId}", documentCategory.Id, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentCategory.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "DocumentCategoryModificationLog"); + + // Mapping DocumentCategoryMaster to DocumentCategoryVM + var response = _mapper.Map(documentCategory); + return ApiResponse.SuccessResponse(response, "Document Category updated Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while updating Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while updating Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } + public async Task> DeleteDocumentCategoryMasterAsync(Guid id, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to delete Document Category in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Checking permssion for managing masters + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing DOCUMENT CATEGORY MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var documentCategory = await _context.DocumentCategoryMasters.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if Document Category exists + if (documentCategory == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to delete Document Category, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Document Category not found", "Document Category not found", 404); + } + + // Mapping DocumentCategoryMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(documentCategory); + + _context.DocumentCategoryMasters.Remove(documentCategory); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Document Category {DocumentCategoryId} was deleted by employee {EmployeeId}", documentCategory.Id, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentCategory.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "DocumentCategoryModificationLog"); + + // Mapping DocumentCategoryMatser to DocumentCategoryVM + var response = _mapper.Map(documentCategory); + return ApiResponse.SuccessResponse(response, "Document Category deleted Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while deleteing Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while deleteing Document Category by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } #endregion @@ -590,7 +1197,214 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Server Error", "Server Error occured", 500); } } + public async Task> CreateDocumentTypeMasterAsync(CreateDocumentTypeDto model, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to add new Document Type in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing DOCUMENT TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + var oldExists = await _context.DocumentTypeMasters + .AnyAsync(dt => dt.Name == model.Name && dt.DocumentCategoryId == model.DocumentCategoryId && dt.TenantId == tenantId); + if (oldExists) + { + _logger.LogWarning("Document Type of {Name} is already exists in database for {TenantId} while creating new document type", model.Name, tenantId); + return ApiResponse.ErrorResponse("Document Type already exists.", "Document Type already exists in database", 409); + } + // Mapping the DTO to Document Type Master Model + var documentType = _mapper.Map(model); + if (string.IsNullOrWhiteSpace(model.RegexExpression)) + { + documentType.IsValidationRequired = false; + } + documentType.IsSystem = false; + documentType.IsActive = true; + documentType.CreatedAt = DateTime.UtcNow; + documentType.TenantId = tenantId; + + _context.DocumentTypeMasters.Add(documentType); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Document Type {DocumentTypeId} was added by employee {EmployeeId}", documentType.Id, loggedInEmployee.Id); + + // Mapping the Document Type Master Model to View Model + var response = _mapper.Map(documentType); + return ApiResponse.SuccessResponse(response, "Document Type craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new Document Type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while adding new Document Type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } + public async Task> UpdateDocumentTypeMasterAsync(Guid id, CreateDocumentTypeDto model, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to update Document Type in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Checking permssion for managing masters + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing DOCUMENT TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + // Validating the prvided data + if (model.Id != id) + { + _logger.LogWarning("Employee {EmployeeId} provide different Ids in payload and path variable", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid Data", "User has send invalid payload", 400); + } + + var documentTypeTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.DocumentTypeMasters.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); + }); + var oldTypeExistsTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.DocumentTypeMasters + .AnyAsync(dt => dt.Name == model.Name && dt.DocumentCategoryId == model.DocumentCategoryId && dt.TenantId == tenantId); + }); + + await Task.WhenAll(documentTypeTask, oldTypeExistsTask); + + var documentType = documentTypeTask.Result; + var oldTypeExists = oldTypeExistsTask.Result; + + // Checking if Document Type exists + if (documentType == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to update Document Type, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Document Type not found", "Document Type not found", 404); + } + if (oldTypeExists) + { + _logger.LogWarning("Document Type of {Name} is already exists in database for {TenantId} while updating document Type", model.Name, tenantId); + return ApiResponse.ErrorResponse("Document Type already exists.", "Document Type already exists in database", 409); + } + + // Mapping DocumentTypeMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(documentType); + + // Mapping DocumentTypeDto to DocumentTypeMaster + _mapper.Map(model, documentType); + + _context.DocumentTypeMasters.Update(documentType); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Document Type {DocumentTypeId} was updated by employee {EmployeeId}", documentType.Id, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentType.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "DocumentTypeModificationLog"); + + // Mapping DocumentTypeMaster to DocumentTypeVM + var response = _mapper.Map(documentType); + return ApiResponse.SuccessResponse(response, "Document Type updated Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while updating Document Type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while updating Document Type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } + public async Task> DeleteDocumentTypeMasterAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + string action = isActive ? "restore" : "delete"; + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to {Action} Document Type in different tenant", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Checking permssion for managing masters + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing DOCUMENT TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var documentType = await _context.DocumentTypeMasters.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if Document Type exists + if (documentType == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} Document Type, but not found in database", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Document Type not found", "Document Type not found", 404); + } + + // Mapping DocumentTypeMatser to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(documentType); + + documentType.IsActive = isActive; + await _context.SaveChangesAsync(); + + _logger.LogInfo("Document Type {DocumentTypeId} was {Action}d by employee {EmployeeId}", documentType.Id, action, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = documentType.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "DocumentTypeModificationLog"); + + // Mapping DocumentTypeMatser to DocumentTypeVM + var response = _mapper.Map(documentType); + return ApiResponse.SuccessResponse(response, $"Document Type {action}d Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while {Action}ing Document Type by employee {EmployeeId}", action, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while {Action}ing Document Type by employee {EmployeeId}", action, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index c85b183..b39abfd 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -6,6 +6,27 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IMasterService { + #region =================================================================== Contact Category APIs =================================================================== + Task> CreateContactCategory(CreateContactCategoryDto contactCategoryDto, Employee loggedInEmployee, Guid tenantId); + Task> UpdateContactCategory(Guid id, UpdateContactCategoryDto contactCategoryDto, Employee loggedInEmployee, Guid tenantId); + Task> GetContactCategoriesList(Employee loggedInEmployee, Guid tenantId); + Task> GetContactCategoryById(Guid id, Employee loggedInEmployee, Guid tenantId); + Task> DeleteContactCategory(Guid id, Employee loggedInEmployee, Guid tenantId); + #endregion + #region =================================================================== Contact Tag APIs =================================================================== + Task> GetContactTags(Employee loggedInEmployee, Guid tenantId); + Task> CreateContactTag(CreateContactTagDto contactTagDto, Employee loggedInEmployee, Guid tenantId); + Task> UpdateContactTag(Guid id, UpdateContactTagDto contactTagDto, Employee loggedInEmployee, Guid tenantId); + Task> DeleteContactTag(Guid id, Employee loggedInEmployee, Guid tenantId); + + #endregion + #region =================================================================== Work Status APIs =================================================================== + Task> GetWorkStatusList(Employee loggedInEmployee, Guid tenantId); + Task> CreateWorkStatus(CreateWorkStatusMasterDto createWorkStatusDto, Employee loggedInEmployee, Guid tenantId); + Task> UpdateWorkStatus(Guid id, UpdateWorkStatusMasterDto updateWorkStatusDto, Employee loggedInEmployee, Guid tenantId); + Task> DeleteWorkStatus(Guid id, Employee loggedInEmployee, Guid tenantId); + #endregion + #region =================================================================== Expenses Type APIs =================================================================== Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive); Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From c199e3e241a2c1deda4db969f35d8c3f005fc6d6 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 14:36:42 +0530 Subject: [PATCH 33/63] Added the end-point for maste APIs of document modules --- .../Controllers/MasterController.cs | 49 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 17 ++++--- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 0c4e0e1..7b9baeb 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -1,5 +1,6 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Activities; +using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Forum; @@ -904,6 +905,30 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpPost("document-category")] + public async Task CreateDocumentCategoryMaster([FromBody] CreateDocumentCategoryDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateDocumentCategoryMasterAsync(dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpPut("document-category/edit/{id}")] + public async Task UpdateDocumentCategoryMaster(Guid id, [FromBody] CreateDocumentCategoryDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateDocumentCategoryMasterAsync(id, dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpDelete("document-category/delete/{id}")] + public async Task DeleteDocumentCategoryMaster(Guid id) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteDocumentCategoryMasterAsync(id, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Document Type APIs =================================================================== @@ -916,6 +941,30 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpPost("document-type")] + public async Task CreateDocumentTypeMaster([FromBody] CreateDocumentTypeDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateDocumentTypeMasterAsync(dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpPut("document-type/edit/{id}")] + public async Task UpdateDocumentTypeMaster(Guid id, [FromBody] CreateDocumentTypeDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateDocumentTypeMasterAsync(id, dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + + [HttpDelete("document-type/delete/{id}")] + public async Task DeleteDocumentTypeMaster(Guid id, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteDocumentTypeMasterAsync(id, isActive, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index b39abfd..6ef4310 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -1,4 +1,5 @@ -using Marco.Pms.Model.Dtos.Master; +using Marco.Pms.Model.Dtos.DocumentManager; +using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Utilities; @@ -50,17 +51,17 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Document Category APIs =================================================================== Task> GetDocumentCategoryMasterListAsync(Guid? entityTypeId, Employee loggedInEmployee, Guid tenantId); - //Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); - //Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); - //Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); + Task> CreateDocumentCategoryMasterAsync(CreateDocumentCategoryDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdateDocumentCategoryMasterAsync(Guid id, CreateDocumentCategoryDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteDocumentCategoryMasterAsync(Guid id, Employee loggedInEmployee, Guid tenantId); #endregion + #region =================================================================== Document Type APIs =================================================================== Task> GetDocumentTypeMasterListAsync(Guid? documentCategoryId, Employee loggedInEmployee, Guid tenantId); - //Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); - //Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); - //Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); - + Task> CreateDocumentTypeMasterAsync(CreateDocumentTypeDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdateDocumentTypeMasterAsync(Guid id, CreateDocumentTypeDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteDocumentTypeMasterAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion } } -- 2.43.0 From 067da422c2c4f1691db4177477d13b3382b61640 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 14:46:51 +0530 Subject: [PATCH 34/63] Added the pagenantion to get version list API --- Marco.Pms.Services/Controllers/DocumentController.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index ed71155..415cec5 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -383,7 +383,7 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("list/versions/{parentAttachmentId}")] - public async Task GetListAllVersionsAsync(Guid parentAttachmentId) + public async Task GetListAllVersionsAsync(Guid parentAttachmentId, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { _logger.LogInfo("Start fetching document versions for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); @@ -410,6 +410,9 @@ namespace Marco.Pms.Services.Controllers .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UpdatedBy) .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId) + .OrderByDescending(da => da.ChildAttachment!.UploadedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) .ToListAsync(); var entityId = versionMappings.Select(av => av.ChildAttachment?.EntityId).FirstOrDefault(); -- 2.43.0 From 830a9526dd0ecfbc76fbdb0c41fe0fcdf8661dea Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 15:29:48 +0530 Subject: [PATCH 35/63] Added the total page and count in list APis for documnets --- .../Dtos/Util/ProjctLevelPermissionDto.cs | 11 ++++++ .../ProjectLevelPermissionMapping.cs | 28 +++++++++++++++ .../Controllers/DocumentController.cs | 35 ++++++++++++++++--- Marco.Pms.Services/Service/ProjectServices.cs | 32 +++++++++++++++++ 4 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs create mode 100644 Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs diff --git a/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs new file mode 100644 index 0000000..06a7710 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs @@ -0,0 +1,11 @@ +using Marco.Pms.Model.Dtos.Roles; + +namespace Marco.Pms.Model.Dtos.Util +{ + public class ProjctLevelPermissionDto + { + public Guid EmployeeId { get; set; } + public Guid ProjectId { get; set; } + public FeaturesPermissionDto? Permission { get; set; } + } +} diff --git a/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs b/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs new file mode 100644 index 0000000..e33a740 --- /dev/null +++ b/Marco.Pms.Model/Entitlements/ProjectLevelPermissionMapping.cs @@ -0,0 +1,28 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Projects; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Entitlements +{ + public class ProjectLevelPermissionMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid EmployeeId { get; set; } + + [ValidateNever] + [ForeignKey("EmployeeId")] + public Employee? Employee { get; set; } + public Guid ProjectId { get; set; } + + [ValidateNever] + [ForeignKey("ProjectId")] + public Project? Project { get; set; } + public Guid PermissionId { get; set; } + + [ValidateNever] + [ForeignKey("PermissionId")] + public FeaturePermission? Permission { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 415cec5..c06e923 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -186,6 +186,9 @@ namespace Marco.Pms.Services.Controllers ); } + var totalCount = await documentQuery.CountAsync(); + var totalPages = totalCount / pageSize; + // Apply pagination & ordering var documents = await documentQuery .OrderByDescending(t => t.UploadedAt) @@ -202,7 +205,7 @@ namespace Marco.Pms.Services.Controllers .ToListAsync(); // Map to ViewModel - var response = documents.Select(doc => + var documentListVMs = documents.Select(doc => { var version = versions.FirstOrDefault(v => v.ChildAttachmentId == doc.Id); var vm = _mapper.Map(doc); @@ -211,7 +214,16 @@ namespace Marco.Pms.Services.Controllers return vm; }).ToList(); - _logger.LogInfo("Fetched {Count} documents for EntityId {EntityId}", response.Count, entityId); + _logger.LogInfo("Fetched {Count} documents for EntityId {EntityId}", documentListVMs.Count, entityId); + + var response = new + { + CurrentFilter = documentFilter, + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalCount, + Data = documentListVMs, + }; return Ok(ApiResponse.SuccessResponse(response, "Document list fetched successfully", 200)); } @@ -404,12 +416,17 @@ namespace Marco.Pms.Services.Controllers } // Retrieve all version mappings linked to the parent attachment and tenant - var versionMappings = await _context.AttachmentVersionMappings + var versionMappingsQuery = _context.AttachmentVersionMappings .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UploadedBy) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UpdatedBy) - .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId) + .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); + + var totalPages = await versionMappingsQuery.CountAsync(); + var totalCount = totalPages / pageSize; + + var versionMappings = await versionMappingsQuery .OrderByDescending(da => da.ChildAttachment!.UploadedAt) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) @@ -428,13 +445,21 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Found {Count} versions for ParentAttachmentId: {ParentAttachmentId}", versionMappings.Count, parentAttachmentId); // Map the retrieved child attachments to view models with version info - var response = versionMappings.Select(versionMapping => + var attachmentVersionVMs = versionMappings.Select(versionMapping => { var documentVM = _mapper.Map(versionMapping.ChildAttachment); documentVM.Version = versionMapping.Version; return documentVM; }).ToList(); + var response = new + { + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalCount, + Data = attachmentVersionVMs, + }; + _logger.LogInfo("Successfully mapped version data for ParentAttachmentId: {ParentAttachmentId}", parentAttachmentId); return Ok(ApiResponse.SuccessResponse(response, "Document versions fetched successfully", 200)); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 627905c..3f278a0 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -3,6 +3,7 @@ using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Project; +using Marco.Pms.Model.Dtos.Util; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.MongoDBModels.Project; @@ -46,6 +47,7 @@ namespace Marco.Pms.Services.Service _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); _generalHelper = generalHelper ?? throw new ArgumentNullException(nameof(generalHelper)); } + #region =================================================================== Project Get APIs =================================================================== public async Task> GetAllProjectsBasicAsync(Guid tenantId, Employee loggedInEmployee) @@ -1462,6 +1464,36 @@ namespace Marco.Pms.Services.Service Response = ApiResponse.SuccessResponse(new { id = task.Id }, "Task deleted successfully.", 200) }; } + + #endregion + + #region =================================================================== Project-Level Permission APIs =================================================================== + public async Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee) + { + var employeeTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ProjectAllocations.FirstOrDefaultAsync(e => e.Id == model.EmployeeId && e.TenantId == tenantId && e.IsActive); + }); + var projectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); + }); + var featurePermissionsTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + }); + return ApiResponse.SuccessResponse(""); + } + public async Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee) + { + return ApiResponse.SuccessResponse(""); + } + public async Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee) + { + return ApiResponse.SuccessResponse(""); + } #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From 391d79af3e81c2824b962df6fd9f7593591b7672 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 2 Sep 2025 16:05:08 +0530 Subject: [PATCH 36/63] Created the structure for project-level-permissions APIs --- .../Controllers/DocumentController.cs | 4 +-- .../Controllers/ProjectController.cs | 26 ++++++++++++++++++- Marco.Pms.Services/Service/ProjectServices.cs | 15 +++++++++-- .../ServiceInterfaces/IProjectServices.cs | 6 +++++ 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index c06e923..909ce53 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -423,8 +423,8 @@ namespace Marco.Pms.Services.Controllers .ThenInclude(da => da!.UpdatedBy) .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); - var totalPages = await versionMappingsQuery.CountAsync(); - var totalCount = totalPages / pageSize; + var totalCount = await versionMappingsQuery.CountAsync(); + var totalPages = totalCount / pageSize; var versionMappings = await versionMappingsQuery .OrderByDescending(da => da.ChildAttachment!.UploadedAt) diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 436dff9..bb993c2 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.Dtos.Project; +using Marco.Pms.Model.Dtos.Util; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -454,5 +455,28 @@ namespace MarcoBMS.Services.Controllers #endregion + [HttpPost("assign/project-level-permission")] + + public async Task ManageProjectLevelPermission([FromBody] ProjctLevelPermissionDto model) + { + Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _projectServices.ManageProjectLevelPermissionAsync(model, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } + [HttpGet("get/project-level-permission/employee/{employeeId}/prject/{projectId}")] + public async Task GetAssignedProjectLevelPermission(Guid employeeId, Guid projectId) + { + Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _projectServices.GetAssignedProjectLevelPermissionAsync(employeeId, projectId, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } + [HttpGet("get/proejct-level/modules")] + public async Task AssignProjectLevelModules() + { + Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _projectServices.AssignProjectLevelModulesAsync(tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } + } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 3f278a0..4753988 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1473,7 +1473,9 @@ namespace Marco.Pms.Services.Service var employeeTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.ProjectAllocations.FirstOrDefaultAsync(e => e.Id == model.EmployeeId && e.TenantId == tenantId && e.IsActive); + return await context.ProjectAllocations.Include(pa => pa.Employee) + .Where(pa => pa.EmployeeId == model.EmployeeId && pa.ProjectId == model.ProjectId && pa.TenantId == tenantId && pa.IsActive) + .Select(pa => pa.Employee).FirstOrDefaultAsync(); }); var projectTask = Task.Run(async () => { @@ -1492,7 +1494,16 @@ namespace Marco.Pms.Services.Service } public async Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee) { - return ApiResponse.SuccessResponse(""); + var moduleList = new Guid[] + { + Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), + Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Guid.Parse("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") + }; + var featurePermissions = await _context.FeaturePermissions.Include(fp => fp.Feature).Where(fp => moduleList.Contains(fp.Id) && fp.IsEnabled).ToListAsync(); + return ApiResponse.SuccessResponse(featurePermissions); } #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs index a1f78f8..1a8aa35 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.Dtos.Project; +using Marco.Pms.Model.Dtos.Util; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; @@ -34,5 +35,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetTeamByProject(Guid TenantId, Guid ProjectId, bool IncludeInactive); Task> GetMyProjectIdsAsync(Guid tenantId, Employee LoggedInEmployee); + + Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee); + Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee); + Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee); + } } -- 2.43.0 From efc577f9a25286c0b98d4f65a4a168ef75820191 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 11:06:22 +0530 Subject: [PATCH 37/63] Corrected the equation to gt total number of pages --- Marco.Pms.Services/Controllers/DocumentController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 909ce53..744569d 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -187,7 +187,7 @@ namespace Marco.Pms.Services.Controllers } var totalCount = await documentQuery.CountAsync(); - var totalPages = totalCount / pageSize; + var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); ; // Apply pagination & ordering var documents = await documentQuery @@ -424,7 +424,7 @@ namespace Marco.Pms.Services.Controllers .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); var totalCount = await versionMappingsQuery.CountAsync(); - var totalPages = totalCount / pageSize; + var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); ; var versionMappings = await versionMappingsQuery .OrderByDescending(da => da.ChildAttachment!.UploadedAt) -- 2.43.0 From 9b3324c27c2883e23f6ee4cdcc9433048ec08277 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 11:46:14 +0530 Subject: [PATCH 38/63] Added the documents in mobile side menu --- Marco.Pms.Services/Controllers/AppMenuController.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 707ef45..3e86fc0 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -2,6 +2,7 @@ using Marco.Pms.CacheHelper; using Marco.Pms.Model.AppMenu; using Marco.Pms.Model.Dtos.AppMenu; +using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.AppMenu; using Marco.Pms.Model.ViewModels.DocumentManager; @@ -716,10 +717,19 @@ namespace Marco.Pms.Services.Controllers menu.Items = allowedItems; } + if (await _permissions.HasPermission(PermissionsMaster.ViewDocument, employeeId)) + { + response.Add(new MenuSectionApplicationVM + { + Id = Guid.NewGuid(), + Name = "Documents", + Available = true, + }); + } + // Step 3: Log success _logger.LogInfo("Fetched sidebar menu successfully. Tenant: {TenantId}, EmployeeId: {EmployeeId}, SectionsReturned: {Count}", tenantId, employeeId, menus.Count); - return Ok(ApiResponse.SuccessResponse(response, "Sidebar menu fetched successfully", 200)); } catch (Exception ex) -- 2.43.0 From 4c2b33472b5ff00e50c4045120c2384b6a9c9147 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 12:51:07 +0530 Subject: [PATCH 39/63] Added the new condition while checking the document category or type by name --- Marco.Pms.Services/Service/MasterService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 1e3ede3..26e642b 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1032,7 +1032,7 @@ namespace Marco.Pms.Services.Service var oldCategoryExistsTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.DocumentCategoryMasters.AnyAsync(dc => dc.Name == model.Name && dc.EntityTypeId == model.EntityTypeId && dc.TenantId == tenantId); + return await context.DocumentCategoryMasters.AnyAsync(dc => dc.Name == model.Name && dc.Id != model.Id.Value && dc.EntityTypeId == model.EntityTypeId && dc.TenantId == tenantId); }); await Task.WhenAll(categoryTask, oldCategoryExistsTask); @@ -1287,7 +1287,7 @@ namespace Marco.Pms.Services.Service { await using var context = await _dbContextFactory.CreateDbContextAsync(); return await context.DocumentTypeMasters - .AnyAsync(dt => dt.Name == model.Name && dt.DocumentCategoryId == model.DocumentCategoryId && dt.TenantId == tenantId); + .AnyAsync(dt => dt.Name == model.Name && dt.Id != model.Id.Value && dt.DocumentCategoryId == model.DocumentCategoryId && dt.TenantId == tenantId); }); await Task.WhenAll(documentTypeTask, oldTypeExistsTask); -- 2.43.0 From cd489f45ae782ceeabbc0f255e5104500d1c9611 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 13:15:15 +0530 Subject: [PATCH 40/63] added the document categeory vm in document type --- Marco.Pms.Services/Service/MasterService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 26e642b..b60f399 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1181,7 +1181,7 @@ namespace Marco.Pms.Services.Service } // ✅ Fetch and map - var documentType = await documentTypeQuery.ToListAsync(); + var documentType = await documentTypeQuery.Include(dt => dt.DocumentCategory).ToListAsync(); var response = _mapper.Map>(documentType); _logger.LogInfo("{Count} document type fetched successfully for TenantId: {TenantId} by Employee {EmployeeId}", -- 2.43.0 From c27b2a2ff137b1bf2cdc6ec29f1b4a4c8f0fba0f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 14:50:03 +0530 Subject: [PATCH 41/63] Added the check to check the system defined types --- Marco.Pms.Services/Service/MasterService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index b60f399..9de13fc 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1371,7 +1371,11 @@ namespace Marco.Pms.Services.Service _logger.LogWarning("Employee {EmployeeId} tries to {Action} Document Type, but not found in database", loggedInEmployee.Id, action); return ApiResponse.ErrorResponse("Document Type not found", "Document Type not found", 404); } - + if (documentType.IsSystem) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} Document Type, but could not take action on system defined entity", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse($"Document is system defined cannot be {action}d", $"Document is system defined cannot be {action}d", 400); + } // Mapping DocumentTypeMatser to BsonDocument var existingEntityBson = _updateLogHelper.EntityToBsonDocument(documentType); -- 2.43.0 From 2e55d1e3c40814a8d88f5edc73abafff3ed8e37c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 15:31:26 +0530 Subject: [PATCH 42/63] Added the get document tags API --- .../Controllers/DocumentController.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 744569d..1c6669f 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -519,6 +519,48 @@ namespace Marco.Pms.Services.Controllers // Return the pre-signed URL with a success response } + [HttpGet("get/tags")] + public async Task GetAllDocumentTagsAsync() + { + // Log: API endpoint execution started + _logger.LogInfo("Executing GetAllDocumentTagsAsync to retrieve document tags for tenant."); + + // Immediately create DbContext asynchronously using the factory pattern for efficiency and DI compliance + await using var context = await _dbContextFactory.CreateDbContextAsync(); + + // Create a new DI scope for scoped services (e.g., user/context-specific dependencies) + using var scope = _serviceScope.CreateScope(); + + try + { + // Fetch the currently logged-in employee (auth/user context) + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("Current employee could not be identified."); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", 401)); + } + + // Retrieve the tags that belong to the specified tenant and project only the names (performance: projection) + var tags = await context.DocumentTagMasters + .Where(dt => dt.TenantId == tenantId) + .Select(dt => dt.Name) + .ToListAsync(); + + _logger.LogInfo("Successfully retrieved {TagCount} document tags for tenant {TenantId}.", tags.Count, tenantId); + + // Return tags wrapped in ApiResponse object + return Ok(ApiResponse.SuccessResponse(tags, "Tags fetched successfully", 200)); + } + catch (Exception ex) + { + // Log: Unexpected error handling + _logger.LogError(ex, "Error occurred while retrieving document tags for tenant {TenantId}.", tenantId); + return StatusCode(500, ApiResponse.ErrorResponse("An error occurred while fetching tags.", 500)); + } + } + + /// /// Uploads a document attachment for an Employee or Project. /// Validates permissions, document type, entity existence, tags, and uploads to S3. -- 2.43.0 From 961cc018cf40a0a81811b3f38e7175e4483f10b3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 16:05:35 +0530 Subject: [PATCH 43/63] Chnage response of get tag API --- Marco.Pms.Services/Controllers/DocumentController.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 1c6669f..5f9180c 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -544,7 +544,11 @@ namespace Marco.Pms.Services.Controllers // Retrieve the tags that belong to the specified tenant and project only the names (performance: projection) var tags = await context.DocumentTagMasters .Where(dt => dt.TenantId == tenantId) - .Select(dt => dt.Name) + .Select(dt => new + { + Name = dt.Name, + IsActive = true + }) .ToListAsync(); _logger.LogInfo("Successfully retrieved {TagCount} document tags for tenant {TenantId}.", tags.Count, tenantId); -- 2.43.0 From 0916abe464c1326815acb41aef68a6f57ea6adda Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 16:55:20 +0530 Subject: [PATCH 44/63] Added the Manage project-level permissions API --- .../Data/ApplicationDbContext.cs | 23 +- ..._Level_Permssion_Mapping_Table.Designer.cs | 5521 +++++++++++++++++ ...d_Project_Level_Permssion_Mapping_Table.cs | 264 + .../ApplicationDbContextModelSnapshot.cs | 92 +- .../Dtos/Util/ProjctLevelPermissionDto.cs | 6 +- .../Controllers/ProjectController.cs | 2 +- .../MappingProfiles/MappingProfile.cs | 1 + Marco.Pms.Services/Service/ProjectServices.cs | 173 +- 8 files changed, 6048 insertions(+), 34 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index f3f8c39..437b38d 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -59,6 +59,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet Modules { get; set; } public DbSet Features { get; set; } public DbSet FeaturePermissions { get; set; } + public DbSet ProjectLevelPermissionMappings { get; set; } public DbSet CurrencyMaster { get; set; } public DbSet ApplicationRoles { get; set; } public DbSet JobRoles { get; set; } @@ -773,7 +774,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), @@ -788,7 +789,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), @@ -803,7 +804,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), @@ -818,7 +819,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), @@ -833,7 +834,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 2, IsValidationRequired = true, IsMandatory = true, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("2d9fb9cf-db53-476b-a452-492e88e2b51f"), @@ -848,7 +849,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 1, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), @@ -862,7 +863,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 1, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), @@ -876,7 +877,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 1, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), @@ -890,7 +891,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 1, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), @@ -904,7 +905,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 1, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), @@ -918,7 +919,7 @@ namespace Marco.Pms.DataAccess.Data MaxSizeAllowedInMB = 20, IsValidationRequired = false, IsMandatory = false, - CreatedAt = DateTime.UtcNow, + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), IsSystem = true, IsActive = true, DocumentCategoryId = Guid.Parse("cfbff269-072b-477a-b48b-72cdc57dd1d3"), diff --git a/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.Designer.cs new file mode 100644 index 0000000..606272c --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.Designer.cs @@ -0,0 +1,5521 @@ +// +using System; +using Marco.Pms.DataAccess.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250903104652_Added_Project_Level_Permssion_Mapping_Table")] + partial class Added_Project_Level_Permssion_Mapping_Table + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedBy") + .HasColumnType("char(36)"); + + b.Property("AttendanceDate") + .HasColumnType("datetime(6)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Date") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("InTime") + .HasColumnType("datetime(6)"); + + b.Property("IsApproved") + .HasColumnType("tinyint(1)"); + + b.Property("OutTime") + .HasColumnType("datetime(6)"); + + b.Property("ProjectID") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.ToTable("Attendes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ActivityTime") + .HasColumnType("datetime(6)"); + + b.Property("AttendanceId") + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeID") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedBy") + .HasColumnType("char(36)"); + + b.Property("UpdatedOn") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("AttendanceId"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeID"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedBy"); + + b.ToTable("AttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MPIN") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MPINToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("MPINDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpriesInSec") + .HasColumnType("int"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("OTP") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("OTPDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime(6)"); + + b.Property("IsRevoked") + .HasColumnType("tinyint(1)"); + + b.Property("IsUsed") + .HasColumnType("tinyint(1)"); + + b.Property("RevokedAt") + .HasColumnType("datetime(6)"); + + b.Property("Token") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6226), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6233), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6275), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6282), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6286), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6290), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6295), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6298), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6302), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6307), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6311), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6314), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6319), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AadharNumber") + .HasColumnType("longtext"); + + b.Property("ApplicationUserId") + .HasColumnType("varchar(255)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("CurrentAddress") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("EmergencyContactPerson") + .HasColumnType("longtext"); + + b.Property("EmergencyPhoneNumber") + .HasColumnType("longtext"); + + b.Property("FirstName") + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("JoiningDate") + .HasColumnType("datetime(6)"); + + b.Property("LastName") + .HasColumnType("longtext"); + + b.Property("MiddleName") + .HasColumnType("longtext"); + + b.Property("PanNumber") + .HasColumnType("longtext"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpensesTypeId") + .HasColumnType("char(36)"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("NoOfPersons") + .HasColumnType("int"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaymentModeId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CommentId") + .HasColumnType("char(36)"); + + b.Property("FileId") + .HasColumnType("char(36)"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("MessageText") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ParentMessageId") + .HasColumnType("char(36)"); + + b.Property("SentAt") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("TicketComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LinkedActivityId") + .HasColumnType("char(36)"); + + b.Property("LinkedProjectId") + .HasColumnType("char(36)"); + + b.Property("PriorityId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TypeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PriorityId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("TypeId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("TagId") + .HasColumnType("char(36)"); + + b.Property("TicketId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TagId"); + + b.HasIndex("TicketId"); + + b.ToTable("TicketTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c74e5480-2b71-483c-8f4a-1a9c69c32603"), + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1f55eab-9898-4e46-9f03-b263e33e5d38"), + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("MailListId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("Recipient") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Schedule") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("MailListId"); + + b.ToTable("MailDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmailId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeStamp") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("MailLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailingList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Keywords") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("MailingList"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("NoOfPersonsRequired") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesTypeMaster"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + Name = "Procurement", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + IsActive = true, + Name = "Transport", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Description = "Delivery of personnel.", + IsActive = true, + Name = "Travelling", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + IsActive = true, + Name = "Mobilization", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + IsActive = true, + Name = "Employee Welfare", + NoOfPersonsRequired = true, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), + Description = "Machinery servicing, electricity, water, and temporary office needs.", + IsActive = true, + Name = "Maintenance & Utilities", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Description = "Scheduled payments for external services or goods.", + IsActive = true, + Name = "Vendor/Supplier Payments", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), + Description = "Government fees, insurance, inspections and safety-related expenditures.", + IsActive = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Expense Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentModeMatser"); + + b.HasData( + new + { + Id = new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + Name = "Cash", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + Name = "Cheque", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + Name = "UPI", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Buildings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BuildingId") + .HasColumnType("char(36)"); + + b.Property("FloorName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BuildingId"); + + b.HasIndex("TenantId"); + + b.ToTable("Floor"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("ShortName") + .HasColumnType("longtext"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Projects"); + + b.HasData( + new + { + Id = new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"), + ContactPerson = "Project 1 Contact Person", + EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + Name = "Project 1", + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobRoleId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAllocationDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AreaName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FloorId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("FloorId"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkAreas"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("CompletedWork") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedWork") + .HasColumnType("double"); + + b.Property("TaskDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkAreaId") + .HasColumnType("char(36)"); + + b.Property("WorkCategoryId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkAreaId"); + + b.HasIndex("WorkCategoryId"); + + b.ToTable("WorkItems"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Role") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ApplicationRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobRoles"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.Inquiries", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("About") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.Property("OrganizatioinName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Inquiries"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("longtext"); + + b.Property("Discriminator") + .IsRequired() + .HasMaxLength(21) + .HasColumnType("varchar(21)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("SecurityStamp") + .HasColumnType("longtext"); + + b.Property("TwoFactorEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + + b.HasDiscriminator().HasValue("IdentityUser"); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ClaimType") + .HasColumnType("longtext"); + + b.Property("ClaimValue") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("ProviderKey") + .HasColumnType("varchar(255)"); + + b.Property("ProviderDisplayName") + .HasColumnType("longtext"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("RoleId") + .HasColumnType("varchar(255)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("varchar(255)"); + + b.Property("LoginProvider") + .HasColumnType("varchar(255)"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ApplicationUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsRootUser") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesTypeMaster", "ExpensesType") + .WithMany() + .HasForeignKey("ExpensesTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.PaymentModeMatser", "PaymentMode") + .WithMany() + .HasForeignKey("PaymentModeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("ProcessedBy"); + + b.Navigation("Project"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ProjectStatus"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.ProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.Navigation("Attachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Navigation("FeaturePermissions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.cs b/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.cs new file mode 100644 index 0000000..64711c9 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250903104652_Added_Project_Level_Permssion_Mapping_Table.cs @@ -0,0 +1,264 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_Project_Level_Permssion_Mapping_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ProjectLevelPermissionMappings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + EmployeeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ProjectId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PermissionId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectLevelPermissionMappings", x => x.Id); + table.ForeignKey( + name: "FK_ProjectLevelPermissionMappings_Employees_EmployeeId", + column: x => x.EmployeeId, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectLevelPermissionMappings_FeaturePermissions_Permission~", + column: x => x.PermissionId, + principalTable: "FeaturePermissions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectLevelPermissionMappings_Projects_ProjectId", + column: x => x.ProjectId, + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectLevelPermissionMappings_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6233)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6226)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6307)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6290)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6298)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6286)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6275)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6319)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6282)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6314)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6311)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6302)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6295)); + + migrationBuilder.CreateIndex( + name: "IX_ProjectLevelPermissionMappings_EmployeeId", + table: "ProjectLevelPermissionMappings", + column: "EmployeeId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectLevelPermissionMappings_PermissionId", + table: "ProjectLevelPermissionMappings", + column: "PermissionId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectLevelPermissionMappings_ProjectId", + table: "ProjectLevelPermissionMappings", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectLevelPermissionMappings_TenantId", + table: "ProjectLevelPermissionMappings", + column: "TenantId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ProjectLevelPermissionMappings"); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2627)); + + migrationBuilder.UpdateData( + table: "DocumentCategoryMasters", + keyColumn: "Id", + keyValue: new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2617)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2718)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2700)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2710)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2695)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2684)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2731)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2690)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2727)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2722)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2714)); + + migrationBuilder.UpdateData( + table: "DocumentTypeMasters", + keyColumn: "Id", + keyValue: new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + column: "CreatedAt", + value: new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2705)); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 94d6495..1e0560d 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -931,7 +931,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2617), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6226), Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), Name = "Project Documents", @@ -940,7 +940,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2627), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6233), Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), Name = "Employee Documents", @@ -1026,7 +1026,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2684), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6275), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1041,7 +1041,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2690), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6282), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1056,7 +1056,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2695), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6286), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1071,7 +1071,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2700), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6290), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1086,7 +1086,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), AllowedContentType = "application/pdf,image/jpeg", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2705), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6295), DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), IsActive = true, IsMandatory = true, @@ -1101,7 +1101,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2710), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6298), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1115,7 +1115,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2714), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6302), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1129,7 +1129,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2718), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6307), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1143,7 +1143,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2722), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6311), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1157,7 +1157,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2727), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6314), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1171,7 +1171,7 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", - CreatedAt = new DateTime(2025, 8, 30, 4, 55, 10, 359, DateTimeKind.Utc).AddTicks(2731), + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc).AddTicks(6319), DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), IsActive = true, IsMandatory = false, @@ -1683,6 +1683,37 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => { b.Property("ApplicationRoleId") @@ -4750,6 +4781,41 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Feature"); }); + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => { b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) diff --git a/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs index 06a7710..30e764a 100644 --- a/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs +++ b/Marco.Pms.Model/Dtos/Util/ProjctLevelPermissionDto.cs @@ -4,8 +4,8 @@ namespace Marco.Pms.Model.Dtos.Util { public class ProjctLevelPermissionDto { - public Guid EmployeeId { get; set; } - public Guid ProjectId { get; set; } - public FeaturesPermissionDto? Permission { get; set; } + public required Guid EmployeeId { get; set; } + public required Guid ProjectId { get; set; } + public required List Permission { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index bb993c2..7499843 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -463,7 +463,7 @@ namespace MarcoBMS.Services.Controllers var response = await _projectServices.ManageProjectLevelPermissionAsync(model, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } - [HttpGet("get/project-level-permission/employee/{employeeId}/prject/{projectId}")] + [HttpGet("get/project-level-permission/employee/{employeeId}/project/{projectId}")] public async Task GetAssignedProjectLevelPermission(Guid employeeId, Guid projectId) { Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index d58ebe1..1601334 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -99,6 +99,7 @@ namespace Marco.Pms.Services.MappingProfiles // Your mappings CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 4753988..c223eda 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -10,7 +10,9 @@ using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; +using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -1468,29 +1470,172 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Project-Level Permission APIs =================================================================== - public async Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee) + + /// + /// Manages project-level permissions for an employee, optimizing DB calls and operations. + /// + /// Project-level permission DTO. + /// Tenant Guid. + /// Currently logged in employee. + /// API response indicating the result. + public async Task> ManageProjectLevelPermissionAsync( + ProjctLevelPermissionDto model, + Guid tenantId, + Employee loggedInEmployee + ) { + // Log: Method entry and received parameters + _logger.LogInfo("ManageProjectLevelPermissionAsync started for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", + model.EmployeeId, model.ProjectId, tenantId); + + // Fetch all required entities in parallel where possible + var featurePermissionIds = model.Permission.Select(p => p.Id).ToList(); + + // Log: Starting DB queries + _logger.LogDebug("Fetching employee, project, feature permissions, and existing mappings."); + var employeeTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); return await context.ProjectAllocations.Include(pa => pa.Employee) + .AsNoTracking() .Where(pa => pa.EmployeeId == model.EmployeeId && pa.ProjectId == model.ProjectId && pa.TenantId == tenantId && pa.IsActive) .Select(pa => pa.Employee).FirstOrDefaultAsync(); }); + var projectTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Projects.FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); + return await context.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); }); + var featurePermissionsTask = Task.Run(async () => { + var featurePermissionIds = model.Permission.Select(p => p.Id).ToList(); await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.FeaturePermissions.AsNoTracking().Where(p => featurePermissionIds.Contains(p.Id)).ToListAsync(); }); - return ApiResponse.SuccessResponse(""); + + var oldProjectLevelMappingTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ProjectLevelPermissionMappings + .AsNoTracking() + .Where(p => p.EmployeeId == model.EmployeeId && p.ProjectId == model.ProjectId && p.TenantId == tenantId).ToListAsync(); + }); + + await Task.WhenAll(employeeTask, projectTask, featurePermissionsTask, oldProjectLevelMappingTask); + + var employee = employeeTask.Result; + var project = projectTask.Result; + var featurePermissions = featurePermissionsTask.Result; + var oldProjectLevelMapping = oldProjectLevelMappingTask.Result; + + // Validate all loaded entities + if (employee == null) + { + _logger.LogWarning("Employee not found: {EmployeeId}", model.EmployeeId); + return ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404); + } + if (project == null) + { + _logger.LogWarning("Project not found: {ProjectId}", model.ProjectId); + return ApiResponse.ErrorResponse("Project not found", "Project not found in database", 404); + } + if (!(featurePermissions?.Any() ?? false)) + { + _logger.LogWarning("No feature permissions found for provided ids"); + return ApiResponse.ErrorResponse("No permission found", "No permission found in database", 404); + } + _logger.LogDebug("All entities loaded successfully for permission processing."); + + // Permission diff logic: Add new, Remove old + var oldProjectLevelPermissionIds = oldProjectLevelMapping.Select(p => p.PermissionId).ToList(); + + var newProjectLevelPermissions = model.Permission + .Where(p => p.IsEnabled && !oldProjectLevelPermissionIds.Contains(p.Id)) + .Select(p => new ProjectLevelPermissionMapping + { + EmployeeId = model.EmployeeId, + ProjectId = model.ProjectId, + PermissionId = p.Id, + TenantId = tenantId + }).ToList(); + + var deleteProjectLevelPermissions = oldProjectLevelMapping + .Where(pl => model.Permission.Any(p => !p.IsEnabled && p.Id == pl.PermissionId)) + .ToList(); + + // Apply permission changes + if (newProjectLevelPermissions.Any()) + { + _context.ProjectLevelPermissionMappings.AddRange(newProjectLevelPermissions); + _logger.LogInfo("Added {Count} new project-level permissions.", newProjectLevelPermissions.Count); + } + + if (deleteProjectLevelPermissions.Any()) + { + _context.ProjectLevelPermissionMappings.RemoveRange(deleteProjectLevelPermissions); + _logger.LogInfo("Removed {Count} old project-level permissions.", deleteProjectLevelPermissions.Count); + } + + await _context.SaveChangesAsync(); + _logger.LogInfo("Project-level permission changes persisted for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}", model.EmployeeId, model.ProjectId); + + // Final permissions for response + var permissions = await _context.ProjectLevelPermissionMappings + .Include(p => p.Permission) + .AsNoTracking() + .Where(p => p.EmployeeId == model.EmployeeId && p.ProjectId == model.ProjectId && p.TenantId == tenantId) + .Select(p => _mapper.Map(p.Permission)) + .ToListAsync(); + + _logger.LogInfo("ManageProjectLevelPermissionAsync completed successfully."); + + var response = new + { + EmployeeId = _mapper.Map(employee), + ProjectId = _mapper.Map(project), + Permissions = permissions + }; + + return ApiResponse.SuccessResponse(response, "Project-Level permission assigned successfully", 200); } + public async Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee) { - return ApiResponse.SuccessResponse(""); + var projectLevelPermissionMappings = await _context.ProjectLevelPermissionMappings + .Include(p => p.Employee) + .ThenInclude(e => e!.JobRole) + .Include(p => p.Project) + .Include(p => p.Permission) + .ThenInclude(fp => fp!.Feature) + .AsNoTracking() + .Where(p => p.EmployeeId == employeeId && p.ProjectId == projectId && p.TenantId == tenantId) + .GroupBy(p => p.EmployeeId) + .Select(g => new + { + Employee = g.Select(p => _mapper.Map(p.Employee)).FirstOrDefault(), + Project = g.Select(p => _mapper.Map(p.Project)).FirstOrDefault(), + Permissions = g.Select(p => _mapper.Map(p.Permission)).ToList() + }) + .FirstOrDefaultAsync(); + + if (projectLevelPermissionMappings == null) + { + return ApiResponse.ErrorResponse("Project-Level Permissions not found", "Project-Level Permissions not found in database", 404); + } + + if (projectLevelPermissionMappings.Employee == null) + { + return ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404); + } + if (projectLevelPermissionMappings.Project == null) + { + return ApiResponse.ErrorResponse("Project not found", "Project not found in database", 404); + } + + return ApiResponse.SuccessResponse(projectLevelPermissionMappings, "Project-Level Permissions fetched successfully", 200); } public async Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee) { @@ -1502,8 +1647,24 @@ namespace Marco.Pms.Services.Service Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") }; - var featurePermissions = await _context.FeaturePermissions.Include(fp => fp.Feature).Where(fp => moduleList.Contains(fp.Id) && fp.IsEnabled).ToListAsync(); - return ApiResponse.SuccessResponse(featurePermissions); + + var features = await _context.Features + .Include(f => f.FeaturePermissions) + .Include(f => f.Module) + .Where(f => moduleList.Contains(f.Id) && f.Module != null) + .Select(f => new FeatureVM + { + Id = f.Id, + Name = f.Name, + Description = f.Description, + FeaturePermissions = _mapper.Map>(f.FeaturePermissions), + ModuleId = f.ModuleId, + ModuleName = f.Module!.Name, + IsActive = f.IsActive, + ModuleKey = f.Module!.Key + }).ToListAsync(); + + return ApiResponse.SuccessResponse(features); } #endregion -- 2.43.0 From 35ea41d1ceeed8ec73e824322c7fab15bf09f228 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 18:01:07 +0530 Subject: [PATCH 45/63] Added the file meta-data of file in details and get version API --- .../ViewModels/DocumentManager/AttachmentVersionVM.cs | 3 ++- .../DocumentManager/DocumentAttachmentDetailsVM.cs | 2 ++ Marco.Pms.Services/Controllers/DocumentController.cs | 9 +++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs index e0c45af..e064522 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs @@ -7,8 +7,9 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public Guid Id { get; set; } public string? Name { get; set; } public string? DocumentId { get; set; } - public string? PreSignedUrl { get; set; } public int Version { get; set; } + public long FileSize { get; set; } + public string? ContentType { get; set; } public DateTime UploadedAt { get; set; } public BasicEmployeeVM? UploadedBy { get; set; } public DateTime? UpdatedAt { get; set; } diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs index 38806ec..4076b1d 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentAttachmentDetailsVM.cs @@ -12,6 +12,8 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public int Version { get; set; } public bool IsCurrentVersion { get; set; } public Guid ParentAttachmentId { get; set; } + public long FileSize { get; set; } + public string? ContentType { get; set; } public DateTime UploadedAt { get; set; } public BasicEmployeeVM? UploadedBy { get; set; } public DateTime? UpdatedAt { get; set; } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 5f9180c..262c819 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -267,6 +267,8 @@ namespace Marco.Pms.Services.Controllers .Include(av => av.ChildAttachment) .ThenInclude(da => da!.DocumentType) .ThenInclude(dt => dt!.DocumentCategory) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.Document) .FirstOrDefaultAsync(av => av.ChildAttachmentId == id && av.TenantId == tenantId); // If no mapping found, return 404 @@ -299,6 +301,9 @@ namespace Marco.Pms.Services.Controllers documentAttachmentVM.Version = versionMapping.Version; documentAttachmentVM.ParentAttachmentId = versionMapping.ParentAttachmentId; documentAttachmentVM.Tags = tags; + documentAttachmentVM.FileSize = versionMapping.ChildAttachment.Document!.FileSize; + documentAttachmentVM.ContentType = versionMapping.ChildAttachment.Document.ContentType; + _logger.LogInfo("Document details fetched successfully for AttachmentId: {AttachmentId}", id); // Return success response with document details @@ -421,6 +426,8 @@ namespace Marco.Pms.Services.Controllers .ThenInclude(da => da!.UploadedBy) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UpdatedBy) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.Document) .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); var totalCount = await versionMappingsQuery.CountAsync(); @@ -449,6 +456,8 @@ namespace Marco.Pms.Services.Controllers { var documentVM = _mapper.Map(versionMapping.ChildAttachment); documentVM.Version = versionMapping.Version; + documentVM.FileSize = versionMapping.ChildAttachment!.Document!.FileSize; + documentVM.ContentType = versionMapping.ChildAttachment.Document!.ContentType; return documentVM; }).ToList(); -- 2.43.0 From 3a3e7422963b57d610f27b4c44f4a81ba2c2c5c3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Sep 2025 18:08:43 +0530 Subject: [PATCH 46/63] Added the API to get modules for project level configuration --- Marco.Pms.Services/Service/ProjectServices.cs | 130 +++++++++++++----- 1 file changed, 94 insertions(+), 36 deletions(-) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index c223eda..ea6cc8a 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1478,11 +1478,7 @@ namespace Marco.Pms.Services.Service /// Tenant Guid. /// Currently logged in employee. /// API response indicating the result. - public async Task> ManageProjectLevelPermissionAsync( - ProjctLevelPermissionDto model, - Guid tenantId, - Employee loggedInEmployee - ) + public async Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee) { // Log: Method entry and received parameters _logger.LogInfo("ManageProjectLevelPermissionAsync started for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", @@ -1602,44 +1598,86 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(response, "Project-Level permission assigned successfully", 200); } + /// + /// Retrieves the project-level permissions assigned to a specific employee for a given project and tenant. + /// + /// Unique identifier of the employee. + /// Unique identifier of the project. + /// Unique identifier of the tenant. + /// The authenticated employee making this request. + /// ApiResponse containing the permission mappings or error details. public async Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee) { - var projectLevelPermissionMappings = await _context.ProjectLevelPermissionMappings + // Log the attempt to fetch project-level permissions + _logger.LogInfo( + "Fetching project-level permissions for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId} by {LoggedInEmployeeId}", + employeeId, projectId, tenantId, loggedInEmployee.Id); + + // Query the database for relevant project-level permission mappings + var permissionMappings = await _context.ProjectLevelPermissionMappings .Include(p => p.Employee) .ThenInclude(e => e!.JobRole) .Include(p => p.Project) .Include(p => p.Permission) .ThenInclude(fp => fp!.Feature) .AsNoTracking() - .Where(p => p.EmployeeId == employeeId && p.ProjectId == projectId && p.TenantId == tenantId) - .GroupBy(p => p.EmployeeId) - .Select(g => new - { - Employee = g.Select(p => _mapper.Map(p.Employee)).FirstOrDefault(), - Project = g.Select(p => _mapper.Map(p.Project)).FirstOrDefault(), - Permissions = g.Select(p => _mapper.Map(p.Permission)).ToList() - }) - .FirstOrDefaultAsync(); + .Where(p => p.EmployeeId == employeeId + && p.ProjectId == projectId + && p.TenantId == tenantId) + .ToListAsync(); - if (projectLevelPermissionMappings == null) + if (permissionMappings == null || !permissionMappings.Any()) { + _logger.LogWarning("No project-level permissions found for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", + employeeId, projectId, tenantId); return ApiResponse.ErrorResponse("Project-Level Permissions not found", "Project-Level Permissions not found in database", 404); } - if (projectLevelPermissionMappings.Employee == null) + // Map the employee, project, and permissions. + var employee = _mapper.Map(permissionMappings.First().Employee); + var project = _mapper.Map(permissionMappings.First().Project); + var permissions = permissionMappings + .Select(p => _mapper.Map(p.Permission)) + .ToList(); + + if (employee == null) { + _logger.LogWarning("Employee record missing for EmployeeId: {EmployeeId}", employeeId); return ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404); } - if (projectLevelPermissionMappings.Project == null) + if (project == null) { + _logger.LogWarning("Project record missing for ProjectId: {ProjectId}", projectId); return ApiResponse.ErrorResponse("Project not found", "Project not found in database", 404); } - return ApiResponse.SuccessResponse(projectLevelPermissionMappings, "Project-Level Permissions fetched successfully", 200); + // Prepare the result object. + var result = new + { + Employee = employee, + Project = project, + Permissions = permissions + }; + + _logger.LogInfo("Project-level permissions fetched successfully for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", + employeeId, projectId, tenantId); + + return ApiResponse.SuccessResponse(result, "Project-Level Permissions fetched successfully", 200); } + + /// + /// Assigns features at the project module level for the given tenant and employee. + /// + /// Tenant ID associated with assignment. + /// Logged-in employee context. + /// API response containing feature details associated with specified modules. public async Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee) { - var moduleList = new Guid[] + // Log entry at the start of the method. + _logger.LogInfo("AssignProjectLevelModulesAsync called for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + // Define target module IDs. These could alternatively be stored in a config file or DB. + var projectModuleIds = new HashSet { Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), @@ -1648,24 +1686,44 @@ namespace Marco.Pms.Services.Service Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") }; - var features = await _context.Features - .Include(f => f.FeaturePermissions) - .Include(f => f.Module) - .Where(f => moduleList.Contains(f.Id) && f.Module != null) - .Select(f => new FeatureVM - { - Id = f.Id, - Name = f.Name, - Description = f.Description, - FeaturePermissions = _mapper.Map>(f.FeaturePermissions), - ModuleId = f.ModuleId, - ModuleName = f.Module!.Name, - IsActive = f.IsActive, - ModuleKey = f.Module!.Key - }).ToListAsync(); + try + { + // Query features associated with specified modules. Also include module and permissions. + _logger.LogDebug("Querying Features with module filters: {ModuleIds}", string.Join(", ", projectModuleIds)); - return ApiResponse.SuccessResponse(features); + var features = await _context.Features + .AsNoTracking() // Improves read-only query performance + .Include(f => f.FeaturePermissions) + .Include(f => f.Module) + .Where(f => projectModuleIds.Contains(f.Id) && f.Module != null) + .Select(f => new FeatureVM + { + Id = f.Id, + Name = f.Name, + Description = f.Description, + FeaturePermissions = _mapper.Map>(f.FeaturePermissions), + ModuleId = f.ModuleId, + ModuleName = f.Module!.Name, + IsActive = f.IsActive, + ModuleKey = f.Module!.Key + }) + .ToListAsync(); + + _logger.LogInfo("Features successfully retrieved for TenantId: {TenantId}. FeatureCount: {FeatureCount}", tenantId, features.Count); + + // Return successful response. + return ApiResponse.SuccessResponse(features, "Feature Permission for project-level is fetched successfully", 200); + } + catch (Exception ex) + { + // Log the error for further diagnostics. + _logger.LogError(ex, "Error in AssignProjectLevelModulesAsync for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + // Return an appropriate error response to consumer. + return ApiResponse.ErrorResponse("Failed to assign project-level modules.", ex.Message); + } } + #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From b336bd34811ae3a4d42d68562af35dae37e6dbe3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 12:19:27 +0530 Subject: [PATCH 47/63] Added the API to get list of employee whom project-level is assigned --- .../DocumentManager/AttachmentVersionVM.cs | 2 + .../Controllers/DocumentController.cs | 5 + .../Controllers/ProjectController.cs | 7 ++ .../Service/PermissionServices.cs | 94 ++++++++++++++++++- Marco.Pms.Services/Service/ProjectServices.cs | 31 +++++- .../ServiceInterfaces/IProjectServices.cs | 1 + 6 files changed, 132 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs index e064522..f91e513 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/AttachmentVersionVM.cs @@ -14,6 +14,8 @@ namespace Marco.Pms.Model.ViewModels.DocumentManager public BasicEmployeeVM? UploadedBy { get; set; } public DateTime? UpdatedAt { get; set; } public BasicEmployeeVM? UpdatedBy { get; set; } + public DateTime? VerifiedAt { get; set; } + public BasicEmployeeVM? VerifiedBy { get; set; } public bool? IsVerified { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 262c819..f70ddcf 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -424,8 +424,13 @@ namespace Marco.Pms.Services.Controllers var versionMappingsQuery = _context.AttachmentVersionMappings .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UploadedBy) + .ThenInclude(e => e!.JobRole) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.VerifiedBy) + .ThenInclude(e => e!.JobRole) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.Document) .Where(av => av.ParentAttachmentId == parentAttachmentId && av.TenantId == tenantId); diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 7499843..eb3619c 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -477,6 +477,13 @@ namespace MarcoBMS.Services.Controllers var response = await _projectServices.AssignProjectLevelModulesAsync(tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } + [HttpGet("get/proejct-level/employees/{projectId}")] + public async Task GetEmployeeToWhomProjectLevelAssigned(Guid projectId) + { + Employee loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _projectServices.GetEmployeeToWhomProjectLevelAssignedAsync(projectId, tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } } }; \ No newline at end of file diff --git a/Marco.Pms.Services/Service/PermissionServices.cs b/Marco.Pms.Services/Service/PermissionServices.cs index e3374f5..d56c8bf 100644 --- a/Marco.Pms.Services/Service/PermissionServices.cs +++ b/Marco.Pms.Services/Service/PermissionServices.cs @@ -19,16 +19,100 @@ namespace Marco.Pms.Services.Service _cache = cache; } - public async Task HasPermission(Guid featurePermissionId, Guid employeeId) + //public async Task HasPermission(Guid featurePermissionId, Guid employeeId, Guid? projectId = null) + //{ + // var featurePermissionIds = await _cache.GetPermissions(employeeId); + // if (featurePermissionIds == null) + // { + // List featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeId(employeeId); + // featurePermissionIds = featurePermission.Select(fp => fp.Id).ToList(); + // } + // if (projectId != null) + // { + // var projectLevelPerissionIds = await _context.ProjectLevelPermissionMappings + // .Where(pl => pl.ProjectId == projectId.Value && pl.EmployeeId == employeeId).Select(pl => pl.PermissionId).ToListAsync(); + + // var projectLevelModuleIds = new HashSet + // { + // Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), + // Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + // Guid.Parse("81ab8a87-8ccd-4015-a917-0627cee6a100"), + // Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + // Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") + // }; + + // var allProjectLevelPermissionIds = await _context.FeaturePermissions + // .Where(fp => projectLevelModuleIds.Contains(fp.FeatureId) && !projectLevelPerissionIds.Contains(fp.Id)).Select(fp => fp.Id).ToListAsync(); + // featurePermissionIds.RemoveRange(allProjectLevelPermissionIds); + + // featurePermissionIds.AddRange(projectLevelPerissionIds); + // featurePermissionIds = featurePermissionIds.Distinct().ToList(); + // } + // var hasPermission = featurePermissionIds.Contains(featurePermissionId); + // return hasPermission; + //} + + /// + /// Checks whether an employee has a specific feature permission, optionally within a project context. + /// + /// The target feature permission ID to check. + /// The ID of the employee. + /// Optional project ID for project-scoped permissions. + /// True if the user has the permission, otherwise false. + public async Task HasPermission(Guid featurePermissionId, Guid employeeId, Guid? projectId = null) { + // 1. Try fetching permissions from cache (fast-path lookup). var featurePermissionIds = await _cache.GetPermissions(employeeId); + + // If not found in cache, fallback to database (slower). if (featurePermissionIds == null) { - List featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeId(employeeId); - featurePermissionIds = featurePermission.Select(fp => fp.Id).ToList(); + var featurePermissions = await _rolesHelper.GetFeaturePermissionByEmployeeId(employeeId); + featurePermissionIds = featurePermissions.Select(fp => fp.Id).ToList(); } - var hasPermission = featurePermissionIds.Contains(featurePermissionId); - return hasPermission; + + // 2. Handle project-level permission overrides if a project is specified. + if (projectId.HasValue) + { + // Fetch permissions explicitly assigned to this employee in the project. + var projectLevelPermissionIds = await _context.ProjectLevelPermissionMappings + .Where(pl => pl.ProjectId == projectId.Value && pl.EmployeeId == employeeId) + .Select(pl => pl.PermissionId) + .ToListAsync(); + + if (projectLevelPermissionIds?.Any() ?? false) + { + + // Define modules where project-level overrides apply. + var projectLevelModuleIds = new HashSet + { + Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), + Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Guid.Parse("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") + }; + + // Get all feature permissions under those modules where the user didn't have explicit project-level grants. + var allOverriddenPermissions = await _context.FeaturePermissions + .Where(fp => projectLevelModuleIds.Contains(fp.FeatureId) && + !projectLevelPermissionIds.Contains(fp.Id)) + .Select(fp => fp.Id) + .ToListAsync(); + + // Apply overrides: + // - Remove global permissions overridden by project-level rules. + // - Add explicit project-level permissions. + featurePermissionIds = featurePermissionIds + .Except(allOverriddenPermissions) // Remove overridden + .Concat(projectLevelPermissionIds) // Add project-level + .Distinct() // Ensure no duplicates + .ToList(); + } + } + + // 3. Final check: does the employee have the requested permission? + return featurePermissionIds.Contains(featurePermissionId); } public async Task HasPermissionAny(List featurePermissionIds, Guid employeeId) { diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index ea6cc8a..ad7bd1a 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1484,6 +1484,14 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("ManageProjectLevelPermissionAsync started for EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", model.EmployeeId, model.ProjectId, tenantId); + var hasTeamPermission = await _permission.HasPermission(PermissionsMaster.ManageTeam, loggedInEmployee.Id, model.ProjectId); + if (!hasTeamPermission) + { + _logger.LogWarning("Access Denied. User {UserId} tried to Manage the project-level permission for Employee {EmployeeId} and Project {ProjectId}" + , loggedInEmployee.Id, model.EmployeeId, model.ProjectId); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage the project-level permission", 403); + } + // Fetch all required entities in parallel where possible var featurePermissionIds = model.Permission.Select(p => p.Id).ToList(); @@ -1677,7 +1685,7 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("AssignProjectLevelModulesAsync called for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); // Define target module IDs. These could alternatively be stored in a config file or DB. - var projectModuleIds = new HashSet + var projectLevelModuleIds = new HashSet { Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), @@ -1689,13 +1697,13 @@ namespace Marco.Pms.Services.Service try { // Query features associated with specified modules. Also include module and permissions. - _logger.LogDebug("Querying Features with module filters: {ModuleIds}", string.Join(", ", projectModuleIds)); + _logger.LogDebug("Querying Features with module filters: {ModuleIds}", string.Join(", ", projectLevelModuleIds)); var features = await _context.Features .AsNoTracking() // Improves read-only query performance .Include(f => f.FeaturePermissions) .Include(f => f.Module) - .Where(f => projectModuleIds.Contains(f.Id) && f.Module != null) + .Where(f => projectLevelModuleIds.Contains(f.Id) && f.Module != null) .Select(f => new FeatureVM { Id = f.Id, @@ -1724,6 +1732,23 @@ namespace Marco.Pms.Services.Service } } + public async Task> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee) + { + var assignedEmployees = await _context.ProjectLevelPermissionMappings + .Include(pl => pl.Employee) + .ThenInclude(e => e!.JobRole) + .AsNoTracking() + .Where(pl => pl.ProjectId == projectId + && pl.TenantId == tenantId) + .Select(pl => pl.Employee) + .Distinct() + .ToListAsync(); + + var response = _mapper.Map>(assignedEmployees); + + return ApiResponse.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200); + } + #endregion #region =================================================================== Helper Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs index 1a8aa35..c95559a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs @@ -39,6 +39,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> ManageProjectLevelPermissionAsync(ProjctLevelPermissionDto model, Guid tenantId, Employee loggedInEmployee); Task> GetAssignedProjectLevelPermissionAsync(Guid employeeId, Guid projectId, Guid tenantId, Employee loggedInEmployee); Task> AssignProjectLevelModulesAsync(Guid tenantId, Employee loggedInEmployee); + Task> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee); } } -- 2.43.0 From 4a13386546c64108de869e5c17d268e9ddbcdb59 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 12:27:48 +0530 Subject: [PATCH 48/63] Optimized the get employee list for project-level permission --- Marco.Pms.Services/Service/ProjectServices.cs | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index ad7bd1a..958f5d3 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1734,21 +1734,44 @@ namespace Marco.Pms.Services.Service public async Task> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee) { - var assignedEmployees = await _context.ProjectLevelPermissionMappings - .Include(pl => pl.Employee) - .ThenInclude(e => e!.JobRole) - .AsNoTracking() - .Where(pl => pl.ProjectId == projectId - && pl.TenantId == tenantId) - .Select(pl => pl.Employee) - .Distinct() - .ToListAsync(); + // Log method entry and parameters for traceability + _logger.LogInfo("Fetching employees with project-level permissions. ProjectId: {ProjectId}, TenantId: {TenantId}, RequestedBy: {EmployeeId}", + projectId, tenantId, loggedInEmployee.Id); - var response = _mapper.Map>(assignedEmployees); + try + { + // ✅ Optimized query: Selecting only employees with necessary joins + // Instead of fetching entire mapping objects, directly project required employees + var assignedEmployees = await _context.ProjectLevelPermissionMappings + .Include(pl => pl.Employee) + .ThenInclude(e => e!.JobRole) + .AsNoTracking() + .Where(pl => pl.ProjectId == projectId && pl.TenantId == tenantId) + .Select(pl => pl.Employee) // only employees + .Distinct() // ensure unique employees + .ToListAsync(); - return ApiResponse.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200); + _logger.LogInfo("Retrieved {Count} employees with project-level permissions for ProjectId: {ProjectId}, TenantId: {TenantId}", + assignedEmployees.Count, projectId, tenantId); + + // ✅ Use AutoMapper to transform DB entities into VMs + var response = _mapper.Map>(assignedEmployees); + + // Return a consistent API response with success message + return ApiResponse.SuccessResponse(response, "The list of employees with project-level permissions has been successfully retrieved.", 200); + } + catch (Exception ex) + { + // Log exception details for debugging + _logger.LogError(ex, "Error occurred while fetching employees for ProjectId: {ProjectId}, TenantId: {TenantId}, RequestedBy: {EmployeeId}", + projectId, tenantId, loggedInEmployee.Id); + + // Return standard error response + return ApiResponse.ErrorResponse("An error occurred while retrieving employees with project-level permissions.", 500); + } } + #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From 28caee40e3452a9a72c53d71a097df89c0fc44c0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 12:39:25 +0530 Subject: [PATCH 49/63] Adding the overwriting the project-level permissions to tenant-level permission --- Marco.Pms.Services/Service/ProjectServices.cs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 958f5d3..ba6c580 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -198,7 +198,7 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Details requested by EmployeeId: {EmployeeId} for ProjectId: {ProjectId}", loggedInEmployee.Id, id); // Step 1: Check global view project permission - var hasViewProjectPermission = await _permission.HasPermission(PermissionsMaster.ViewProject, loggedInEmployee.Id); + var hasViewProjectPermission = await _permission.HasPermission(PermissionsMaster.ViewProject, loggedInEmployee.Id, id); if (!hasViewProjectPermission) { _logger.LogWarning("ViewProjects permission denied for EmployeeId: {EmployeeId}", loggedInEmployee.Id); @@ -494,7 +494,7 @@ namespace Marco.Pms.Services.Service // This is a placeholder for your actual permission logic. var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); var hasAllEmployeePermission = await _permission.HasPermission(PermissionsMaster.ViewAllEmployees, loggedInEmployee.Id); - var hasviewTeamPermission = await _permission.HasPermission(PermissionsMaster.ViewTeamMembers, loggedInEmployee.Id); + var hasviewTeamPermission = await _permission.HasPermission(PermissionsMaster.ViewTeamMembers, loggedInEmployee.Id, projectId); if (!(hasProjectPermission && (hasAllEmployeePermission || hasviewTeamPermission))) { @@ -979,7 +979,7 @@ namespace Marco.Pms.Services.Service { // --- Step 1: Run independent permission checks in PARALLEL --- var projectPermissionTask = _permission.HasProjectPermission(loggedInEmployee, projectId); - var viewInfraPermissionTask = _permission.HasPermission(PermissionsMaster.ViewProjectInfra, loggedInEmployee.Id); + var viewInfraPermissionTask = _permission.HasPermission(PermissionsMaster.ViewProjectInfra, loggedInEmployee.Id, projectId); await Task.WhenAll(projectPermissionTask, viewInfraPermissionTask); @@ -1057,7 +1057,7 @@ namespace Marco.Pms.Services.Service } var hasProjectAccess = await _permission.HasProjectPermission(loggedInEmployee, projectInfo.ProjectId); - var hasGenericViewInfraPermission = await _permission.HasPermission(PermissionsMaster.ViewProjectInfra, loggedInEmployee.Id); + var hasGenericViewInfraPermission = await _permission.HasPermission(PermissionsMaster.ViewProjectInfra, loggedInEmployee.Id, projectInfo.ProjectId); if (!hasProjectAccess || !hasGenericViewInfraPermission) { @@ -1294,7 +1294,7 @@ namespace Marco.Pms.Services.Service // --- (Placeholder) Security Check --- // You MUST verify the user has permission to modify ALL WorkAreas in the batch. var projectIdsInBatch = workAreasFromDb.Values.Select(wa => wa.Floor!.Building!.ProjectId).Distinct(); - var hasPermission = await _permission.HasPermission(PermissionsMaster.ManageProjectInfra, loggedInEmployee.Id); + var hasPermission = await _permission.HasPermission(PermissionsMaster.ManageProjectInfra, loggedInEmployee.Id, projectIdsInBatch.FirstOrDefault()); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} trying to create/update tasks.", loggedInEmployee.Id); @@ -1731,7 +1731,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Failed to assign project-level modules.", ex.Message); } } - public async Task> GetEmployeeToWhomProjectLevelAssignedAsync(Guid projectId, Guid tenantId, Employee loggedInEmployee) { // Log method entry and parameters for traceability @@ -1740,7 +1739,7 @@ namespace Marco.Pms.Services.Service try { - // ✅ Optimized query: Selecting only employees with necessary joins + // Optimized query: Selecting only employees with necessary joins // Instead of fetching entire mapping objects, directly project required employees var assignedEmployees = await _context.ProjectLevelPermissionMappings .Include(pl => pl.Employee) @@ -1754,7 +1753,7 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Retrieved {Count} employees with project-level permissions for ProjectId: {ProjectId}, TenantId: {TenantId}", assignedEmployees.Count, projectId, tenantId); - // ✅ Use AutoMapper to transform DB entities into VMs + // Use AutoMapper to transform DB entities into VMs var response = _mapper.Map>(assignedEmployees); // Return a consistent API response with success message @@ -1770,8 +1769,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("An error occurred while retrieving employees with project-level permissions.", 500); } } - - #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From d507b9ede2ecf90f9da1f01bcfbb62b182a6d0fb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 14:52:25 +0530 Subject: [PATCH 50/63] Intregating the project-level permissions in document controller --- .../Controllers/DocumentController.cs | 122 ++++++++++++++---- Marco.Pms.Services/Service/ProjectServices.cs | 1 - 2 files changed, 100 insertions(+), 23 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index f70ddcf..fbb5f5d 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -68,7 +68,16 @@ namespace Marco.Pms.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); // Check global permission - var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + var hasViewPermission = false; + if (ProjectEntity == entityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, entityId); + } + else if (EmployeeEntity == entityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + } + if (!hasViewPermission && loggedInEmployee.Id != entityId) { _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId); @@ -280,7 +289,16 @@ namespace Marco.Pms.Services.Controllers } // Check if the logged in employee has permission to view the document OR is the owner of the attachment entity - var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + var hasViewPermission = false; + if (ProjectEntity == versionMapping.ChildAttachment.DocumentType!.DocumentCategory!.EntityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId); + } + else if (EmployeeEntity == versionMapping.ChildAttachment.DocumentType!.DocumentCategory!.EntityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + } + if (!hasViewPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId) { _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", @@ -422,6 +440,9 @@ namespace Marco.Pms.Services.Controllers // Retrieve all version mappings linked to the parent attachment and tenant var versionMappingsQuery = _context.AttachmentVersionMappings + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) .Include(av => av.ChildAttachment) .ThenInclude(da => da!.UploadedBy) .ThenInclude(e => e!.JobRole) @@ -445,9 +466,18 @@ namespace Marco.Pms.Services.Controllers .ToListAsync(); var entityId = versionMappings.Select(av => av.ChildAttachment?.EntityId).FirstOrDefault(); + var entityTypeId = versionMappings.Select(av => av.ChildAttachment?.DocumentType?.DocumentCategory?.EntityTypeId).FirstOrDefault(); // Check global permission - var hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + var hasViewPermission = false; + if (ProjectEntity == entityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, entityId); + } + else if (EmployeeEntity == entityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + } if (!hasViewPermission && loggedInEmployee.Id != entityId) { _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId}", loggedInEmployee.Id, entityId ?? Guid.Empty); @@ -507,6 +537,9 @@ namespace Marco.Pms.Services.Controllers // Retrieve version mapping including the child attachment and its document .Include(av => av.ChildAttachment) .ThenInclude(da => da!.Document) + .Include(av => av.ChildAttachment) + .ThenInclude(da => da!.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) .FirstOrDefaultAsync(av => av.ChildAttachmentId == id); if (versionMapping == null || versionMapping.ChildAttachment == null || versionMapping.ChildAttachment.Document == null) @@ -516,7 +549,16 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse("Version not found", "Version not found in database", 404)); } var _permission = scope.ServiceProvider.GetRequiredService(); - var hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id); + var hasDownloadPermission = false; + if (ProjectEntity == versionMapping.ChildAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id, versionMapping.ChildAttachment.EntityId); + } + else if (EmployeeEntity == versionMapping.ChildAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasDownloadPermission = await _permission.HasPermission(PermissionsMaster.DownloadDocument, loggedInEmployee.Id); + } + if (!hasDownloadPermission && loggedInEmployee.Id != versionMapping.ChildAttachment.EntityId) { _logger.LogWarning("Access Denied for Employee {EmployeeId} on EntityId {EntityId} for downloading", @@ -597,16 +639,6 @@ namespace Marco.Pms.Services.Controllers // Get logged in user var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - // Permission check - var permissionService = scope.ServiceProvider.GetRequiredService(); - var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); - - if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId) - { - _logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId); - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); - } - // Validate Document Type var documentType = await _context.DocumentTypeMasters .Include(dt => dt.DocumentCategory) @@ -618,6 +650,24 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse("Document Type not found", "Document Type not found in database", 404)); } + // Permission check + var _permission = scope.ServiceProvider.GetRequiredService(); + var hasUploadPermission = false; + if (ProjectEntity == documentType.DocumentCategory?.EntityTypeId) + { + hasUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id, model.EntityId); + } + else if (EmployeeEntity == documentType.DocumentCategory?.EntityTypeId) + { + hasUploadPermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); + } + + if (!hasUploadPermission && loggedInEmployee.Id != model.EntityId) + { + _logger.LogWarning("Access Denied. User {UserId} tried to upload document for {EntityId}", loggedInEmployee.Id, model.EntityId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); + } + // Document ID validation if (documentType.IsMandatory && string.IsNullOrWhiteSpace(model.DocumentId)) { @@ -817,6 +867,8 @@ namespace Marco.Pms.Services.Controllers // Fetch active/current document by Id, TenantId, and relevant conditions var documentAttachment = await _context.DocumentAttachments + .Include(da => da.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) .FirstOrDefaultAsync(da => da.Id == id && da.IsActive && da.IsCurrentVersion && da.TenantId == tenantId); if (documentAttachment == null) @@ -826,9 +878,16 @@ namespace Marco.Pms.Services.Controllers } // Permission service: check if employee is authorized to verify documents - var permissionService = scope.ServiceProvider.GetRequiredService(); - var hasVerifyPermission = await permissionService.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id); - + var _permission = scope.ServiceProvider.GetRequiredService(); + var hasVerifyPermission = false; + if (ProjectEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasVerifyPermission = await _permission.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id, documentAttachment.EntityId); + } + else if (EmployeeEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasVerifyPermission = await _permission.HasPermission(PermissionsMaster.VerifyDocument, loggedInEmployee.Id); + } if (!hasVerifyPermission) { _logger.LogWarning("Access denied for document verification. EmployeeId: {EmployeeId}, DocumentId: {DocumentId}", loggedInEmployee.Id, id); @@ -891,9 +950,6 @@ namespace Marco.Pms.Services.Controllers // Get logged-in employee details var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - var hasUploadPermission = await permissionService.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); - // Fetch the existing attachment var oldAttachment = await _context.DocumentAttachments .Include(da => da.DocumentType) @@ -906,8 +962,19 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse("Attachment not found", "Attachment not found in database", 404)); } + var _permission = scope.ServiceProvider.GetRequiredService(); + var hasUpdatePermission = false; + if (ProjectEntity == oldAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasUpdatePermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id, oldAttachment.EntityId); + } + else if (EmployeeEntity == oldAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasUpdatePermission = await _permission.HasPermission(PermissionsMaster.UploadDocument, loggedInEmployee.Id); + } + // Permission check: ensure uploader is authorized - if (!hasUploadPermission && loggedInEmployee.Id != oldAttachment.EntityId) + if (!hasUpdatePermission && loggedInEmployee.Id != oldAttachment.EntityId) { _logger.LogWarning("Access denied for EmployeeId: {EmployeeId}", loggedInEmployee.Id); return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload this document", 403)); @@ -950,7 +1017,7 @@ namespace Marco.Pms.Services.Controllers entityExists = await _context.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId); if (entityExists) { - entityExists = await permissionService.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId); + entityExists = await _permission.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId); } } else @@ -1238,6 +1305,8 @@ namespace Marco.Pms.Services.Controllers // Retrieve the document attachment matching the criteria from the database var documentAttachment = await _context.DocumentAttachments + .Include(da => da.DocumentType) + .ThenInclude(dt => dt!.DocumentCategory) .FirstOrDefaultAsync(da => da.Id == id && da.IsCurrentVersion && da.TenantId == tenantId && da.IsActive != isActive); // If the document attachment is not found, log a warning and return 404 Not Found @@ -1249,6 +1318,15 @@ namespace Marco.Pms.Services.Controllers // Check if the logged in employee has permission to delete OR is the owner of the document attachment var hasDeletePermission = await _permission.HasPermission(PermissionsMaster.DeleteDocument, loggedInEmployee.Id); + var hasViewPermission = false; + if (ProjectEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id, documentAttachment.EntityId); + } + else if (EmployeeEntity == documentAttachment.DocumentType?.DocumentCategory?.EntityTypeId) + { + hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewDocument, loggedInEmployee.Id); + } if (!hasDeletePermission && loggedInEmployee.Id != documentAttachment.EntityId) { _logger.LogWarning("Access denied for employee ID: {EmployeeId} when attempting to delete document ID: {DocumentId}", loggedInEmployee.Id, id); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index ba6c580..7856993 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1169,7 +1169,6 @@ namespace Marco.Pms.Services.Service } } - #endregion #region =================================================================== Project Infrastructre Manage APIs =================================================================== -- 2.43.0 From 48562235f5e578a57193f7c5548d2566e80d89de Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Sep 2025 16:57:37 +0530 Subject: [PATCH 51/63] Added the get filter APIs for contacts and contact notes --- .../Controllers/DirectoryController.cs | 17 + Marco.Pms.Services/Helpers/DirectoryHelper.cs | 1556 ----------------- Marco.Pms.Services/Program.cs | 1 - .../Service/DirectoryService.cs | 220 ++- .../ServiceInterfaces/IDirectoryService.cs | 2 + 5 files changed, 238 insertions(+), 1558 deletions(-) delete mode 100644 Marco.Pms.Services/Helpers/DirectoryHelper.cs diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 5731065..431122e 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -80,6 +80,7 @@ namespace Marco.Pms.Services.Controllers var response = await _directoryService.GetOrganizationListAsync(tenantId, loggedInEmployee); return Ok(response); } + [HttpGet("designations")] public async Task GetDesignationList() { @@ -88,6 +89,14 @@ namespace Marco.Pms.Services.Controllers return Ok(response); } + [HttpGet("contact/filter")] + public async Task GetContactFilterObject() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetContactFilterObjectAsync(tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } + #endregion [HttpPost] @@ -161,6 +170,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("notes/filter")] + public async Task GetContactNotesFilterObject() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _directoryService.GetContactNotesFilterObjectAsync(tenantId, loggedInEmployee); + return StatusCode(response.StatusCode, response); + } + [HttpPut("note/{id}")] public async Task UpdateContactNote(Guid id, [FromBody] UpdateContactNoteDto noteDto) { diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs deleted file mode 100644 index 9722974..0000000 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ /dev/null @@ -1,1556 +0,0 @@ -using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.Directory; -using Marco.Pms.Model.Dtos.Directory; -using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.Mapper; -using Marco.Pms.Model.Projects; -using Marco.Pms.Model.Utilities; -using Marco.Pms.Model.ViewModels.Directory; -using Marco.Pms.Model.ViewModels.Master; -using Marco.Pms.Model.ViewModels.Projects; -using Marco.Pms.Services.Service; -using MarcoBMS.Services.Helpers; -using MarcoBMS.Services.Service; -using Microsoft.EntityFrameworkCore; - -namespace Marco.Pms.Services.Helpers -{ - public class DirectoryHelper - { - private readonly ApplicationDbContext _context; - private readonly ILoggingService _logger; - private readonly UserHelper _userHelper; - private readonly PermissionServices _permissionServices; - - public DirectoryHelper(ApplicationDbContext context, ILoggingService logger, UserHelper userHelper, PermissionServices permissionServices) - { - _context = context; - _logger = logger; - _userHelper = userHelper; - _permissionServices = permissionServices; - } - - public async Task> GetListOfContacts(string? search, bool active, ContactFilterDto? filterDto, Guid? projectId) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).ToListAsync(); - bucketIds = buckets.Select(b => b.Id).ToList(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - var buckets = await _context.Buckets.Where(b => b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); - var createdBucketIds = buckets.Select(b => b.Id).ToList(); - bucketIds.AddRange(createdBucketIds); - bucketIds = bucketIds.Distinct().ToList(); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - List filterbucketIds = bucketIds; - if (filterDto != null && filterDto.BucketIds != null && filterDto.BucketIds.Count > 0) - { - filterbucketIds = filterDto.BucketIds; - } - List? contactBuckets = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); - List contactIds = contactBuckets.Where(b => filterbucketIds.Contains(b.BucketId)).Select(cb => cb.ContactId).ToList(); - List contacts = new List(); - - var contactProjects = await _context.ContactProjectMappings.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); - - if (projectId != null && projectId != Guid.Empty) - { - contactProjects = contactProjects.Where(p => p.ProjectId == projectId).ToList(); - contactIds = contactProjects.Select(p => p.ContactId).Distinct().ToList(); - } - - if (filterDto != null && filterDto.CategoryIds != null && filterDto.CategoryIds.Count > 0) - { - var categoryIds = filterDto.CategoryIds; - contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && categoryIds.Contains(c.ContactCategoryId ?? Guid.Empty) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); - } - else - { - contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.TenantId == tenantId && c.IsActive == active).ToListAsync(); - } - - var phoneNo = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); - var Emails = await _context.ContactsEmails.Where(E => contactIds.Contains(E.ContactId)).ToListAsync(); - var Tags = await _context.ContactTagMappings.Where(t => contactIds.Contains(t.ContactId)).ToListAsync(); - - List TagIds = Tags.Select(t => t.ContactTagId).ToList(); - - var TagList = await _context.ContactTagMasters.Where(t => TagIds.Contains(t.Id)).ToListAsync(); - - if (search != null && search != string.Empty) - { - List filteredContactIds = new List(); - phoneNo = phoneNo.Where(p => Compare(p.PhoneNumber, search)).ToList(); - filteredContactIds = phoneNo.Select(p => p.ContactId).ToList(); - - Emails = Emails.Where(e => Compare(e.EmailAddress, search)).ToList(); - filteredContactIds.AddRange(Emails.Select(e => e.ContactId).ToList()); - filteredContactIds = filteredContactIds.Distinct().ToList(); - - contacts = contacts.Where(c => Compare(c.Name, search) || Compare(c.Organization, search) || filteredContactIds.Contains(c.Id)).ToList(); - } - - List list = new List(); - - foreach (var contact in contacts) - { - - ContactVM contactVM = new ContactVM(); - List contactEmailVms = new List(); - List contactPhoneVms = new List(); - - List conatctTagVms = new List(); - var phones = phoneNo.Where(p => p.ContactId == contact.Id).ToList(); - var emails = Emails.Where(e => e.ContactId == contact.Id).ToList(); - var tagMappingss = Tags.Where(t => t.ContactId == contact.Id).ToList(); - var projectMapping = contactProjects.Where(p => p.ContactId == contact.Id).ToList(); - var bucketMapping = contactBuckets.Where(b => b.ContactId == contact.Id).ToList(); - - - if (emails != null && emails.Count > 0) - { - foreach (var email in emails) - { - ContactEmailVM emailVM = new ContactEmailVM(); - emailVM = email.ToContactEmailVMFromContactEmail(); - contactEmailVms.Add(emailVM); - } - } - - if (phones != null && phones.Count > 0) - { - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = new ContactPhoneVM(); - phoneVM = phone.ToContactPhoneVMFromContactPhone(); - contactPhoneVms.Add(phoneVM); - } - - } - if (tagMappingss != null && tagMappingss.Count > 0) - { - foreach (var tagMapping in tagMappingss) - { - ContactTagVM tagVM = new ContactTagVM(); ; - var tag = TagList.Find(t => t.Id == tagMapping.ContactTagId); - - tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - conatctTagVms.Add(tagVM); - - - } - } - contactVM = contact.ToContactVMFromContact(); - - if (projectMapping != null && projectMapping.Count > 0) - { - contactVM.ProjectIds = projectMapping.Select(p => p.ProjectId).ToList(); - } - if (bucketMapping != null && bucketMapping.Count > 0) - { - contactVM.BucketIds = bucketMapping.Select(p => p.BucketId).ToList(); - } - - contactVM.ContactEmails = contactEmailVms; - contactVM.ContactPhones = contactPhoneVms; - contactVM.Tags = conatctTagVms; - - list.Add(contactVM); - } - _logger.LogInfo("{count} contacts are fetched by Employee with ID {LoggedInEmployeeId}", list.Count, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(list, System.String.Format("{0} contacts fetched successfully", list.Count), 200); - - } - public async Task> GetContactsListByBucketId(Guid id) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (id != Guid.Empty) - { - Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Id == id && b.TenantId == tenantId); - if (bucket == null) - { - _logger.LogInfo("Employee ID {EmployeeId} attempted access to bucket ID {BucketId}, but not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); - } - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(em => em.BucketId == id).ToListAsync(); - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - - EmployeeBucketMapping? employeeBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - employeeBucket = employeeBuckets.FirstOrDefault(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - employeeBucket = employeeBuckets.FirstOrDefault(eb => eb.EmployeeId == LoggedInEmployee.Id); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to access a contacts with in bucket {BucketId}, but do not have permission", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - if (employeeBucket == null) - { - _logger.LogInfo("Employee ID {EmployeeId} does not have access to bucket ID {BucketId}", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You do not have access to this bucket.", "You do not have access to this bucket.", 401); - } - - List contactBucket = await _context.ContactBucketMappings.Where(cb => cb.BucketId == id).ToListAsync() ?? new List(); - List contactVMs = new List(); - if (contactBucket.Count > 0) - { - var contactIds = contactBucket.Select(cb => cb.ContactId).ToList(); - List contacts = await _context.Contacts.Include(c => c.ContactCategory).Where(c => contactIds.Contains(c.Id) && c.IsActive).ToListAsync(); - List phones = await _context.ContactsPhones.Where(p => contactIds.Contains(p.ContactId)).ToListAsync(); - List emails = await _context.ContactsEmails.Where(e => contactIds.Contains(e.ContactId)).ToListAsync(); - - List? tags = await _context.ContactTagMappings.Where(ct => contactIds.Contains(ct.ContactId)).ToListAsync(); - List? contactProjects = await _context.ContactProjectMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); - List? contactBuckets = await _context.ContactBucketMappings.Where(cp => contactIds.Contains(cp.ContactId)).ToListAsync(); - - List tagIds = new List(); - List tagMasters = new List(); - if (tags.Count > 0) - { - tagIds = tags.Select(ct => ct.ContactTagId).ToList(); - tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - } - - if (contacts.Count > 0) - { - - - foreach (var contact in contacts) - { - List? emailVMs = new List(); - List? phoneVMs = new List(); - List? tagVMs = new List(); - - List contactPhones = phones.Where(p => p.ContactId == contact.Id).ToList(); - List contactEmails = emails.Where(e => e.ContactId == contact.Id).ToList(); - - List? contactTags = tags.Where(t => t.ContactId == contact.Id).ToList(); - List? projectMappings = contactProjects.Where(cp => cp.ContactId == contact.Id).ToList(); - List? bucketMappings = contactBuckets.Where(cb => cb.ContactId == contact.Id).ToList(); - - if (contactPhones.Count > 0) - { - foreach (var phone in contactPhones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - } - if (contactEmails.Count > 0) - { - foreach (var email in contactEmails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - } - if (contactTags.Count > 0) - { - foreach (var contactTag in contactTags) - { - ContactTagMaster? tagMaster = tagMasters.Find(t => t.Id == contactTag.ContactTagId); - if (tagMaster != null) - { - ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); - tagVMs.Add(tagVM); - } - } - } - ContactVM contactVM = contact.ToContactVMFromContact(); - contactVM.ContactEmails = emailVMs; - contactVM.ContactPhones = phoneVMs; - contactVM.Tags = tagVMs; - contactVM.ProjectIds = projectMappings.Select(cp => cp.ProjectId).ToList(); - contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); - contactVMs.Add(contactVM); - } - } - - } - _logger.LogInfo("{count} contact from Bucket {BucketId} fetched by Employee {EmployeeId}", contactVMs.Count, id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactVMs, $"{contactVMs.Count} contacts fetched successfully", 200); - } - _logger.LogInfo("Employee ID {EmployeeId} sent an empty Bucket id", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket ID is empty", "Bucket ID is empty", 400); - } - public async Task> CreateContact(CreateContactDto createContact) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (createContact != null) - { - List phones = new List(); - List emails = new List(); - List contactBucketMappings = new List(); - List contactTagMappings = new List(); - - Contact? contact = createContact.ToContactFromCreateContactDto(tenantId, LoggedInEmployee.Id); - - _context.Contacts.Add(contact); - await _context.SaveChangesAsync(); - _logger.LogInfo("Contact with ID {ContactId} created by Employee with ID {LoggedInEmployeeId}", contact.Id, LoggedInEmployee.Id); - - var tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); - var tagNames = tags.Select(t => t.Name.ToLower()).ToList(); - var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).Select(b => b.Id).ToListAsync(); - var projects = await _context.Projects.Where(p => p.TenantId == tenantId).Select(p => p.Id).ToListAsync(); - - if (createContact.ContactPhones != null) - { - - foreach (var contactPhone in createContact.ContactPhones) - { - ContactPhone phone = contactPhone.ToContactPhoneFromCreateContactPhoneDto(tenantId, contact.Id); - phones.Add(phone); - } - _context.ContactsPhones.AddRange(phones); - _logger.LogInfo("{count} phone number are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", phones.Count, contact.Id, LoggedInEmployee.Id); - } - if (createContact.ContactEmails != null) - { - - foreach (var contactEmail in createContact.ContactEmails) - { - ContactEmail email = contactEmail.ToContactEmailFromCreateContactEmailDto(tenantId, contact.Id); - emails.Add(email); - } - _context.ContactsEmails.AddRange(emails); - _logger.LogInfo("{count} email addresses are saved in contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", emails.Count, contact.Id, LoggedInEmployee.Id); - } - - if (createContact.BucketIds != null) - { - foreach (var bucket in createContact.BucketIds) - { - if (buckets.Contains(bucket)) - { - ContactBucketMapping bucketMapping = new ContactBucketMapping - { - BucketId = bucket, - ContactId = contact.Id - }; - contactBucketMappings.Add(bucketMapping); - } - } - _context.ContactBucketMappings.AddRange(contactBucketMappings); - _logger.LogInfo("Contact with ID {ContactId} added to {count} number of buckets by employee with ID {LoggedEmployeeId}", contact.Id, contactBucketMappings.Count, LoggedInEmployee.Id); - } - - if (createContact.ProjectIds != null) - { - List projectMappings = new List(); - foreach (var projectId in createContact.ProjectIds) - { - if (projects.Contains(projectId)) - { - ContactProjectMapping projectMapping = new ContactProjectMapping - { - ProjectId = projectId, - ContactId = contact.Id, - TenantId = tenantId - }; - projectMappings.Add(projectMapping); - } - } - _context.ContactProjectMappings.AddRange(projectMappings); - _logger.LogInfo("Contact with ID {ContactId} added to {count} number of project by employee with ID {LoggedEmployeeId}", contact.Id, projectMappings.Count, LoggedInEmployee.Id); - } - - if (createContact.Tags != null) - { - foreach (var tag in createContact.Tags) - { - if (tagNames.Contains(tag.Name.ToLower())) - { - ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = tag.Id ?? existingTag.Id - }); - } - else if (tag.Id == null || tags.Where(t => t.Name == tag.Name) == null) - { - var newtag = new ContactTagMaster - { - Name = tag.Name, - TenantId = tenantId - }; - _context.ContactTagMasters.Add(newtag); - ContactTagMapping tagMapping = new ContactTagMapping - { - ContactTagId = newtag.Id, - ContactId = contact.Id - }; - contactTagMappings.Add(tagMapping); - } - } - - _context.ContactTagMappings.AddRange(contactTagMappings); - _logger.LogInfo("{count} number of tags added to Contact with ID {ContactId} by employee with ID {LoggedEmployeeId}", contactTagMappings.Count, contact.Id, LoggedInEmployee.Id); - } - await _context.SaveChangesAsync(); - - ContactVM contactVM = new ContactVM(); - List phoneVMs = new List(); - - contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == contact.Id) ?? new Contact(); - var tagIds = contactTagMappings.Select(t => t.ContactTagId).ToList(); - tags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId && tagIds.Contains(t.Id)).ToListAsync(); - List contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); - List bucketMappings = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - List emailVMs = new List(); - foreach (var email in emails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - List tagVMs = new List(); - foreach (var contactTagMapping in contactTagMappings) - { - ContactTagVM tagVM = new ContactTagVM(); - var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); - tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - tagVMs.Add(tagVM); - } - - - contactVM = contact.ToContactVMFromContact(); - contactVM.ContactPhones = phoneVMs; - contactVM.ContactEmails = emailVMs; - contactVM.Tags = tagVMs; - contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - contactVM.BucketIds = bucketMappings.Select(cb => cb.BucketId).ToList(); - - return ApiResponse.SuccessResponse(contactVM, "Contact Created Successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateContact(Guid id, UpdateContactDto updateContact) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (updateContact != null) - { - if (updateContact.Id != id) - { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended different ID in payload and path parameter", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Invalid data", "Invalid data", 400); - } - Contact? contact = await _context.Contacts.AsNoTracking().FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); - if (contact == null) - { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - List bucketIds = employeeBuckets.Select(c => c.BucketId).ToList(); - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - var buckets = await _context.Buckets.Where(b => b.TenantId == tenantId).ToListAsync(); - bucketIds = buckets.Select(b => b.Id).ToList(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - var buckets = await _context.Buckets.Where(b => b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); - var createdBucketIds = buckets.Select(b => b.Id).ToList(); - bucketIds.AddRange(createdBucketIds); - bucketIds = bucketIds.Distinct().ToList(); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to update a contact, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - List contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(m => m.ContactId == contact.Id && bucketIds.Contains(m.BucketId)).ToListAsync(); - bucketIds = contactBuckets.Select(b => b.BucketId).Distinct().ToList(); - - - - var newContact = updateContact.ToContactFromUpdateContactDto(tenantId, contact); - newContact.UpdatedById = LoggedInEmployee.Id; - newContact.UpdatedAt = DateTime.UtcNow; - _context.Contacts.Update(newContact); - await _context.SaveChangesAsync(); - - List phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - var phoneIds = phones.Select(p => p.Id).ToList(); - List emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - var emailIds = emails.Select(p => p.Id).ToList(); - - - - List contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - var tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); - - - List contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - var projectIds = contactProjects.Select(t => t.ProjectId).Distinct().ToList(); - - List tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - List allTags = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); - var tagNames = allTags.Select(t => t.Name.ToLower()).ToList(); - - if (updateContact.ContactPhones != null) - { - var updatedPhoneIds = updateContact.ContactPhones.Select(p => p.Id).Distinct().ToList(); - foreach (var phoneDto in updateContact.ContactPhones) - { - var phone = phoneDto.ToContactPhoneFromUpdateContactPhoneDto(tenantId, contact.Id); - if (phoneDto.Id != null && phoneDto.Id != Guid.Empty && phoneIds.Contains(phone.Id)) - { - _context.ContactsPhones.Update(phone); - } - else - { - _context.ContactsPhones.Add(phone); - } - } - foreach (var phone in phones) - { - - if (!updatedPhoneIds.Contains(phone.Id)) - { - _context.ContactsPhones.Remove(phone); - } - } - } - else if (phones != null) - { - _context.ContactsPhones.RemoveRange(phones); - } - - if (updateContact.ContactEmails != null) - { - var updateEmailIds = updateContact.ContactEmails.Select(p => p.Id).Distinct().ToList(); - - foreach (var emailDto in updateContact.ContactEmails) - { - var email = emailDto.ToContactEmailFromUpdateContactEmailDto(tenantId, contact.Id); - if (emailDto.Id != null && emailDto.Id != Guid.Empty && emailIds.Contains(email.Id)) - { - _context.ContactsEmails.Update(email); - } - else - { - _context.ContactsEmails.Add(email); - } - } - foreach (var email in emails) - { - - if (!updateEmailIds.Contains(email.Id)) - { - _context.ContactsEmails.Remove(email); - } - } - } - else if (emails != null) - { - _context.ContactsEmails.RemoveRange(emails); - } - - if (updateContact.BucketIds != null) - { - foreach (var bucketId in updateContact.BucketIds) - { - if (!bucketIds.Contains(bucketId)) - { - _context.ContactBucketMappings.Add(new ContactBucketMapping - { - BucketId = bucketId, - ContactId = contact.Id - }); - } - } - foreach (var bucketMapping in contactBuckets) - { - if (!updateContact.BucketIds.Contains(bucketMapping.BucketId)) - { - _context.ContactBucketMappings.Remove(bucketMapping); - } - } - } - else if (contactBuckets != null) - { - _context.ContactBucketMappings.RemoveRange(contactBuckets); - } - - if (updateContact.ProjectIds != null) - { - foreach (var ProjectId in updateContact.ProjectIds) - { - if (!projectIds.Contains(ProjectId)) - { - _context.ContactProjectMappings.Add(new ContactProjectMapping - { - ProjectId = ProjectId, - ContactId = contact.Id, - TenantId = tenantId - }); - } - } - - foreach (var projectMapping in contactProjects) - { - if (!updateContact.ProjectIds.Contains(projectMapping.ProjectId)) - { - _context.ContactProjectMappings.Remove(projectMapping); - } - } - } - else if (contactProjects != null) - { - _context.ContactProjectMappings.RemoveRange(contactProjects); - } - - if (updateContact.Tags != null) - { - var updatedTagIds = updateContact.Tags.Select(t => t.Id).Distinct().ToList(); - foreach (var tag in updateContact.Tags) - { - var namecheck = tagNames.Contains(tag.Name.ToLower()); - var idCheck = (!tagIds.Contains(tag.Id ?? Guid.Empty)); - var test = namecheck && idCheck; - if (test) - { - ContactTagMaster existingTag = tags.Find(t => t.Name == tag.Name) ?? new ContactTagMaster(); - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = tag.Id ?? existingTag.Id - }); - } - else if (tag.Id == null || tag.Id == Guid.Empty) - { - ContactTagMaster contactTag = new ContactTagMaster - { - Name = tag.Name, - Description = "", - TenantId = tenantId - }; - _context.ContactTagMasters.Add(contactTag); - - _context.ContactTagMappings.Add(new ContactTagMapping - { - ContactId = contact.Id, - ContactTagId = contactTag.Id - }); - } - } - foreach (var contactTag in contactTags) - { - if (!updatedTagIds.Contains(contactTag.ContactTagId)) - { - _context.ContactTagMappings.Remove(contactTag); - } - } - } - else if (contactTags != null) - { - _context.ContactTagMappings.RemoveRange(contactTags); - } - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contact.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - - contact = await _context.Contacts.Include(c => c.ContactCategory).FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId) ?? new Contact(); - phones = await _context.ContactsPhones.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - emails = await _context.ContactsEmails.AsNoTracking().Where(p => p.ContactId == contact.Id).ToListAsync(); - contactTags = await _context.ContactTagMappings.AsNoTracking().Where(m => m.ContactId == contact.Id).ToListAsync(); - contactBuckets = await _context.ContactBucketMappings.AsNoTracking().Where(cb => cb.ContactId == contact.Id).ToListAsync(); - contactProjects = await _context.ContactProjectMappings.AsNoTracking().Where(cp => cp.ContactId == contact.Id).ToListAsync(); - tagIds = contactTags.Select(t => t.ContactTagId).Distinct().ToList(); - tags = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - - ContactVM contactVM = new ContactVM(); - List phoneVMs = new List(); - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - List emailVMs = new List(); - foreach (var email in emails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - List tagVMs = new List(); - foreach (var contactTagMapping in contactTags) - { - ContactTagVM tagVM = new ContactTagVM(); - var tag = tags.Find(t => t.Id == contactTagMapping.ContactTagId); - tagVM = tag != null ? tag.ToContactTagVMFromContactTagMaster() : new ContactTagVM(); - tagVMs.Add(tagVM); - } - - - contactVM = contact.ToContactVMFromContact(); - contactVM.ContactPhones = phoneVMs; - contactVM.ContactEmails = emailVMs; - contactVM.Tags = tagVMs; - contactVM.BucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); - contactVM.ProjectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - - _logger.LogInfo("Conatct {ContactId} has been updated by employee {EmployeeId}", contact.Id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(contactVM, "Contact Updated Successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> GetContactProfile(Guid id) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var hasAdminPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, LoggedInEmployee.Id); - if (id != Guid.Empty) - { - Contact? contact = await _context.Contacts.Include(c => c.ContactCategory).Include(c => c.CreatedBy).FirstOrDefaultAsync(c => c.Id == id && c.IsActive); - if (contact == null) - { - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} tries to update contact with ID {ContactId} is not found in database", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - ContactProfileVM contactVM = contact.ToContactProfileVMFromContact(); - DirectoryUpdateLog? updateLog = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => l.RefereanceId == contact.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefaultAsync(); - if (updateLog != null) - { - contactVM.UpdatedAt = updateLog.UpdateAt; - contactVM.UpdatedBy = updateLog.Employee != null ? updateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; - } - - List? phones = await _context.ContactsPhones.Where(p => p.ContactId == contact.Id).ToListAsync(); - if (phones.Any()) - { - List? phoneVMs = new List(); - foreach (var phone in phones) - { - ContactPhoneVM phoneVM = phone.ToContactPhoneVMFromContactPhone(); - phoneVMs.Add(phoneVM); - } - contactVM.ContactPhones = phoneVMs; - } - - List? emails = await _context.ContactsEmails.Where(e => e.ContactId == contact.Id).ToListAsync(); - if (emails.Any()) - { - List? emailVMs = new List(); - foreach (var email in emails) - { - ContactEmailVM emailVM = email.ToContactEmailVMFromContactEmail(); - emailVMs.Add(emailVM); - } - contactVM.ContactEmails = emailVMs; - } - - List? contactProjects = await _context.ContactProjectMappings.Where(cp => cp.ContactId == contact.Id).ToListAsync(); - if (contactProjects.Any()) - { - List projectIds = contactProjects.Select(cp => cp.ProjectId).ToList(); - List? projects = await _context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); - List? projectVMs = new List(); - foreach (var project in projects) - { - BasicProjectVM projectVM = new BasicProjectVM - { - Id = project.Id, - Name = project.Name - }; - projectVMs.Add(projectVM); - } - contactVM.Projects = projectVMs; - } - List? contactBuckets = await _context.ContactBucketMappings.Where(cb => cb.ContactId == contact.Id).ToListAsync(); - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - if (contactBuckets.Any() && (employeeBuckets.Any() || hasAdminPermission)) - { - List contactBucketIds = contactBuckets.Select(cb => cb.BucketId).ToList(); - List employeeBucketIds = employeeBuckets.Select(eb => eb.BucketId).ToList(); - List? buckets = null; - if (hasAdminPermission) - { - buckets = await _context.Buckets.Where(b => contactBucketIds.Contains(b.Id)).ToListAsync(); - } - else - { - buckets = await _context.Buckets.Where(b => contactBucketIds.Contains(b.Id) && employeeBucketIds.Contains(b.Id)).ToListAsync(); - } - List? bucketVMs = new List(); - foreach (var bucket in buckets) - { - BucketVM bucketVM = bucket.ToBucketVMFromBucket(); - bucketVMs.Add(bucketVM); - } - contactVM.Buckets = bucketVMs; - } - List? contactTags = await _context.ContactTagMappings.Where(ct => ct.ContactId == contact.Id).ToListAsync(); - if (contactTags.Any()) - { - List tagIds = contactTags.Select(ct => ct.ContactTagId).ToList(); - List tagMasters = await _context.ContactTagMasters.Where(t => tagIds.Contains(t.Id)).ToListAsync(); - List tagVMs = new List(); - foreach (var tagMaster in tagMasters) - { - ContactTagVM tagVM = tagMaster.ToContactTagVMFromContactTagMaster(); - tagVMs.Add(tagVM); - } - contactVM.Tags = tagVMs; - } - //List? notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive).ToListAsync(); - //if (notes.Any()) - //{ - // List? noteIds = notes.Select(n => n.Id).ToList(); - // List? noteUpdateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).OrderByDescending(l => l.UpdateAt).ToListAsync(); - // List? noteVMs = new List(); - // foreach (var note in notes) - // { - // DirectoryUpdateLog? noteUpdateLog = noteUpdateLogs.Where(n => n.RefereanceId == note.Id).OrderByDescending(l => l.UpdateAt).FirstOrDefault(); - // ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - // if (noteUpdateLog != null) - // { - // noteVM.UpdatedAt = noteUpdateLog.UpdateAt; - // noteVM.UpdatedBy = noteUpdateLog.Employee != null ? noteUpdateLog.Employee.ToBasicEmployeeVMFromEmployee() : null; - // } - // noteVMs.Add(noteVM); - // } - // contactVM.Notes = noteVMs; - //} - _logger.LogInfo("Employee ID {EmployeeId} fetched profile of contact {COntactId}", LoggedInEmployee.Id, contact.Id); - return ApiResponse.SuccessResponse(contactVM, "Contact profile fetched successfully"); - - } - _logger.LogInfo("Employee ID {EmployeeId} sent an empty contact id", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); - } - public async Task> GetOrganizationList() - { - // Step 1: Retrieve tenant and employee context - Guid tenantId = _userHelper.GetTenantId(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - _logger.LogInfo("GetOrganizationList called by EmployeeId: {EmployeeId} for TenantId: {TenantId}", - loggedInEmployee.Id, tenantId); - - // Step 2: Fetch distinct, non-empty organization names - var organizationList = await _context.Contacts - .Where(c => c.TenantId == tenantId && !string.IsNullOrWhiteSpace(c.Organization)) - .Select(c => c.Organization.Trim()) - .Distinct() - .ToListAsync(); - - _logger.LogInfo("EmployeeId: {EmployeeId} fetched {Count} organization names from TenantId: {TenantId}", - loggedInEmployee.Id, organizationList.Count, tenantId); - - // Step 3: Return success response - return ApiResponse.SuccessResponse( - organizationList, - $"{organizationList.Count} records of organization names fetched from contacts", - 200 - ); - } - public async Task> GetDesignationList() - { - // Step 1: Get tenant and logged-in employee details - Guid tenantId = _userHelper.GetTenantId(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - _logger.LogInfo("GetDesignationList called by EmployeeId: {EmployeeId} in TenantId: {TenantId}", - loggedInEmployee.Id, tenantId); - - // Step 2: Fetch distinct, non-null designations from contacts - var designationList = await _context.Contacts - .Where(c => c.TenantId == tenantId && !string.IsNullOrWhiteSpace(c.Designation)) - .Select(c => c.Designation.Trim()) - .Distinct() - .ToListAsync(); - - _logger.LogInfo("EmployeeId: {EmployeeId} fetched {Count} designations from TenantId: {TenantId}", - loggedInEmployee.Id, designationList.Count, tenantId); - - // Step 3: Return result - return ApiResponse.SuccessResponse( - designationList, - $"{designationList.Count} records of designation fetched from contacts", - 200 - ); - } - public async Task> DeleteContact(Guid id, bool active) - { - // Step 1: Get tenant and logged-in employee info - Guid tenantId = _userHelper.GetTenantId(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - _logger.LogInfo("DeleteContact called by EmployeeId: {EmployeeId} for ContactId: {ContactId} with Active: {IsActive}", - loggedInEmployee.Id, id, active); - - // Step 2: Validate contact ID - if (id == Guid.Empty) - { - _logger.LogWarning("Empty contact ID received from EmployeeId: {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Contact ID is empty", "Contact ID is empty", 400); - } - - // Step 3: Check if contact exists under current tenant - var contact = await _context.Contacts - .FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); - - if (contact == null) - { - _logger.LogWarning("EmployeeId {EmployeeId} attempted to delete non-existent contact Id: {ContactId}", loggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - - // Step 4: Soft delete or restore contact - contact.IsActive = active; - - // Step 5: Log the update in DirectoryUpdateLog - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = contact.Id, - UpdatedById = loggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - - string status = active ? "restored" : "deleted"; - _logger.LogInfo("Contact {ContactId} successfully {Status} by EmployeeId: {EmployeeId}", - contact.Id, status, loggedInEmployee.Id); - - // Step 6: Return success response - return ApiResponse.SuccessResponse(new { }, $"Contact {status} successfully", 200); - } - - // -------------------------------- Contact Notes -------------------------------- - - /// - /// Retrieves a paginated list of contact notes based on user permissions. - /// - /// The number of items per page. - /// The current page number. - /// An ApiResponse containing the paginated notes or an error message. - public async Task> GetListOFAllNotes(Guid? projectId, int pageSize, int pageNumber) - { - _logger.LogInfo("Attempting to fetch list of all notes. PageSize: {PageSize}, PageNumber: {PageNumber}", pageSize, pageNumber); - - Guid tenantId = _userHelper.GetTenantId(); - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - List? projectContactIds = null; - - if (loggedInEmployee == null) - { - _logger.LogWarning("GetListOFAllNotes: LoggedInEmployee is null. Cannot proceed."); - return ApiResponse.ErrorResponse("Unauthorized", "Employee not found.", 401); - } - - // --- Permission Checks --- - var hasAdminPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); - var hasManagerPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryAdmin, loggedInEmployee.Id); - var hasUserPermission = await _permissionServices.HasPermission(PermissionsMaster.DirectoryUser, loggedInEmployee.Id); - - IQueryable notesQuery = _context.ContactNotes - .Include(cn => cn.UpdatedBy) - .Include(cn => cn.Createdby) // Assuming 'CreatedBy' (PascalCase) - .Include(cn => cn.Contact) - .Where(cn => cn.TenantId == tenantId) - .AsQueryable(); // Start building the query - - if (!hasAdminPermission && !(hasManagerPermission || hasUserPermission)) - { - _logger.LogWarning("GetListOFAllNotes: User {EmployeeId} does not have required permissions to access notes for TenantId: {TenantId}", loggedInEmployee.Id, tenantId); - return ApiResponse.ErrorResponse("Access Denied", "You don't have access to view notes.", 403); - } - if (projectId != null) - { - projectContactIds = await _context.ContactProjectMappings - .Where(pc => pc.ProjectId == projectId) - .Select(pc => pc.ContactId) - .ToListAsync(); - } - if (!hasAdminPermission) // If not an admin, apply additional filtering - { - _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} is not an admin. Applying manager/user specific filters.", loggedInEmployee.Id); - var assignedBucketIds = await _context.EmployeeBucketMappings - .Where(eb => eb.EmployeeId == loggedInEmployee.Id) - .Select(eb => eb.BucketId) - .ToListAsync(); - - if (!assignedBucketIds.Any()) - { - _logger.LogInfo("GetListOFAllNotes: User {EmployeeId} has no assigned buckets. Returning empty list.", loggedInEmployee.Id); - return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found based on assigned buckets.", 200); - } - - List? contactIds = null; - - if (projectContactIds == null) - { - contactIds = await _context.ContactBucketMappings - .Where(cb => assignedBucketIds.Contains(cb.BucketId)) - .Select(cb => cb.ContactId) - .ToListAsync(); - } - else - { - contactIds = await _context.ContactBucketMappings - .Where(cb => assignedBucketIds.Contains(cb.BucketId) && projectContactIds.Contains(cb.ContactId)) - .Select(cb => cb.ContactId) - .ToListAsync(); - } - - if (!contactIds.Any()) - { - _logger.LogInfo("GetListOFAllNotes: No contacts found for assigned buckets for user {EmployeeId}. Returning empty list.", loggedInEmployee.Id); - return ApiResponse.SuccessResponse(new { CurrentPage = pageNumber, TotalPages = 0, Data = new List() }, "No notes found for associated contacts.", 200); - } - - notesQuery = notesQuery.Where(cn => contactIds.Contains(cn.ContactId)); - } - else - { - if (projectContactIds != null) - { - notesQuery = notesQuery.Where(cn => projectContactIds.Contains(cn.ContactId)); - } - } - - // --- Pagination Logic --- - // Ensure pageSize and pageNumber are valid - pageSize = pageSize < 1 ? 25 : pageSize; // Default to 25 if less than 1 - pageNumber = pageNumber < 1 ? 1 : pageNumber; // Default to 1 if less than 1 - - // Get total count BEFORE applying Skip/Take for accurate pagination metadata - int totalRecords = await notesQuery.CountAsync(); - int totalPages = (int)Math.Ceiling((double)totalRecords / pageSize); - - int skip = (pageNumber - 1) * pageSize; - - // --- Apply Ordering and Pagination in the database --- - List notes = await notesQuery - .OrderByDescending(cn => (cn.UpdatedAt != null ? cn.UpdatedAt : cn.CreatedAt)) // Order by updated date or created date - .Skip(skip) - .Take(pageSize) - .ToListAsync(); - - _logger.LogInfo("GetListOFAllNotes: Fetched {Count} notes for page {PageNumber} of {TotalPages} total pages. Total records: {TotalRecords}.", - notes.Count, pageNumber, totalPages, totalRecords); - - // --- Map to ViewModel (in-memory) --- - // This mapping is done in memory because ToBasicEmployeeVMFromEmployee() is likely a C# method - // that cannot be translated to SQL by Entity Framework. - - List noteVMS = notes - .Select(cn => cn.ToContactNoteVMFromContactNote()) - .ToList(); - - var response = new - { - CurrentPage = pageNumber, - PageSize = pageSize, // Include pageSize in response for client clarity - TotalPages = totalPages, - TotalRecords = totalRecords, // Add total records for client - Data = noteVMS - }; - - _logger.LogInfo("GetListOFAllNotes: Successfully retrieved notes and mapped to ViewModel for TenantId: {TenantId}.", tenantId); - return ApiResponse.SuccessResponse(response, $"{noteVMS.Count} notes fetched successfully.", 200); - } - public async Task> GetNoteListByContactId(Guid id, bool active) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == id && c.IsActive && c.TenantId == tenantId); - if (contact != null) - { - List notes = new List(); - if (active) - { - notes = await _context.ContactNotes - .Include(n => n.Createdby) - .Include(n => n.UpdatedBy) - .Where(n => n.ContactId == contact.Id && n.IsActive && n.TenantId == tenantId) - .ToListAsync(); - } - else - { - notes = await _context.ContactNotes - .Include(n => n.Createdby) - .Include(n => n.UpdatedBy) - .Where(n => n.ContactId == contact.Id && n.TenantId == tenantId) - .ToListAsync(); - } - var noteIds = notes.Select(n => n.Id).ToList(); - List? updateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).ToListAsync(); - //List? noteVMs = new List(); - List? noteVMs = notes.Select(n => n.ToContactNoteVMFromContactNote()).ToList(); - - _logger.LogInfo("{count} contact-notes record from contact {ContactId} fetched by Employee {EmployeeId}", noteVMs.Count, id, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(noteVMs, $"{noteVMs.Count} contact-notes record fetched successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to fetch a list notes from contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - public async Task> CreateContactNote(CreateContactNoteDto noteDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (noteDto != null) - { - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.IsActive && c.TenantId == tenantId); - if (contact != null) - { - ContactNote note = noteDto.ToContactNoteFromCreateContactNoteDto(tenantId, LoggedInEmployee.Id); - _context.ContactNotes.Add(note); - await _context.SaveChangesAsync(); - ContactNoteVM noteVM = note.ToContactNoteVMFromContactNote(); - _logger.LogInfo("Employee {EmployeeId} Added note at contact {ContactId}", LoggedInEmployee.Id, contact.Id); - return ApiResponse.SuccessResponse(noteVM, "Note added successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to add a note to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateContactNote(Guid id, UpdateContactNoteDto noteDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (noteDto != null && id == noteDto.Id) - { - Contact? contact = await _context.Contacts.FirstOrDefaultAsync(c => c.Id == noteDto.ContactId && c.TenantId == tenantId); - if (contact != null) - { - ContactNote? contactNote = await _context.ContactNotes.Include(cn => cn.Createdby).Include(cn => cn.Contact).FirstOrDefaultAsync(n => n.Id == noteDto.Id && n.ContactId == contact.Id && n.IsActive); - if (contactNote != null) - { - contactNote.Note = noteDto.Note; - contactNote.UpdatedById = LoggedInEmployee.Id; - contactNote.UpdatedAt = DateTime.UtcNow; - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - ContactNoteVM noteVM = contactNote.ToContactNoteVMFromContactNote(); - noteVM.UpdatedAt = DateTime.UtcNow; - noteVM.UpdatedBy = LoggedInEmployee.ToBasicEmployeeVMFromEmployee(); - - _logger.LogInfo("Employee {EmployeeId} updated note {NoteId} at contact {ContactId}", LoggedInEmployee.Id, noteVM.Id, contact.Id); - return ApiResponse.SuccessResponse(noteVM, "Note updated successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the Note was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Note not found", "Note not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} attempted to update a note {NoteId} to contact with ID {ContactId}, but the contact was not found in the database.", LoggedInEmployee.Id, noteDto.Id, noteDto.ContactId); - return ApiResponse.ErrorResponse("Contact not found", "Contact not found", 404); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> DeleteContactNote(Guid id, bool active) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - ContactNote? note = await _context.ContactNotes.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); - if (note != null) - { - note.IsActive = active; - note.UpdatedById = LoggedInEmployee.Id; - note.UpdatedAt = DateTime.UtcNow; - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted note {NoteId}", LoggedInEmployee.Id, id); - } - - _logger.LogWarning("Employee {EmployeeId} tries to delete contact note {NoteId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Note deleted successfully", 200); - } - - // -------------------------------- Bucket -------------------------------- - - public async Task> GetBucketList() - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - - List employeeBuckets = await _context.EmployeeBucketMappings.Where(b => b.EmployeeId == LoggedInEmployee.Id).ToListAsync(); - var bucketIds = employeeBuckets.Select(b => b.BucketId).ToList(); - - List bucketList = new List(); - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => b.TenantId == tenantId).ToListAsync(); - bucketIds = bucketList.Select(b => b.Id).ToList(); - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) || permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - bucketList = await _context.Buckets.Include(b => b.CreatedBy).Where(b => bucketIds.Contains(b.Id) || b.CreatedByID == LoggedInEmployee.Id).ToListAsync(); - } - else - { - _logger.LogWarning("Employee {EmployeeId} attemped to access a buckets list, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - List employeeBucketVM = await _context.EmployeeBucketMappings.Where(b => bucketIds.Contains(b.BucketId)).ToListAsync(); - - List bucketVMs = new List(); - if (bucketList.Any()) - { - bucketIds = bucketList.Select(b => b.Id).ToList(); - List? contactBucketMappings = await _context.ContactBucketMappings.Where(cb => bucketIds.Contains(cb.BucketId)).ToListAsync(); - foreach (var bucket in bucketList) - { - List employeeBucketMappings = employeeBucketVM.Where(eb => eb.BucketId == bucket.Id).ToList(); - var emplyeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - List? contactBuckets = contactBucketMappings.Where(cb => cb.BucketId == bucket.Id).ToList(); - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - if (bucketVM.CreatedBy != null) - { - emplyeeIds.Add(bucketVM.CreatedBy.Id); - } - bucketVM.EmployeeIds = emplyeeIds.Distinct().ToList(); - bucketVM.NumberOfContacts = contactBuckets.Count; - bucketVMs.Add(bucketVM); - } - } - - _logger.LogInfo("{count} Buckets are fetched by Employee with ID {LoggedInEmployeeId}", bucketVMs.Count, LoggedInEmployee.Id); - return ApiResponse.SuccessResponse(bucketVMs, $"{bucketVMs.Count} buckets fetched successfully", 200); - } - public async Task> CreateBucket(CreateBucketDto bucketDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (bucketDto != null) - { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var demo = !permissionIds.Contains(PermissionsMaster.DirectoryUser); - if (!permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && !permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - _logger.LogWarning("Employee {EmployeeId} attemped to create a bucket, but do not have permission", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("You don't have permission", "You don't have permission", 401); - } - - var existingBucket = await _context.Buckets.FirstOrDefaultAsync(b => b.Name == bucketDto.Name); - if (existingBucket != null) - { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to create an existing bucket.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket already existed", "Bucket already existed", 409); - } - Bucket bucket = new Bucket - { - Name = bucketDto.Name, - Description = bucketDto.Description, - CreatedAt = DateTime.UtcNow, - CreatedByID = LoggedInEmployee.Id, - TenantId = tenantId - }; - _context.Buckets.Add(bucket); - - EmployeeBucketMapping employeeBucket = new EmployeeBucketMapping - { - EmployeeId = LoggedInEmployee.Id, - BucketId = bucket.Id - }; - - _context.EmployeeBucketMappings.Add(employeeBucket); - await _context.SaveChangesAsync(); - bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucket.Id) ?? new Bucket(); - BucketVM bucketVM = bucket.ToBucketVMFromBucket(); - _logger.LogInfo("Employee Id {LoggedInEmployeeId} creayted new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.SuccessResponse(bucketVM, "Bucket Created SuccessFully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> UpdateBucket(Guid id, UpdateBucketDto bucketDto) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (bucketDto != null && id == bucketDto.Id) - { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); - Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketDto.Id && b.TenantId == tenantId); - - if (bucket == null) - { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); - } - - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); - } - - bucket.Name = bucketDto.Name ?? ""; - bucket.Description = bucketDto.Description ?? ""; - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = bucketDto.Id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - List employeeBucketMappings = employeeBuckets.Where(eb => eb.BucketId == bucket.Id).ToList(); - List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - var employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - bucketVM.EmployeeIds = employeeIds; - bucketVM.NumberOfContacts = contactBuckets.Count; - - _logger.LogInfo("Employee Id {LoggedInEmployeeId} Updated new bucket {BucketId}", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.SuccessResponse(bucketVM, "Bucket update successFully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> AssignBucket(Guid bucketId, List assignBuckets) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (assignBuckets != null && bucketId != Guid.Empty) - { - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - - Bucket? bucket = await _context.Buckets.Include(b => b.CreatedBy).FirstOrDefaultAsync(b => b.Id == bucketId && b.TenantId == tenantId); - - if (bucket == null) - { - _logger.LogWarning("Employee ID {LoggedInEmployeeId} attempted to update a bucket but not found in database.", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("Bucket not found", "Bucket not found", 404); - } - var employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucketId).ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); - var employeeBucketIds = employeeBuckets.Select(eb => eb.EmployeeId).ToList(); - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(bucketId)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); - } - var employeeIds = await _context.Employees.Where(e => e.TenantId == tenantId && e.IsActive).Select(e => e.Id).ToListAsync(); - int assignedEmployee = 0; - int removededEmployee = 0; - foreach (var assignBucket in assignBuckets) - { - if (employeeIds.Contains(assignBucket.EmployeeId)) - { - if (assignBucket.IsActive && !employeeBucketIds.Contains(assignBucket.EmployeeId)) - { - EmployeeBucketMapping employeeBucketMapping = new EmployeeBucketMapping - { - EmployeeId = assignBucket.EmployeeId, - BucketId = bucketId - }; - _context.EmployeeBucketMappings.Add(employeeBucketMapping); - assignedEmployee += 1; - } - else if (!assignBucket.IsActive) - { - EmployeeBucketMapping? employeeBucketMapping = employeeBuckets.FirstOrDefault(eb => eb.BucketId == bucketId && eb.EmployeeId == assignBucket.EmployeeId); - if (employeeBucketMapping != null) - { - _context.EmployeeBucketMappings.Remove(employeeBucketMapping); - removededEmployee += 1; - } - } - } - } - - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = bucketId, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - - await _context.SaveChangesAsync(); - - AssignBucketVM bucketVM = bucket.ToAssignBucketVMFromBucket(); - List employeeBucketMappings = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - List contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == bucket.Id).ToListAsync(); - employeeIds = employeeBucketMappings.Select(eb => eb.EmployeeId).ToList(); - bucketVM.EmployeeIds = employeeIds; - bucketVM.NumberOfContacts = contactBuckets.Count; - - if (assignedEmployee > 0) - { - _logger.LogInfo("Employee {EmployeeId} assigned bucket {BucketId} to {conut} number of employees", LoggedInEmployee.Id, bucketId, assignedEmployee); - } - if (removededEmployee > 0) - { - _logger.LogWarning("Employee {EmployeeId} removed {conut} number of employees from bucket {BucketId}", LoggedInEmployee.Id, removededEmployee, bucketId); - } - return ApiResponse.SuccessResponse(bucketVM, "Details updated successfully", 200); - } - _logger.LogWarning("Employee with ID {LoggedInEmployeeId} sended empty payload", LoggedInEmployee.Id); - return ApiResponse.ErrorResponse("User Send empty Payload", "User Send empty Payload", 400); - } - public async Task> DeleteBucket(Guid id) - { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - Bucket? bucket = await _context.Buckets.FirstOrDefaultAsync(n => n.Id == id && n.TenantId == tenantId); - - if (bucket != null) - { - List? employeeBuckets = await _context.EmployeeBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - List? contactBuckets = await _context.ContactBucketMappings.Where(eb => eb.BucketId == id).ToListAsync(); - - if (contactBuckets.Any()) - { - _logger.LogInfo("Employee {EmployeeId} attempted to deleted bucket {BucketId},but bucket have contacts in it.", LoggedInEmployee.Id, id); - return ApiResponse.ErrorResponse("This bucket can not be deleted", "This bucket can not be deleted", 400); - } - - var assignedRoleIds = await _context.EmployeeRoleMappings.Where(r => r.EmployeeId == LoggedInEmployee.Id).Select(r => r.RoleId).ToListAsync(); - var permissionIds = await _context.RolePermissionMappings.Where(rp => assignedRoleIds.Contains(rp.ApplicationRoleId)).Select(rp => rp.FeaturePermissionId).Distinct().ToListAsync(); - var bucketIds = employeeBuckets.Where(eb => eb.EmployeeId == LoggedInEmployee.Id).Select(eb => eb.BucketId).ToList(); - - Bucket? accessableBucket = null; - if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryAdmin) && bucketIds.Contains(id)) - { - accessableBucket = bucket; - } - else if (permissionIds.Contains(PermissionsMaster.DirectoryUser)) - { - if (bucket.CreatedByID == LoggedInEmployee.Id) - { - accessableBucket = bucket; - } - } - if (accessableBucket == null) - { - _logger.LogWarning("Employee {EmployeeId} attempted to access bucket {BucketId} without the necessary permissions.", LoggedInEmployee.Id, bucket.Id); - return ApiResponse.ErrorResponse("You don't have permission to access this bucket", "You don't have permission to access this bucket", 401); - } - - _context.EmployeeBucketMappings.RemoveRange(employeeBuckets); - _context.Buckets.Remove(bucket); - _context.DirectoryUpdateLogs.Add(new DirectoryUpdateLog - { - RefereanceId = id, - UpdatedById = LoggedInEmployee.Id, - UpdateAt = DateTime.UtcNow - }); - await _context.SaveChangesAsync(); - _logger.LogInfo("Employee {EmployeeId} deleted bucket {BucketId} and related entries", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); - } - - _logger.LogWarning("Employee {EmployeeId} tries to delete bucket {BucketId} but not found in database", LoggedInEmployee.Id, id); - return ApiResponse.SuccessResponse(new { }, "Bucket deleted successfully", 200); - } - - // -------------------------------- Helper -------------------------------- - - private bool Compare(string sentence, string search) - { - sentence = sentence.Trim().ToLower(); - search = search.Trim().ToLower(); - - // Check for exact substring - bool result = sentence.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; - return result; - } - } -} \ No newline at end of file diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 0d9a3ef..71b4e28 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -186,7 +186,6 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 83b4079..5fa811f 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -819,6 +819,106 @@ namespace Marco.Pms.Services.Service } } + /// + /// Fetches filter options (Buckets and Contact Categories) based on user permissions + /// for a given tenant. + /// + /// The tenant ID. + /// The employee making the request. + /// ApiResponse with Buckets and Contact Categories. + public async Task> GetContactFilterObjectAsync(Guid tenantId, Employee loggedInEmployee) + { + try + { + _logger.LogInfo("Started fetching contact filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", + tenantId, loggedInEmployee.Id); + + // Step 1: Determine accessible bucket IDs based on permissions + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + List? accessibleBucketIds = null; + + if (hasAdminPermission) + { + // Admin → Has access to all buckets in the tenant + accessibleBucketIds = await _context.Buckets + .Where(b => b.TenantId == tenantId) + .Select(b => b.Id) + .ToListAsync(); + + _logger.LogDebug("Admin access granted. Fetched {Count} tenant buckets.", accessibleBucketIds.Count); + } + else if (hasManagerPermission || hasUserPermission) + { + // Manager/User → Only mapped buckets + accessibleBucketIds = await _context.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToListAsync(); + + _logger.LogDebug("Manager/User access granted. Fetched {Count} mapped buckets for EmployeeId: {EmployeeId}", + accessibleBucketIds.Count, loggedInEmployee.Id); + } + else + { + _logger.LogWarning("No permissions found for EmployeeId: {EmployeeId}. Returning empty bucket list.", loggedInEmployee.Id); + } + + // Step 2: Fetch available buckets (accessible OR personally created by the employee) + var buckets = await _context.Buckets + .Where(b => + (accessibleBucketIds != null && accessibleBucketIds.Contains(b.Id) && b.TenantId == tenantId) + || b.CreatedByID == loggedInEmployee.Id) + .Select(b => new + { + Id = b.Id, + Name = b.Name + }) + .OrderBy(b => b.Name) + .Distinct() // Ensures no duplicates (LINQ to Entities distinct works with anonymous types) + .ToListAsync(); + + accessibleBucketIds = buckets.Select(b => b.Id).ToList(); + + _logger.LogInfo("Fetched {Count} buckets for EmployeeId: {EmployeeId}", buckets.Count, loggedInEmployee.Id); + + // Step 3: Fetch contact categories mapped to the retrieved buckets + var contactCategories = await _context.ContactBucketMappings + .AsNoTracking() // Optimized since we are reading only + .Include(cb => cb.Contact) + .ThenInclude(c => c!.ContactCategory) + .Where(cb => + accessibleBucketIds.Contains(cb.BucketId) && + cb.Contact != null && + cb.Contact!.ContactCategory != null) + .Select(cb => new + { + Id = cb.Contact!.ContactCategory!.Id, + Name = cb.Contact.ContactCategory.Name + }) + .OrderBy(cc => cc.Name) + .Distinct() + .ToListAsync(); + + _logger.LogInfo("{Count} contact categories fetched for EmployeeId: {EmployeeId}", contactCategories.Count, loggedInEmployee.Id); + + // Step 4: Prepare response payload + var response = new + { + Buckets = buckets, + ContactCategories = contactCategories + }; + + _logger.LogInfo("Successfully returning filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(response, "Filters for contact fetched successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error while fetching contact filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("An error occurred while fetching filters", 500); + } + } + + #endregion #region =================================================================== Contact Post APIs =================================================================== @@ -1661,6 +1761,125 @@ namespace Marco.Pms.Services.Service StatusCodes.Status200OK); } + /// + /// Fetches filter objects (CreatedBy employees and Organizations) for Contact Notes + /// accessible by the logged-in employee, based on permissions. + /// + /// The tenant ID. + /// The employee requesting filters. + /// ApiResponse containing CreatedBy and Organizations filter options. + public async Task> GetContactNotesFilterObjectAsync(Guid tenantId, Employee loggedInEmployee) + { + try + { + _logger.LogInfo("Started fetching Contact Notes filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", + tenantId, loggedInEmployee.Id); + + // Step 1: Fetch accessible bucket IDs based on permissions + var (hasAdminPermission, hasManagerPermission, hasUserPermission) = await CheckPermissionsAsync(loggedInEmployee.Id); + List? accessibleBucketIds = null; + + if (hasAdminPermission) + { + // Admin → Access to all buckets in the tenant + accessibleBucketIds = await _context.Buckets + .Where(b => b.TenantId == tenantId) + .Select(b => b.Id) + .ToListAsync(); + + _logger.LogDebug("Admin access granted. Found {Count} buckets.", accessibleBucketIds.Count); + } + else if (hasManagerPermission || hasUserPermission) + { + // Manager/User → Access to mapped buckets only + accessibleBucketIds = await _context.EmployeeBucketMappings + .Where(eb => eb.EmployeeId == loggedInEmployee.Id) + .Select(eb => eb.BucketId) + .ToListAsync(); + + _logger.LogDebug("Manager/User access granted. Found {Count} mapped buckets for EmployeeId: {EmployeeId}.", + accessibleBucketIds.Count, loggedInEmployee.Id); + } + else + { + _logger.LogWarning("No permissions found for EmployeeId: {EmployeeId}. Returning empty filters.", loggedInEmployee.Id); + } + + // Step 2: Fetch Contact IDs from ContactBucketMappings + var contactIds = await _context.ContactBucketMappings + .Where(cb => accessibleBucketIds != null && accessibleBucketIds.Contains(cb.BucketId)) + .Select(cb => cb.ContactId) + .Distinct() // ensures no duplicate contact IDs + .ToListAsync(); + + _logger.LogInfo("Fetched {Count} contact Ids from accessible buckets.", contactIds.Count); + + // Step 3: Fetch Contacts related to Contact Notes for those contactIds + var contacts = await _context.ContactNotes + .AsNoTracking() // no need to track since it’s for read-only filters + .Include(cn => cn.Contact) + .ThenInclude(c => c!.CreatedBy) + .Where(cn => + contactIds.Contains(cn.ContactId) && + cn.Contact != null && + cn.Contact.CreatedBy != null && + cn.TenantId == tenantId) + .Select(cn => cn.Contact!) + .Distinct() // avoid duplicate contacts from multiple notes + .ToListAsync(); + + _logger.LogInfo("Fetched {Count} unique contacts with notes.", contacts.Count); + + // Step 4: Build organization filters + var organizations = contacts + .Where(c => !string.IsNullOrEmpty(c.Organization)) // filter out null/empty orgs + .Select(c => new + { + Id = c.Organization, // Using organization string as unique identifier + Name = c.Organization + }) + .Distinct() + .OrderBy(o => o.Name) + .ToList(); + + _logger.LogInfo("Extracted {Count} unique organizations from contacts.", organizations.Count); + + // Step 5: Build CreatedBy filters (employees who created the contacts) + var createdBy = contacts + .Select(c => new + { + Id = c.CreatedBy!.Id, + Name = $"{c.CreatedBy.FirstName} {c.CreatedBy.LastName}".Trim() + }) + .Distinct() + .OrderBy(e => e.Name) + .ToList(); + + _logger.LogInfo("Extracted {Count} unique CreatedBy employees from contacts.", createdBy.Count); + + // Step 6: Build response + var response = new + { + CreatedBy = createdBy, + Organizations = organizations + }; + + _logger.LogInfo("Successfully returning Contact Notes filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", + tenantId, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(response, "Filters for contact notes fetched successfully", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, + "Error occurred while fetching Contact Notes filters for TenantId: {TenantId}, EmployeeId: {EmployeeId}", + tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("An error occurred while fetching filters", 500); + } + } + + /// /// Creates a note for a given contact under the specified tenant. /// Ensures that the contact exists and belongs to the tenant before adding the note. @@ -1915,7 +2134,6 @@ namespace Marco.Pms.Services.Service } } - #endregion #region =================================================================== Bucket APIs =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index c7d7d45..49db0c7 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -12,6 +12,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetContactProfileAsync(Guid id, Guid tenantId, Employee loggedInEmployee); Task> GetOrganizationListAsync(Guid tenantId, Employee loggedInEmployee); Task> GetDesignationListAsync(Guid tenantId, Employee loggedInEmployee); + Task> GetContactFilterObjectAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateContactAsync(CreateContactDto createContact, Guid tenantId, Employee loggedInEmployee); Task> UpdateContactAsync(Guid id, UpdateContactDto updateContact, Guid tenantId, Employee loggedInEmployee); Task> DeleteContactAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); @@ -22,6 +23,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); Task> GetNoteListByContactIdAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); + Task> GetContactNotesFilterObjectAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateContactNoteAsync(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); Task> UpdateContactNoteAsync(Guid id, UpdateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); Task> DeleteContactNoteAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); -- 2.43.0 From 672046d02e117f9b41b70fc625e1af0ab73ef678 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 5 Sep 2025 17:48:25 +0530 Subject: [PATCH 52/63] Added the contact note filter in get all contact notes API --- .../Utilities/ContactNoteFilter.cs | 8 ++ .../Controllers/DirectoryController.cs | 4 +- .../Service/DirectoryService.cs | 74 +++++++++++++++++-- .../ServiceInterfaces/IDirectoryService.cs | 2 +- 4 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 Marco.Pms.Model/Utilities/ContactNoteFilter.cs diff --git a/Marco.Pms.Model/Utilities/ContactNoteFilter.cs b/Marco.Pms.Model/Utilities/ContactNoteFilter.cs new file mode 100644 index 0000000..7db8115 --- /dev/null +++ b/Marco.Pms.Model/Utilities/ContactNoteFilter.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Utilities +{ + public class ContactNoteFilter + { + public List? CreatedByIds { get; set; } + public List? Organizations { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 431122e..b4b6cfa 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -142,10 +142,10 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Contact Notes APIs =================================================================== [HttpGet("notes")] - public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) + public async Task GetListOFAllNotes([FromQuery] Guid? projectId, [FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _directoryService.GetListOFAllNotesAsync(projectId, pageSize, pageNumber, tenantId, loggedInEmployee); + var response = await _directoryService.GetListOFAllNotesAsync(projectId, searchString, filter, pageSize, pageNumber, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index 5fa811f..d522f66 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -118,7 +118,7 @@ namespace Marco.Pms.Services.Service } // --- Advanced Filtering from 'filter' parameter --- - ContactFilterDto? contactFilter = TryDeserializeFilter(filter); + ContactFilterDto? contactFilter = TryDeserializeContactFilter(filter); if (contactFilter?.BucketIds?.Any() ?? false) { // Note: Permission filtering is already applied. Here we further restrict by the user's filter choice. @@ -918,7 +918,6 @@ namespace Marco.Pms.Services.Service } } - #endregion #region =================================================================== Contact Post APIs =================================================================== @@ -1513,7 +1512,7 @@ namespace Marco.Pms.Services.Service #region =================================================================== Contact Notes APIs =================================================================== - public async Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee) + public async Task> GetListOFAllNotesAsync(Guid? projectId, string? searchString, string? filter, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee) { _logger.LogInfo("Initiating GetListOFAllNotesAsync. TenantId: {TenantId}, ProjectId: {ProjectId}, PageSize: {PageSize}, PageNumber: {PageNumber}, EmployeeId: {EmployeeId}", tenantId, projectId ?? Guid.Empty, pageSize, pageNumber, loggedInEmployee.Id); @@ -1610,6 +1609,31 @@ namespace Marco.Pms.Services.Service notesQuery = notesQuery.Where(cn => projectContactIds.Contains(cn.ContactId)); } + // --- Advanced Filtering from 'filter' parameter --- + ContactNoteFilter? contactNoteFilter = TryDeserializeContactNoteFilter(filter); + if (contactNoteFilter != null) + { + if (contactNoteFilter.CreatedByIds?.Any() ?? false) + { + notesQuery = notesQuery.Where(cn => contactNoteFilter.CreatedByIds.Contains(cn.CreatedById)); + } + if (contactNoteFilter.Organizations?.Any() ?? false) + { + notesQuery = notesQuery.Where(cn => cn.Contact != null && contactNoteFilter.Organizations.Contains(cn.Contact.Organization)); + } + } + + // --- Search Term Filtering --- + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchTermLower = searchString.ToLower(); + notesQuery = notesQuery.Where(c => + (c.Contact != null && c.Contact.Name.ToLower().Contains(searchTermLower)) || + (c.Contact != null && c.Contact.Organization != null && c.Contact.Organization.ToLower().Contains(searchTermLower)) || + c.Note.ToLower().Contains(searchTermLower) + ); + } + // Pagination safeguard pageSize = pageSize < 1 ? 25 : pageSize; pageNumber = pageNumber < 1 ? 1 : pageNumber; @@ -2735,7 +2759,7 @@ namespace Marco.Pms.Services.Service return result; } - private ContactFilterDto? TryDeserializeFilter(string? filter) + private ContactFilterDto? TryDeserializeContactFilter(string? filter) { if (string.IsNullOrWhiteSpace(filter)) { @@ -2752,7 +2776,7 @@ namespace Marco.Pms.Services.Service } catch (JsonException ex) { - _logger.LogError(ex, "[{MethodName}] Failed to directly deserialize filter. Attempting to unescape and re-parse. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + _logger.LogError(ex, "[{MethodName}] Failed to directly deserialize filter. Attempting to unescape and re-parse. Filter: {Filter}", nameof(TryDeserializeContactFilter), filter); // If direct deserialization fails, it might be an escaped string (common with tools like Postman or some mobile clients). try @@ -2767,7 +2791,45 @@ namespace Marco.Pms.Services.Service catch (JsonException ex1) { // If both attempts fail, log the final error and return null. - _logger.LogError(ex1, "[{MethodName}] All attempts to deserialize the filter failed. Filter will be ignored. Filter: {Filter}", nameof(TryDeserializeFilter), filter); + _logger.LogError(ex1, "[{MethodName}] All attempts to deserialize the filter failed. Filter will be ignored. Filter: {Filter}", nameof(TryDeserializeContactFilter), filter); + return null; + } + } + return expenseFilter; + } + private ContactNoteFilter? TryDeserializeContactNoteFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + ContactNoteFilter? expenseFilter = null; + + try + { + // First, try to deserialize directly. This is the expected case (e.g., from a web client). + expenseFilter = JsonSerializer.Deserialize(filter, options); + } + catch (JsonException ex) + { + _logger.LogError(ex, "[{MethodName}] Failed to directly deserialize filter. Attempting to unescape and re-parse. Filter: {Filter}", nameof(TryDeserializeContactNoteFilter), filter); + + // If direct deserialization fails, it might be an escaped string (common with tools like Postman or some mobile clients). + try + { + // Unescape the string first, then deserialize the result. + string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; + if (!string.IsNullOrWhiteSpace(unescapedJsonString)) + { + expenseFilter = JsonSerializer.Deserialize(unescapedJsonString, options); + } + } + catch (JsonException ex1) + { + // If both attempts fail, log the final error and return null. + _logger.LogError(ex1, "[{MethodName}] All attempts to deserialize the filter failed. Filter will be ignored. Filter: {Filter}", nameof(TryDeserializeContactNoteFilter), filter); return null; } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs index 49db0c7..d499d1e 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IDirectoryService.cs @@ -21,7 +21,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces - Task> GetListOFAllNotesAsync(Guid? projectId, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); + Task> GetListOFAllNotesAsync(Guid? projectId, string? searchString, string? filter, int pageSize, int pageNumber, Guid tenantId, Employee loggedInEmployee); Task> GetNoteListByContactIdAsync(Guid id, bool active, Guid tenantId, Employee loggedInEmployee); Task> GetContactNotesFilterObjectAsync(Guid tenantId, Employee loggedInEmployee); Task> CreateContactNoteAsync(CreateContactNoteDto noteDto, Guid tenantId, Employee loggedInEmployee); -- 2.43.0 From 4f774315416157f8ead83439976586b132035e54 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 10:32:32 +0530 Subject: [PATCH 53/63] Changed the folder name --- Marco.Pms.Model/MobileLogs/LogStructure.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Marco.Pms.Model/MobileLogs/LogStructure.cs diff --git a/Marco.Pms.Model/MobileLogs/LogStructure.cs b/Marco.Pms.Model/MobileLogs/LogStructure.cs new file mode 100644 index 0000000..01fe9a8 --- /dev/null +++ b/Marco.Pms.Model/MobileLogs/LogStructure.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.Logs +{ + public class LogStructure + { + public string LogLevel { get; set; } = "Info"; + public string Message { get; set; } = string.Empty; + public DateTime TimeStamp { get; set; } + public string? IpAddress { get; set; } + public string? UserAgent { get; set; } + public string? Details { get; set; } // json serialized string + } +} -- 2.43.0 From 06db1adc5237670282108f3eff0d30caaf7d21e6 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 11:47:53 +0530 Subject: [PATCH 54/63] Added the debug logs in log controller --- Marco.Pms.Services/Controllers/LogController.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marco.Pms.Services/Controllers/LogController.cs b/Marco.Pms.Services/Controllers/LogController.cs index 4efaf85..c206d0b 100644 --- a/Marco.Pms.Services/Controllers/LogController.cs +++ b/Marco.Pms.Services/Controllers/LogController.cs @@ -101,6 +101,9 @@ namespace Marco.Pms.Services.Controllers // Use a switch expression or simple if/else for clarity based on log level switch (logLevel?.ToLowerInvariant()) // Use ToLowerInvariant for case-insensitive comparison { + case "debug": + _logger.LogDebug(message); + break; case "info": case "information": // Common alias for info _logger.LogInformation(message); -- 2.43.0 From 365439b2dea17fbdeec35b28b7155209f4459730 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 14:49:14 +0530 Subject: [PATCH 55/63] only send employee with unique IDs when getting list --- Marco.Pms.Services/Controllers/EmployeeController.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index a230633..240d533 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -148,6 +148,8 @@ namespace MarcoBMS.Services.Controllers .Distinct() .ToListAsync(); + employeeIds = employeeIds.Distinct().ToList(); + result = await _context.Employees .Include(fp => fp.JobRole) .Where(e => employeeIds.Contains(e.Id) && e.IsActive) -- 2.43.0 From 73318060ec73c244f5365e817f970f2a925b1db8 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 14:58:16 +0530 Subject: [PATCH 56/63] Added the distinct in get employee list --- Marco.Pms.Services/Controllers/EmployeeController.cs | 3 +-- Marco.Pms.Services/Helpers/EmployeeHelper.cs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 240d533..4052f32 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -148,12 +148,11 @@ namespace MarcoBMS.Services.Controllers .Distinct() .ToListAsync(); - employeeIds = employeeIds.Distinct().ToList(); - result = await _context.Employees .Include(fp => fp.JobRole) .Where(e => employeeIds.Contains(e.Id) && e.IsActive) .Select(e => e.ToEmployeeVMFromEmployee()) + .Distinct() .ToListAsync(); _logger.LogInfo("Employee list fetched using limited access (active only)."); diff --git a/Marco.Pms.Services/Helpers/EmployeeHelper.cs b/Marco.Pms.Services/Helpers/EmployeeHelper.cs index bce7628..d79e424 100644 --- a/Marco.Pms.Services/Helpers/EmployeeHelper.cs +++ b/Marco.Pms.Services/Helpers/EmployeeHelper.cs @@ -84,6 +84,7 @@ namespace MarcoBMS.Services.Helpers .ThenInclude(e => e!.JobRole) .Where(c => c.ProjectId == ProjectId.Value && c.IsActive && c.Employee != null) .Select(pa => pa.Employee!.ToEmployeeVMFromEmployee()) + .Distinct() .ToListAsync(); } -- 2.43.0 From aa2a370467a5fa651203ecadfc9809615ef13a55 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 15:07:30 +0530 Subject: [PATCH 57/63] getting the employee list filtered by tenant --- .../Controllers/EmployeeController.cs | 4 ++-- Marco.Pms.Services/Helpers/EmployeeHelper.cs | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 4052f32..2926db1 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -143,14 +143,14 @@ namespace MarcoBMS.Services.Controllers else if (hasViewTeamMembersPermission && !ShowInactive) { var employeeIds = await _context.ProjectAllocations - .Where(pa => projectIds.Contains(pa.ProjectId) && pa.IsActive) + .Where(pa => projectIds.Contains(pa.ProjectId) && pa.IsActive && pa.TenantId == tenantId) .Select(pa => pa.EmployeeId) .Distinct() .ToListAsync(); result = await _context.Employees .Include(fp => fp.JobRole) - .Where(e => employeeIds.Contains(e.Id) && e.IsActive) + .Where(e => employeeIds.Contains(e.Id) && e.IsActive && e.TenantId == tenantId) .Select(e => e.ToEmployeeVMFromEmployee()) .Distinct() .ToListAsync(); diff --git a/Marco.Pms.Services/Helpers/EmployeeHelper.cs b/Marco.Pms.Services/Helpers/EmployeeHelper.cs index d79e424..c359a93 100644 --- a/Marco.Pms.Services/Helpers/EmployeeHelper.cs +++ b/Marco.Pms.Services/Helpers/EmployeeHelper.cs @@ -71,31 +71,30 @@ namespace MarcoBMS.Services.Helpers } } - public async Task> GetEmployeeByProjectId(Guid TenentId, Guid? ProjectId, bool ShowInActive) + public async Task> GetEmployeeByProjectId(Guid tenantId, Guid? projectId, bool ShowInActive) { try { List result = new List(); - if (ProjectId.HasValue) + if (projectId.HasValue) { result = await _context.ProjectAllocations .Include(pa => pa.Employee) .ThenInclude(e => e!.JobRole) - .Where(c => c.ProjectId == ProjectId.Value && c.IsActive && c.Employee != null) + .Where(pa => pa.ProjectId == projectId.Value && pa.IsActive && pa.Employee != null && pa.TenantId == tenantId) .Select(pa => pa.Employee!.ToEmployeeVMFromEmployee()) - .Distinct() .ToListAsync(); } else if (ShowInActive) { - result = await _context.Employees.Where(c => c.TenantId == TenentId && c.IsActive == false).Include(fp => fp.JobRole) + result = await _context.Employees.Where(c => c.TenantId == tenantId && c.IsActive == false).Include(fp => fp.JobRole) .Select(c => c.ToEmployeeVMFromEmployee()).ToListAsync(); } else { - result = await _context.Employees.Where(c => c.TenantId == TenentId && c.IsActive == true).Include(fp => fp.JobRole) + result = await _context.Employees.Where(c => c.TenantId == tenantId && c.IsActive == true).Include(fp => fp.JobRole) .Select(c => c.ToEmployeeVMFromEmployee()).ToListAsync(); } @@ -103,7 +102,7 @@ namespace MarcoBMS.Services.Helpers } catch (Exception ex) { - _logger.LogError(ex, "Error occured while featching list of employee by project ID {ProjectId}", ProjectId ?? Guid.Empty); + _logger.LogError(ex, "Error occured while featching list of employee by project ID {ProjectId}", projectId ?? Guid.Empty); return new List(); } } -- 2.43.0 From ecabf52f2f51fd4fe5c2f320a100e21db81ae189 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 15:09:25 +0530 Subject: [PATCH 58/63] splited the logic to get employee by projecr id --- Marco.Pms.Services/Helpers/EmployeeHelper.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Helpers/EmployeeHelper.cs b/Marco.Pms.Services/Helpers/EmployeeHelper.cs index c359a93..edda815 100644 --- a/Marco.Pms.Services/Helpers/EmployeeHelper.cs +++ b/Marco.Pms.Services/Helpers/EmployeeHelper.cs @@ -4,6 +4,7 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Mapper; using Marco.Pms.Model.ViewModels.Employee; using MarcoBMS.Services.Service; +using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; namespace MarcoBMS.Services.Helpers @@ -78,12 +79,17 @@ namespace MarcoBMS.Services.Helpers List result = new List(); if (projectId.HasValue) { + var employeeIds = await _context.ProjectAllocations + .Where(pa => projectId == pa.ProjectId && pa.IsActive && pa.TenantId == tenantId) + .Select(pa => pa.EmployeeId) + .Distinct() + .ToListAsync(); - result = await _context.ProjectAllocations - .Include(pa => pa.Employee) - .ThenInclude(e => e!.JobRole) - .Where(pa => pa.ProjectId == projectId.Value && pa.IsActive && pa.Employee != null && pa.TenantId == tenantId) - .Select(pa => pa.Employee!.ToEmployeeVMFromEmployee()) + result = await _context.Employees + .Include(fp => fp.JobRole) + .Where(e => employeeIds.Contains(e.Id) && e.IsActive && e.TenantId == tenantId) + .Select(e => e.ToEmployeeVMFromEmployee()) + .Distinct() .ToListAsync(); } -- 2.43.0 From de08ceeb0d33d076250943b01bbeb0fd38c459e1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Sep 2025 15:12:26 +0530 Subject: [PATCH 59/63] reduce the otp exprie time to 5 mins --- Marco.Pms.Services/Controllers/AuthController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/AuthController.cs b/Marco.Pms.Services/Controllers/AuthController.cs index 67dd74a..85a0ef4 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -518,7 +518,7 @@ namespace MarcoBMS.Services.Controllers { UserId = Guid.Parse(requestedUser.Id), OTP = otp, - ExpriesInSec = 600, // 10 minutes + ExpriesInSec = 300, // 10 minutes TimeStamp = DateTime.UtcNow, TenantId = requestedUser.TenantId }; -- 2.43.0 From caeac04d0d7b0b7d6eee4456712e94aa680b81b4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Sep 2025 15:29:26 +0530 Subject: [PATCH 60/63] Added the logic to bypass the seat check condition --- Marco.Pms.Services/Helpers/GeneralHelper.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index 45cdb13..289c87e 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -13,6 +13,7 @@ namespace Marco.Pms.Services.Helpers private readonly ApplicationDbContext _context; // Keeping this for direct scoped context use where appropriate private readonly ILoggingService _logger; private readonly FeatureDetailsHelper _featureDetailsHelper; + private static readonly Guid SuperTenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); public GeneralHelper(IDbContextFactory dbContextFactory, ApplicationDbContext context, ILoggingService logger, @@ -307,6 +308,10 @@ namespace Marco.Pms.Services.Helpers try { + if (tenantId == SuperTenantId) + { + return true; + } // Run both queries concurrently var totalSeatsTask = GetMaxSeatsAsync(tenantId); var totalSeatsTakenTask = GetActiveEmployeesCountAsync(tenantId); -- 2.43.0 From 935f5345b9b92378cadd04ddf12d56f639f102ee Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Sep 2025 16:38:24 +0530 Subject: [PATCH 61/63] Solved the rebase issues --- Marco.Pms.Services/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index c1de431..c769331 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -185,6 +185,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -- 2.43.0 From 01f214a60b4324ed881a5190030cd49dc6d9b216 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 10 Sep 2025 10:27:24 +0530 Subject: [PATCH 62/63] Added the TotalRecords parameter to get contact list API response --- Marco.Pms.Services/Service/DirectoryService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/DirectoryService.cs b/Marco.Pms.Services/Service/DirectoryService.cs index d522f66..9375cad 100644 --- a/Marco.Pms.Services/Service/DirectoryService.cs +++ b/Marco.Pms.Services/Service/DirectoryService.cs @@ -231,11 +231,14 @@ namespace Marco.Pms.Services.Service return contactVM; }).ToList(); + var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); + // Step 7: Construct and return the final response. var response = new { - TotalPages = (int)Math.Ceiling((double)totalCount / pageSize), + TotalPages = totalPages, CurrentPage = pageNumber, + TotalRecords = totalCount, PageSize = pageSize, Data = list }; -- 2.43.0 From f75c31b3ceecaf62d05cd4a074e9af78bee678fd Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 10 Sep 2025 11:52:13 +0530 Subject: [PATCH 63/63] Added the check for checking uniquness of document ID --- .../Controllers/DocumentController.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index fbb5f5d..ef73d3c 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -703,6 +703,13 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse($"{(entityType == EmployeeEntity ? "Employee" : "Project")} Not Found", "Entity not found in database", 404)); } + var isDocumentExist = await _context.DocumentAttachments.AnyAsync(da => da.DocumentId == model.DocumentId && da.TenantId == tenantId); + if (isDocumentExist) + { + _logger.LogWarning("{DocumentId} is already existed in database", model.DocumentId ?? string.Empty); + return StatusCode(409, ApiResponse.ErrorResponse("Document already existed", "Document already existed in database", 409)); + } + // Map DTO to DB entity var attachment = _mapper.Map(model); attachment.UploadedAt = DateTime.UtcNow; @@ -1031,6 +1038,13 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse($"{(entityType == EmployeeEntity ? "Employee" : "Project")} Not Found", "Entity not found in database", 404)); } + var isDocumentExist = await _context.DocumentAttachments.AnyAsync(da => da.Id != model.Id && da.DocumentId == model.DocumentId && da.TenantId == tenantId); + if (isDocumentExist) + { + _logger.LogWarning("{DocumentId} is already existed in database", model.DocumentId ?? string.Empty); + return StatusCode(409, ApiResponse.ErrorResponse("Document already existed", "Document already existed in database", 409)); + } + // Prepare for versioning var oldVersionMapping = await _context.AttachmentVersionMappings .FirstOrDefaultAsync(av => av.ChildAttachmentId == oldAttachment.Id && av.TenantId == tenantId); -- 2.43.0