From 3216318acb02fc31dd8c2e6c77c24cb1e1a6726a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 2 Jul 2025 15:07:08 +0530 Subject: [PATCH 001/125] Added Designation Parameter in Contacts and Implement in Related APIs --- ...on_Paraneter_In_Contacts_Table.Designer.cs | 3419 +++++++++++++++++ ...Designation_Paraneter_In_Contacts_Table.cs | 29 + .../ApplicationDbContextModelSnapshot.cs | 4 + Marco.Pms.Model/Directory/Contact.cs | 1 + .../Dtos/Directory/CreateContactDto.cs | 1 + .../Dtos/Directory/UpdateContactDto.cs | 1 + Marco.Pms.Model/Mapper/DirectoryMapper.cs | 4 + .../ViewModels/Directory/ContactProfileVM.cs | 1 + .../ViewModels/Directory/ContactVM.cs | 1 + .../Controllers/DirectoryController.cs | 75 +- Marco.Pms.Services/Helpers/DirectoryHelper.cs | 126 +- 11 files changed, 3571 insertions(+), 91 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.Designer.cs new file mode 100644 index 0000000..3cd5d28 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.Designer.cs @@ -0,0 +1,3419 @@ +// +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("20250702045931_Added_Designation_Paraneter_In_Contacts_Table")] + partial class Added_Designation_Paraneter_In_Contacts_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.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.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Documents"); + }); + + 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("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("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" + }); + }); + + 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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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.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("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("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" + }); + }); + + 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" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + 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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.cs b/Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.cs new file mode 100644 index 0000000..45231d4 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250702045931_Added_Designation_Paraneter_In_Contacts_Table.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_Designation_Paraneter_In_Contacts_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Designation", + table: "Contacts", + type: "longtext", + nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Designation", + table: "Contacts"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 26a3bdd..72ed45c 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -420,6 +420,10 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + b.Property("IsActive") .HasColumnType("tinyint(1)"); diff --git a/Marco.Pms.Model/Directory/Contact.cs b/Marco.Pms.Model/Directory/Contact.cs index fe82711..4cbcb37 100644 --- a/Marco.Pms.Model/Directory/Contact.cs +++ b/Marco.Pms.Model/Directory/Contact.cs @@ -12,6 +12,7 @@ namespace Marco.Pms.Model.Directory //public Guid? ProjectId { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public string Designation { get; set; } = string.Empty; public string Organization { get; set; } = string.Empty; public string? Address { get; set; } public bool IsActive { get; set; } = true; diff --git a/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs b/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs index 577f405..f581fe3 100644 --- a/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/CreateContactDto.cs @@ -9,6 +9,7 @@ public List? BucketIds { get; set; } public Guid? ContactCategoryId { get; set; } public string? Description { get; set; } + public string? Designation { get; set; } public string? Organization { get; set; } public string? Address { get; set; } public List? Tags { get; set; } diff --git a/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs b/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs index 16c8645..b4d18d8 100644 --- a/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs +++ b/Marco.Pms.Model/Dtos/Directory/UpdateContactDto.cs @@ -10,6 +10,7 @@ public List? BucketIds { get; set; } public Guid? ContactCategoryId { get; set; } public string? Description { get; set; } + public string? Designation { get; set; } public string? Organization { get; set; } public string? Address { get; set; } public List? Tags { get; set; } diff --git a/Marco.Pms.Model/Mapper/DirectoryMapper.cs b/Marco.Pms.Model/Mapper/DirectoryMapper.cs index b175cb7..c9965c8 100644 --- a/Marco.Pms.Model/Mapper/DirectoryMapper.cs +++ b/Marco.Pms.Model/Mapper/DirectoryMapper.cs @@ -16,6 +16,7 @@ namespace Marco.Pms.Model.Mapper Name = createContactDto.Name ?? string.Empty, ContactCategoryId = createContactDto.ContactCategoryId, Description = createContactDto.Description ?? string.Empty, + Designation = createContactDto.Designation ?? string.Empty, Organization = createContactDto?.Organization ?? string.Empty, Address = createContactDto != null ? createContactDto.Address : string.Empty, CreatedById = employeeId, @@ -34,6 +35,7 @@ namespace Marco.Pms.Model.Mapper CreatedAt = contact.CreatedAt, CreatedById = contact.CreatedById, Description = updateContactDto.Description ?? string.Empty, + Designation = updateContactDto.Designation ?? string.Empty, Organization = updateContactDto?.Organization ?? string.Empty, Address = updateContactDto != null ? updateContactDto.Address : string.Empty, TenantId = tenantId @@ -47,6 +49,7 @@ namespace Marco.Pms.Model.Mapper Name = contact.Name, ContactCategory = contact.ContactCategory != null ? contact.ContactCategory.ToContactCategoryVMFromContactCategoryMaster() : null, Description = contact.Description ?? string.Empty, + Designation = contact.Designation ?? string.Empty, Organization = contact.Organization ?? string.Empty, Address = contact.Address ?? string.Empty }; @@ -59,6 +62,7 @@ namespace Marco.Pms.Model.Mapper Name = contact.Name, ContactCategory = contact.ContactCategory != null ? contact.ContactCategory.ToContactCategoryVMFromContactCategoryMaster() : null, Description = contact.Description ?? string.Empty, + Designation = contact.Designation ?? string.Empty, Organization = contact.Organization ?? string.Empty, Address = contact.Address ?? string.Empty, CreatedAt = contact.CreatedAt, diff --git a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs index 9e8f4cb..de53d25 100644 --- a/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs +++ b/Marco.Pms.Model/ViewModels/Directory/ContactProfileVM.cs @@ -9,6 +9,7 @@ namespace Marco.Pms.Model.ViewModels.Directory public Guid Id { get; set; } public string? Name { get; set; } public string? Description { get; set; } + public string? Designation { get; set; } public string? Organization { get; set; } public string? Address { get; set; } public DateTime CreatedAt { get; set; } diff --git a/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs b/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs index d394f73..4b212ae 100644 --- a/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs +++ b/Marco.Pms.Model/ViewModels/Directory/ContactVM.cs @@ -12,6 +12,7 @@ namespace Marco.Pms.Model.ViewModels.Directory public ContactCategoryVM? ContactCategory { get; set; } public List? BucketIds { get; set; } public string? Description { get; set; } + public string? Designation { get; set; } public string? Organization { get; set; } public string? Address { get; set; } public List? Tags { get; set; } diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index 4a0e41e..65bb039 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -33,20 +33,7 @@ namespace Marco.Pms.Services.Controllers CategoryIds = categoryIds }; var response = await _directoryHelper.GetListOfContacts(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); } @@ -54,18 +41,7 @@ namespace Marco.Pms.Services.Controllers public async Task GetContactsListByBucketId(Guid bucketId) { var response = await _directoryHelper.GetContactsListByBucketId(bucketId); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 401) - { - return Unauthorized(response); - } - else - { - return BadRequest(response); - } + return StatusCode(response.StatusCode, response); } [HttpPost] @@ -81,61 +57,34 @@ namespace Marco.Pms.Services.Controllers 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); - } + return StatusCode(response.StatusCode, 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); - } + return StatusCode(response.StatusCode, response); } [HttpGet("profile/{id}")] public async Task GetContactProfile(Guid id) { var response = await _directoryHelper.GetContactProfile(id); - if (response.StatusCode == 200) - { - return Ok(response); - } - else if (response.StatusCode == 404) - { - return NotFound(response); - } - else - { - return BadRequest(response); - } + return StatusCode(response.StatusCode, response); } [HttpGet("organization")] public async Task GetOrganizationList() { var response = await _directoryHelper.GetOrganizationList(); - return Ok(response); + return StatusCode(response.StatusCode, response); + } + [HttpGet("designations")] + public async Task GetDesignationList() + { + var response = await _directoryHelper.GetDesignationList(); + return StatusCode(response.StatusCode, response); } [HttpDelete("{id}")] diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs index bafa36f..b5ccb5c 100644 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ b/Marco.Pms.Services/Helpers/DirectoryHelper.cs @@ -747,6 +747,7 @@ namespace Marco.Pms.Services.Helpers { Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var hasAdminPermission = await _permissionServices.HasPermission(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); @@ -806,11 +807,19 @@ namespace Marco.Pms.Services.Helpers } 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()) + if (contactBuckets.Any() && (employeeBuckets.Any() || hasAdminPermission)) { 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? 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) { @@ -860,40 +869,101 @@ namespace Marco.Pms.Services.Helpers } public async Task> GetOrganizationList() { + // Step 1: Retrieve tenant and employee context Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + 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); + _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(); - if (id != Guid.Empty) + 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) { - 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("Empty contact ID received from EmployeeId: {EmployeeId}", 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); + + // 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 -------------------------------- From b614ca93e6e588cf6be470bbfb0fd6abea023f42 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 18 Jul 2025 13:00:50 +0530 Subject: [PATCH 002/125] Created an Utility function store logs in mogoDB --- Marco.Pms.CacheHelper/UpdateLogHelper.cs | 91 +++++++++++++++++++ .../MongoDBModels/UpdateLogsObject.cs | 16 ++++ Marco.Pms.Services/Program.cs | 3 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Marco.Pms.CacheHelper/UpdateLogHelper.cs create mode 100644 Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs diff --git a/Marco.Pms.CacheHelper/UpdateLogHelper.cs b/Marco.Pms.CacheHelper/UpdateLogHelper.cs new file mode 100644 index 0000000..9bc520a --- /dev/null +++ b/Marco.Pms.CacheHelper/UpdateLogHelper.cs @@ -0,0 +1,91 @@ +using Marco.Pms.Model.MongoDBModels; +using Microsoft.Extensions.Configuration; +using MongoDB.Bson; +using MongoDB.Driver; +using System.Collections; + +namespace Marco.Pms.CacheHelper +{ + public class UpdateLogHelper + { + private readonly IMongoDatabase _mongoDatabase; + public UpdateLogHelper(IConfiguration configuration) + { + var connectionString = configuration["MongoDB:ConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + _mongoDatabase = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + } + public async Task PushToUpdateLogs(UpdateLogsObject oldObject, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + await collection.InsertOneAsync(oldObject); + } + + public async Task> GetFromUpdateLogsByEntityId(Guid entityId, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + var filter = Builders.Filter.Eq(p => p.EntityId, entityId.ToString()); + + List result = await collection + .Find(filter) + .ToListAsync(); + + return result; + } + + public async Task> GetFromUpdateLogsByUpdetedById(Guid updatedById, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + var filter = Builders.Filter.Eq(p => p.UpdatedById, updatedById.ToString()); + + List result = await collection + .Find(filter) + .ToListAsync(); + + return result; + } + + public BsonDocument NormalizeGuidsToStrings(object entity) + { + var bson = new BsonDocument(); + + var props = entity.GetType().GetProperties(); + foreach (var prop in props) + { + var value = prop.GetValue(entity); + if (value == null) + { + bson[prop.Name] = BsonNull.Value; + continue; + } + + if (value is Guid guidValue) + { + bson[prop.Name] = guidValue.ToString(); // store Guid as string + } + else if (value is string || value.GetType().IsPrimitive || value is DateTime) + { + bson[prop.Name] = BsonValue.Create(value); // simple types + } + else if (value is IEnumerable list && !(value is string)) + { + var array = new BsonArray(); + foreach (var item in list) + { + array.Add(NormalizeGuidsToStrings(item)); // recursive + } + bson[prop.Name] = array; + } + else + { + // nested object + continue; + } + } + + return bson; + } + + } +} diff --git a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs b/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs new file mode 100644 index 0000000..3153c78 --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.MongoDBModels +{ + public class UpdateLogsObject + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public string EntityId { get; set; } = string.Empty; + public BsonDocument? OldObject { get; set; } + public string UpdatedById { get; set; } = string.Empty; + public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; + } +} diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 30831c6..6d7c8ea 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,4 +1,3 @@ -using System.Text; using Marco.Pms.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; @@ -16,6 +15,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Serilog; +using System.Text; var builder = WebApplication.CreateBuilder(args); @@ -139,6 +139,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); From 1d5b0a9b062cee4219650192612221fdfde1a45a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 18 Jul 2025 13:00:50 +0530 Subject: [PATCH 003/125] Created an Utility function store logs in mogoDB --- Marco.Pms.CacheHelper/UpdateLogHelper.cs | 91 +++++++++++++++++++ .../MongoDBModels/UpdateLogsObject.cs | 16 ++++ Marco.Pms.Services/Program.cs | 1 + 3 files changed, 108 insertions(+) create mode 100644 Marco.Pms.CacheHelper/UpdateLogHelper.cs create mode 100644 Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs diff --git a/Marco.Pms.CacheHelper/UpdateLogHelper.cs b/Marco.Pms.CacheHelper/UpdateLogHelper.cs new file mode 100644 index 0000000..9bc520a --- /dev/null +++ b/Marco.Pms.CacheHelper/UpdateLogHelper.cs @@ -0,0 +1,91 @@ +using Marco.Pms.Model.MongoDBModels; +using Microsoft.Extensions.Configuration; +using MongoDB.Bson; +using MongoDB.Driver; +using System.Collections; + +namespace Marco.Pms.CacheHelper +{ + public class UpdateLogHelper + { + private readonly IMongoDatabase _mongoDatabase; + public UpdateLogHelper(IConfiguration configuration) + { + var connectionString = configuration["MongoDB:ConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + _mongoDatabase = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + } + public async Task PushToUpdateLogs(UpdateLogsObject oldObject, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + await collection.InsertOneAsync(oldObject); + } + + public async Task> GetFromUpdateLogsByEntityId(Guid entityId, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + var filter = Builders.Filter.Eq(p => p.EntityId, entityId.ToString()); + + List result = await collection + .Find(filter) + .ToListAsync(); + + return result; + } + + public async Task> GetFromUpdateLogsByUpdetedById(Guid updatedById, string collectionName) + { + var collection = _mongoDatabase.GetCollection(collectionName); + var filter = Builders.Filter.Eq(p => p.UpdatedById, updatedById.ToString()); + + List result = await collection + .Find(filter) + .ToListAsync(); + + return result; + } + + public BsonDocument NormalizeGuidsToStrings(object entity) + { + var bson = new BsonDocument(); + + var props = entity.GetType().GetProperties(); + foreach (var prop in props) + { + var value = prop.GetValue(entity); + if (value == null) + { + bson[prop.Name] = BsonNull.Value; + continue; + } + + if (value is Guid guidValue) + { + bson[prop.Name] = guidValue.ToString(); // store Guid as string + } + else if (value is string || value.GetType().IsPrimitive || value is DateTime) + { + bson[prop.Name] = BsonValue.Create(value); // simple types + } + else if (value is IEnumerable list && !(value is string)) + { + var array = new BsonArray(); + foreach (var item in list) + { + array.Add(NormalizeGuidsToStrings(item)); // recursive + } + bson[prop.Name] = array; + } + else + { + // nested object + continue; + } + } + + return bson; + } + + } +} diff --git a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs b/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs new file mode 100644 index 0000000..3153c78 --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.MongoDBModels +{ + public class UpdateLogsObject + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public string EntityId { get; set; } = string.Empty; + public BsonDocument? OldObject { get; set; } + public string UpdatedById { get; set; } = string.Empty; + public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; + } +} diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 5549702..e67ed7a 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -183,6 +183,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion #region Cache Services From 51b379916febb2ce83e35aedf2feced7fee13a37 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 18 Jul 2025 18:43:22 +0530 Subject: [PATCH 004/125] Solving the rebase errors --- run_sonar_scan.ps1 | 55 ---------------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 run_sonar_scan.ps1 diff --git a/run_sonar_scan.ps1 b/run_sonar_scan.ps1 deleted file mode 100644 index 7753442..0000000 --- a/run_sonar_scan.ps1 +++ /dev/null @@ -1,55 +0,0 @@ -# Filename: run_sonar_scan.ps1 -# -# Description: -# This script automates the SonarQube analysis for a .NET project. -# It performs three main steps: -# 1. Begins the SonarScanner analysis. -# 2. Builds the project (which allows the scanner to analyze the code). -# 3. Ends the analysis and pushes the results to the SonarQube server. -# -# Pre-requisites: -# - .NET SDK must be installed. -# - dotnet-sonarscanner tool must be installed globally. -# - The 'SONAR_TOKEN' environment variable must be set with your SonarQube token. -# -# Usage: -# 1. Open PowerShell. -# 2. Navigate to the root directory of your project. -# 3. Run the script: .\run_sonar_scan.ps1 -# - -# --- Configuration --- -$projectKey = "pms-dotnetcore" -$sonarHost = "https://sonar.marcoaiot.com" - -# --- Script Body --- -try { - # Check if the required environment variable is set - if ([string]::IsNullOrEmpty($env:SONAR_TOKEN)) { - throw "ERROR: The SONAR_TOKEN environment variable is not set. Please set it and restart your terminal." - } - - Write-Host "--- [Step 1/3] Starting SonarScanner analysis... ---" -ForegroundColor Green - dotnet sonarscanner begin /k:"$projectKey" /d:sonar.host.url="$sonarHost" /d:sonar.token="$($env:SONAR_TOKEN)" - - # Check the exit code of the last command. A non-zero code indicates an error. - if ($LASTEXITCODE -ne 0) { throw "SonarScanner 'begin' command failed with exit code $LASTEXITCODE." } - - Write-Host "`n--- [Step 2/3] Building the project... ---" -ForegroundColor Green - dotnet build - if ($LASTEXITCODE -ne 0) { throw "Dotnet 'build' command failed with exit code $LASTEXITCODE." } - - Write-Host "`n--- [Step 3/3] Ending SonarScanner analysis and uploading results... ---" -ForegroundColor Green - dotnet sonarscanner end /d:sonar.token="$($env:SONAR_TOKEN)" - if ($LASTEXITCODE -ne 0) { throw "SonarScanner 'end' command failed with exit code $LASTEXITCODE." } - - Write-Host "`n--- SonarQube analysis completed successfully! ---" -ForegroundColor Green -} -catch { - # This block runs if any of the 'throw' commands are triggered - Write-Host "`n$_" -ForegroundColor Red - Write-Host "Script aborted due to an error." -ForegroundColor Red - - # Exit with a non-zero status code to indicate failure, which is important for CI/CD pipelines - exit 1 -} \ No newline at end of file From cf01fd1138d924d7931da044e3eecafc461a23cb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 13:12:47 +0530 Subject: [PATCH 005/125] Added models for Expenses management models and migrations --- .../Data/ApplicationDbContext.cs | 410 +- ...19074035_Expenses_tables_Added.Designer.cs | 4180 +++++++++++++++++ .../20250719074035_Expenses_tables_Added.cs | 556 +++ .../ApplicationDbContextModelSnapshot.cs | 754 +++ .../Dtos/Expenses/CreateExpensesDto.cs | 22 + .../Dtos/Master/ExpensesTypeMasterDto.cs | 10 + .../Entitlements/PermissionsMaster.cs | 7 + Marco.Pms.Model/Expenses/BillAttachments.cs | 22 + Marco.Pms.Model/Expenses/Expenses.cs | 49 + Marco.Pms.Model/Expenses/ExpensesReimburse.cs | 20 + .../Expenses/ExpensesReimburseMapping.cs | 20 + Marco.Pms.Model/Expenses/StatusMapping.cs | 22 + .../Expenses/StatusPermissionMapping.cs | 22 + .../Master/ExpensesStatusMaster.cs | 13 + Marco.Pms.Model/Master/ExpensesTypeMaster.cs | 13 + Marco.Pms.Model/Master/PaymentModeMatser.cs | 12 + 16 files changed, 5990 insertions(+), 142 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs create mode 100644 Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs create mode 100644 Marco.Pms.Model/Dtos/Master/ExpensesTypeMasterDto.cs create mode 100644 Marco.Pms.Model/Expenses/BillAttachments.cs create mode 100644 Marco.Pms.Model/Expenses/Expenses.cs create mode 100644 Marco.Pms.Model/Expenses/ExpensesReimburse.cs create mode 100644 Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs create mode 100644 Marco.Pms.Model/Expenses/StatusMapping.cs create mode 100644 Marco.Pms.Model/Expenses/StatusPermissionMapping.cs create mode 100644 Marco.Pms.Model/Master/ExpensesStatusMaster.cs create mode 100644 Marco.Pms.Model/Master/ExpensesTypeMaster.cs create mode 100644 Marco.Pms.Model/Master/PaymentModeMatser.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 7601e60..781344e 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -1,11 +1,11 @@ -using System.Globalization; -using Marco.Pms.Model.Activities; +using Marco.Pms.Model.Activities; using Marco.Pms.Model.AttendanceModule; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Directory; using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Forum; using Marco.Pms.Model.Mail; using Marco.Pms.Model.Master; @@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; +using System.Globalization; namespace Marco.Pms.DataAccess.Data { @@ -89,6 +90,15 @@ namespace Marco.Pms.DataAccess.Data public DbSet OTPDetails { get; set; } public DbSet MPINDetails { get; set; } + public DbSet Expenses { get; set; } + public DbSet ExpensesTypeMaster { get; set; } + public DbSet PaymentModeMatser { get; set; } + public DbSet ExpensesStatusMaster { get; set; } + public DbSet BillAttachments { get; set; } + public DbSet ExpensesReimburse { get; set; } + public DbSet ExpensesReimburseMapping { get; set; } + public DbSet StatusPermissionMapping { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -97,49 +107,6 @@ namespace Marco.Pms.DataAccess.Data ManageApplicationStructure(modelBuilder); - //modelBuilder.Entity().HasData( - // new ApplicationRole - // { - // Id = new Guid("2c8d0808-c421-11ef-9b93-0242ac110002"), - // Role = "Super User", - // Description = "Super User", - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("62e0918d-c421-11ef-9b93-0242ac110002"), - // Role = "Welder", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("68823f1f-c421-11ef-9b93-0242ac110002"), - // Role = "Helper", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("6d3a7c72-c421-11ef-9b93-0242ac110002"), - // Role = "Site Engineer", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // , - // new ApplicationRole - // { - // Id = new Guid("6d3aad72-c421-11ef-9b93-0242ac110002"), - // Role = "Project Manager", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // ); - modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); @@ -196,79 +163,11 @@ namespace Marco.Pms.DataAccess.Data ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") } - //, new Project - //{ - // Id = new Guid("3ef56a12-f5e5-4193-87d6-9e110ed10b86"), - // Name = "Project 2", - // ProjectAddress = "Project 2 Address", - // ContactPerson = "Project 2 Contact Person", - // StartDate = DateTime.ParseExact("2025-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // EndDate = DateTime.ParseExact("2026-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // ProjectStatusId = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - //}, new Project - //{ - // Id = new Guid("54d013e3-0a2b-48be-85c7-5ef03492a18c"), - // Name = "Project 3", - // ProjectAddress = "Project 3 Address", - // ContactPerson = "Project 3 Contact Person", - // StartDate = DateTime.ParseExact("2025-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // EndDate = DateTime.ParseExact("2026-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // ProjectStatusId = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - //} ); var tenantId = _httpContextAccessor.HttpContext?.Items["TenantId"]?.ToString(); - //modelBuilder.Entity() - // .HasData( - // new ActivityMaster - // { - // Id = new Guid("4117b7de-ef6c-461f-a2c2-64eaac5f9a11"), - // ActivityName = "Core Cutting", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("1714f64d-7591-4419-bee5-118d21bb2855"), - // ActivityName = "Fabrication", - // UnitOfMeasurement = UnitOfMeasurement.Meter.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("b3f51a93-dde6-45f9-8b22-f1bf017a640b"), - // ActivityName = "Welding", - // UnitOfMeasurement = UnitOfMeasurement.Meter.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("53eedf44-4076-445f-be93-fedef17117e7"), - // ActivityName = "MS Support Fabrication", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("715b9ddb-d9e2-4afa-8987-d9918905cea4"), - // ActivityName = "MS Support Hanging", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("a3d191a7-a5aa-4dd8-a525-12c99263bbd6"), - // ActivityName = "Hydrant Volve", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("c138a7de-713a-4bd4-8292-b0b265be77a3"), - // ActivityName = "Sprinkler Installation", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // ); - modelBuilder.Entity().HasData( new Industry { Id = Guid.Parse("15436ee3-a650-469e-bfc2-59993f7514bb"), Name = "Information Technology (IT) Services" }, new Industry { Id = Guid.Parse("0a63e657-2c5f-49b5-854b-42c978293154"), Name = "Manufacturing & Production" }, @@ -487,6 +386,223 @@ namespace Marco.Pms.DataAccess.Data + modelBuilder.Entity().HasData( + new ExpensesStatusMaster + { + Id = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Name = "Draft", + Description = "Expense has been created but not yet submitted.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Name = "Review Pending", + Description = "Reviewer is currently reviewing the expense.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Name = "Approval Pending", + Description = "Review is completed, waiting for action of approver.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Name = "Rejected", + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Name = "Process Pending", + Description = "Approved expense is awaiting final payment.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), + Name = "Processed", + Description = "Expense has been settled.", + IsSystem = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); + + modelBuilder.Entity().HasData( + // Process to processed + new StatusMapping + { + Id = Guid.Parse("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Approve to Rejected + new StatusMapping + { + Id = Guid.Parse("36c00548-241c-43ec-bc95-cacebedb925c"), + StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Approve to Process + new StatusMapping + { + Id = Guid.Parse("1fca1700-1266-477d-bba4-9ac3753aa33c"), + StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Review to Rejected + new StatusMapping + { + Id = Guid.Parse("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Review to Aprrove + new StatusMapping + { + Id = Guid.Parse("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + NextStatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Draft to Review + new StatusMapping + { + Id = Guid.Parse("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"), + NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); + + modelBuilder.Entity().HasData( + new ExpensesTypeMaster + { + Id = Guid.Parse("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Name = "Procurement", + Description = "Materials, equipment and supplies purchased for site operations.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("2de53163-0dbd-404b-8e60-1b02e6b4886a"), + Name = "Transport", + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), + Name = "Travelling", + Description = "Delivery of personnel.", + NoOfPersonsRequired = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("52484820-1b54-4865-8f0f-baa2b1d339b9"), + Name = "Mobilization", + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), + Name = "Employee Welfare", + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + NoOfPersonsRequired = true, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("77013784-9324-4d8b-bd36-d6f928e68942"), + Name = "Maintenance & Utilities", + Description = "Machinery servicing, electricity, water, and temporary office needs.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("1e2d697a-76b4-4be8-bc66-87144561a1a0"), + Name = "Vendor/Supplier Payments", + Description = "Scheduled payments for external services or goods.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new ExpensesTypeMaster + { + Id = Guid.Parse("4842fa61-64eb-4241-aebd-8282065af9f9"), + Name = "Compliance & Safety", + Description = "Government fees, insurance, inspections and safety-related expenditures.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); + + modelBuilder.Entity().HasData( + new PaymentModeMatser + { + Id = Guid.Parse("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), + Name = "Cash", + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new PaymentModeMatser + { + Id = Guid.Parse("48d9b462-5d87-4dec-8dec-2bc943943172"), + Name = "Cheque", + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new PaymentModeMatser + { + Id = Guid.Parse("ed667353-8eea-4fd1-8750-719405932480"), + Name = "NetBanking", + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new PaymentModeMatser + { + Id = Guid.Parse("2e919e94-694c-41d9-9489-0a2b4208a027"), + Name = "UPI", + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + } + ); modelBuilder.Entity().HasData(new Module { @@ -508,53 +624,63 @@ namespace Marco.Pms.DataAccess.Data Key = "504ec132-e6a9-422f-8f85-050602cfce05" }); - - modelBuilder.Entity().HasData( + // Project Module new Feature { Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), Description = "Manage Project", Name = "Project Management", ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), IsActive = true }, - //new Feature { Id = new Guid("9666de86-d7c7-4d3d-acaa-fcd6d6b81f3c"), Description = "Manage Infra", Name = "Manage Infra", ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), IsActive = true }, + new Feature { Id = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), Description = "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", Name = "Expense Management", ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), IsActive = true }, new Feature { Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), Description = "Manage Tasks", Name = "Task Management", ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), IsActive = true }, + // 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("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), Description = "Global Masters", Name = "Masters", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true }, + // Master Module + 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 } - - //new Feature { Id = new Guid("660131a4-788c-4739-a082-cbbf7879cbf2"), Description = "Tenant Masters", Name = "Tenant Masters", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true } ); modelBuilder.Entity().HasData( + // Project Management Feature new FeaturePermission { Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "View Project", Description = "Access all information related to the project." }, - new FeaturePermission { Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Project", Description = "Potentially edit the project name, description, start/end dates, or status." }, - new FeaturePermission { Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Team", Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects." }, - new FeaturePermission { Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "View Project Infra", Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations" }, - new FeaturePermission { Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Project Infra", Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure." }, + new FeaturePermission { Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Project", Description = "Potentially edit the project name, description, start/end dates, or status." }, + new FeaturePermission { Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Team", Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects." }, + new FeaturePermission { Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "View Project Infra", Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations" }, + new FeaturePermission { Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Project Infra", Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure." }, + // Task Management Feature + new FeaturePermission { Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "View Task", 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." }, + new FeaturePermission { Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Add/Edit Task", Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.)," }, + new FeaturePermission { Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Assign/Report Progress", 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" }, + new FeaturePermission { Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Approve Task", 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" }, - new FeaturePermission { Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "View Task", 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." }, - new FeaturePermission { Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Add/Edit Task", Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.)," }, - new FeaturePermission { Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Assign/Report Progress", 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" }, - new FeaturePermission { Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), IsEnabled = true, Name = "Approve Task", 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" }, + // Employee Management Feature + new FeaturePermission { Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "View All Employees", 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" }, + new FeaturePermission { Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "View Team Members", 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" }, + new FeaturePermission { Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "Add/Edit Employee", 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" }, + new FeaturePermission { Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "Assign Roles", Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system." }, + // Attendance Management Feature + new FeaturePermission { Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Team Attendance ", Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager." }, + new FeaturePermission { Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Regularize Attendance", 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" }, + new FeaturePermission { Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Self Attendance", Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager." }, - new FeaturePermission { Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "View All Employees", 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" }, - new FeaturePermission { Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "View Team Members", 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" }, - new FeaturePermission { Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "Add/Edit Employee", 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" }, - new FeaturePermission { Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), IsEnabled = true, Name = "Assign Roles", Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system." }, + // Masters Feature + 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" }, + // 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." }, + new FeaturePermission { Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), IsEnabled = true, Name = "Directory User", 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." }, - new FeaturePermission { Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Team Attendance ", Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager." }, - new FeaturePermission { Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Regularize Attendance", 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" }, - new FeaturePermission { Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), IsEnabled = true, Name = "Self Attendance", Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager." }, - - 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" }, - - 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." }, - new FeaturePermission { Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), IsEnabled = true, Name = "Directory User", 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." } - //new FeaturePermission { Id = new Guid("6b1a6d97-a951-4de5-9b19-709bac7c4f18"), FeatureId = new Guid("660131a4-788c-4739-a082-cbbf7879cbf2"), IsEnabled = true, Name = "Manage Masters", Description = "" } + // Expense Management Feature + new FeaturePermission { Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "View Self", Description = "Allows a user to view only the expense records that they have personally submitted" }, + new FeaturePermission { Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "View All", Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them" }, + new FeaturePermission { Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Upload", Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices." }, + new FeaturePermission { Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Review", Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected." }, + new FeaturePermission { Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Approve", Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system." }, + new FeaturePermission { Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Process", Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled." }, + new FeaturePermission { Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Manage", Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules." } ); } diff --git a/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs new file mode 100644 index 0000000..a126fc0 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs @@ -0,0 +1,4180 @@ +// +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("20250719074035_Expenses_tables_Added")] + partial class Expenses_tables_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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + 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("ProjectId") + .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("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProjectId"); + + 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.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpeStatusIdnsesId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpeStatusIdnsesId"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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"); + }); + + 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.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + 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("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Description = "Expense has been created but not yet submitted.", + IsActive = true, + IsSystem = true, + Name = "Draft", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Description = "Reviewer is currently reviewing the expense.", + IsActive = true, + IsSystem = true, + Name = "Review Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Description = "Review is completed, waiting for action of approver.", + IsActive = true, + IsSystem = true, + Name = "Approval Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsActive = true, + IsSystem = true, + Name = "Rejected", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Description = "Approved expense is awaiting final payment.", + IsActive = true, + IsSystem = true, + Name = "Process Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Description = "Expense has been settled.", + IsActive = true, + IsSystem = true, + Name = "Processed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + 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.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("Project"); + + 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.Entitlements.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.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("ExpeStatusIdnsesId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250719074035_Expenses_tables_Added.cs b/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs new file mode 100644 index 0000000..d53b349 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs @@ -0,0 +1,556 @@ +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 Expenses_tables_Added : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ExpensesReimburse", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ReimburseTransactionId = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ReimburseDate = table.Column(type: "datetime(6)", nullable: false), + ReimburseById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ReimburseNote = 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_ExpensesReimburse", x => x.Id); + table.ForeignKey( + name: "FK_ExpensesReimburse_Employees_ReimburseById", + column: x => x.ReimburseById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpensesReimburse_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "ExpensesStatusMaster", + 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"), + IsSystem = table.Column(type: "tinyint(1)", nullable: false), + 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_ExpensesStatusMaster", x => x.Id); + table.ForeignKey( + name: "FK_ExpensesStatusMaster_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "ExpensesTypeMaster", + 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"), + NoOfPersonsRequired = table.Column(type: "tinyint(1)", nullable: false), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + 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_ExpensesTypeMaster", x => x.Id); + table.ForeignKey( + name: "FK_ExpensesTypeMaster_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "PaymentModeMatser", + 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"), + 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_PaymentModeMatser", x => x.Id); + table.ForeignKey( + name: "FK_PaymentModeMatser_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "StatusMapping", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + NextStatusId = 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_StatusMapping", x => x.Id); + table.ForeignKey( + name: "FK_StatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", + column: x => x.ExpeStatusIdnsesId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_StatusMapping_ExpensesStatusMaster_NextStatusId", + column: x => x.NextStatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StatusMapping_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "StatusPermissionMapping", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PermissionId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_StatusPermissionMapping", x => x.Id); + table.ForeignKey( + name: "FK_StatusPermissionMapping_ExpensesStatusMaster_StatusId", + column: x => x.StatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StatusPermissionMapping_FeaturePermissions_PermissionId", + column: x => x.PermissionId, + principalTable: "FeaturePermissions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Expenses", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ProjectId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpensesTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PaymentModeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PaidById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TransactionDate = table.Column(type: "datetime(6)", nullable: false), + TransactionId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Location = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + GSTNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + SupplerName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Amount = table.Column(type: "double", nullable: false), + NoOfPersons = table.Column(type: "int", nullable: true), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PreApproved = table.Column(type: "tinyint(1)", nullable: false), + 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_Expenses", x => x.Id); + table.ForeignKey( + name: "FK_Expenses_Employees_PaidById", + column: x => x.PaidById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Expenses_ExpensesStatusMaster_StatusId", + column: x => x.StatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Expenses_ExpensesTypeMaster_ExpensesTypeId", + column: x => x.ExpensesTypeId, + principalTable: "ExpensesTypeMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Expenses_PaymentModeMatser_PaymentModeId", + column: x => x.PaymentModeId, + principalTable: "PaymentModeMatser", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Expenses_Projects_ProjectId", + column: x => x.ProjectId, + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Expenses_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "BillAttachments", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpensesId = 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_BillAttachments", x => x.Id); + table.ForeignKey( + name: "FK_BillAttachments_Documents_DocumentId", + column: x => x.DocumentId, + principalTable: "Documents", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_BillAttachments_Expenses_ExpensesId", + column: x => x.ExpensesId, + principalTable: "Expenses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_BillAttachments_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "ExpensesReimburseMapping", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpensesId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpensesReimburseId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_ExpensesReimburseMapping", x => x.Id); + table.ForeignKey( + name: "FK_ExpensesReimburseMapping_ExpensesReimburse_ExpensesReimburse~", + column: x => x.ExpensesReimburseId, + principalTable: "ExpensesReimburse", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpensesReimburseMapping_Expenses_ExpensesId", + column: x => x.ExpensesId, + principalTable: "Expenses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "ExpensesStatusMaster", + columns: new[] { "Id", "Description", "IsActive", "IsSystem", "Name", "TenantId" }, + values: new object[,] + { + { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "Expense has been created but not yet submitted.", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "Review is completed, waiting for action of approver.", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "Expense has been settled.", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "Reviewer is currently reviewing the expense.", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "Expense was declined, often with a reason(either review rejected or approval rejected.", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "Approved expense is awaiting final payment.", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.InsertData( + table: "ExpensesTypeMaster", + columns: new[] { "Id", "Description", "IsActive", "Name", "NoOfPersonsRequired", "TenantId" }, + values: new object[,] + { + { new Guid("1e2d697a-76b4-4be8-bc66-87144561a1a0"), "Scheduled payments for external services or goods.", true, "Vendor/Supplier Payments", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("2de53163-0dbd-404b-8e60-1b02e6b4886a"), "Vehicle fuel, logistics services and delivery of goods or personnel.", true, "Transport", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4842fa61-64eb-4241-aebd-8282065af9f9"), "Government fees, insurance, inspections and safety-related expenditures.", true, "Compliance & Safety", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("52484820-1b54-4865-8f0f-baa2b1d339b9"), "Site setup costs including equipment deployment and temporary infrastructure.", true, "Mobilization", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), "Materials, equipment and supplies purchased for site operations.", true, "Procurement", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("77013784-9324-4d8b-bd36-d6f928e68942"), "Machinery servicing, electricity, water, and temporary office needs.", true, "Maintenance & Utilities", false, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("dd120bc4-ab0a-45ba-8450-5cd45ff221ca"), "Delivery of personnel.", true, "Travelling", true, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fc59eb90-98ea-481c-b421-54bfa9e42d8f"), " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", true, "Employee Welfare", true, new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.InsertData( + table: "Features", + columns: new[] { "Id", "Description", "IsActive", "ModuleId", "Name" }, + values: new object[] { new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), "Expense Management is the systematic process of tracking, controlling, and reporting business-related expenditures.", true, new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), "Expense Management" }); + + migrationBuilder.InsertData( + table: "PaymentModeMatser", + columns: new[] { "Id", "Description", "IsActive", "Name", "TenantId" }, + values: new object[,] + { + { new Guid("24e6b0df-7929-47d2-88a3-4cf14c1f28f9"), "Physical currency; still used for small or informal transactions.", true, "Cash", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("2e919e94-694c-41d9-9489-0a2b4208a027"), "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", true, "UPI", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("48d9b462-5d87-4dec-8dec-2bc943943172"), "Paper-based payment order; less common now due to processing delays and fraud risks.", true, "Cheque", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ed667353-8eea-4fd1-8750-719405932480"), "Online banking portals used to transfer funds directly between accounts", true, "NetBanking", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.InsertData( + table: "FeaturePermissions", + columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, + values: new object[,] + { + { new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "View All" }, + { new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "Upload" }, + { new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "Review" }, + { new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), "Allows a user to view only the expense records that they have personally submitted", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "View Self" }, + { new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "Manage" }, + { new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "Process" }, + { new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), true, "Approve" } + }); + + migrationBuilder.InsertData( + table: "StatusMapping", + columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.CreateIndex( + name: "IX_BillAttachments_DocumentId", + table: "BillAttachments", + column: "DocumentId"); + + migrationBuilder.CreateIndex( + name: "IX_BillAttachments_ExpensesId", + table: "BillAttachments", + column: "ExpensesId"); + + migrationBuilder.CreateIndex( + name: "IX_BillAttachments_TenantId", + table: "BillAttachments", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_ExpensesTypeId", + table: "Expenses", + column: "ExpensesTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_PaidById", + table: "Expenses", + column: "PaidById"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_PaymentModeId", + table: "Expenses", + column: "PaymentModeId"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_ProjectId", + table: "Expenses", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_StatusId", + table: "Expenses", + column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_TenantId", + table: "Expenses", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesReimburse_ReimburseById", + table: "ExpensesReimburse", + column: "ReimburseById"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesReimburse_TenantId", + table: "ExpensesReimburse", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesReimburseMapping_ExpensesId", + table: "ExpensesReimburseMapping", + column: "ExpensesId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesReimburseMapping_ExpensesReimburseId", + table: "ExpensesReimburseMapping", + column: "ExpensesReimburseId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMaster_TenantId", + table: "ExpensesStatusMaster", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesTypeMaster_TenantId", + table: "ExpensesTypeMaster", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_PaymentModeMatser_TenantId", + table: "PaymentModeMatser", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_ExpeStatusIdnsesId", + table: "StatusMapping", + column: "ExpeStatusIdnsesId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_NextStatusId", + table: "StatusMapping", + column: "NextStatusId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_TenantId", + table: "StatusMapping", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusPermissionMapping_PermissionId", + table: "StatusPermissionMapping", + column: "PermissionId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusPermissionMapping_StatusId", + table: "StatusPermissionMapping", + column: "StatusId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "BillAttachments"); + + migrationBuilder.DropTable( + name: "ExpensesReimburseMapping"); + + migrationBuilder.DropTable( + name: "StatusMapping"); + + migrationBuilder.DropTable( + name: "StatusPermissionMapping"); + + migrationBuilder.DropTable( + name: "ExpensesReimburse"); + + migrationBuilder.DropTable( + name: "Expenses"); + + migrationBuilder.DropTable( + name: "ExpensesStatusMaster"); + + migrationBuilder.DropTable( + name: "ExpensesTypeMaster"); + + migrationBuilder.DropTable( + name: "PaymentModeMatser"); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("eaafdd76-8aac-45f9-a530-315589c6deca")); + + migrationBuilder.DeleteData( + table: "Features", + keyColumn: "Id", + keyValue: new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7")); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 258f8bd..766e2dd 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1133,6 +1133,62 @@ namespace Marco.Pms.DataAccess.Migrations 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" }); }); @@ -1206,6 +1262,252 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + 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.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + 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("ProjectId") + .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("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProjectId"); + + 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.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpeStatusIdnsesId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpeStatusIdnsesId"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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"); + }); + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => { b.Property("Id") @@ -1496,6 +1798,196 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("ActivityMasters"); }); + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + 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("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Description = "Expense has been created but not yet submitted.", + IsActive = true, + IsSystem = true, + Name = "Draft", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Description = "Reviewer is currently reviewing the expense.", + IsActive = true, + IsSystem = true, + Name = "Review Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Description = "Review is completed, waiting for action of approver.", + IsActive = true, + IsSystem = true, + Name = "Approval Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsActive = true, + IsSystem = true, + Name = "Rejected", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Description = "Approved expense is awaiting final payment.", + IsActive = true, + IsSystem = true, + Name = "Process Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Description = "Expense has been settled.", + IsActive = true, + IsSystem = true, + Name = "Processed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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") @@ -1530,6 +2022,14 @@ namespace Marco.Pms.DataAccess.Migrations 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", @@ -1677,6 +2177,67 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + 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") @@ -3061,6 +3622,166 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Industry"); }); + 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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + 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.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("Project"); + + 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.Entitlements.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.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("ExpeStatusIdnsesId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + 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") @@ -3165,6 +3886,28 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Tenant"); }); + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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") @@ -3176,6 +3919,17 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Module"); }); + modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => { b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") diff --git a/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs new file mode 100644 index 0000000..d1d8ec4 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs @@ -0,0 +1,22 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Dtos.Expenses +{ + public class CreateExpensesDto + { + public required Guid ProjectId { get; set; } + public Guid ExpensesTypeId { get; set; } + public Guid PaymentModeId { get; set; } + public DateTime TransactionDate { get; set; } = DateTime.Now; + public string? TransactionId { get; set; } + public required string Description { get; set; } + public string? Location { get; set; } + public string? GSTNumber { get; set; } + public required string SupplerName { get; set; } + public required double Amount { get; set; } + public int? NoOfPersons { get; set; } = 0; + public required Guid StatusId { get; set; } + public bool PreApproved { get; set; } = false; + public required List BillAttachments { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/Master/ExpensesTypeMasterDto.cs b/Marco.Pms.Model/Dtos/Master/ExpensesTypeMasterDto.cs new file mode 100644 index 0000000..d8f204a --- /dev/null +++ b/Marco.Pms.Model/Dtos/Master/ExpensesTypeMasterDto.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.Dtos.Master +{ + public class ExpensesTypeMasterDto + { + public Guid? Id { get; set; } + public required string Name { get; set; } + public required bool NoOfPersonsRequired { get; set; } + public string? Description { get; set; } + } +} diff --git a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs index d0bef58..07ac1b5 100644 --- a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs +++ b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs @@ -23,6 +23,13 @@ public static readonly Guid SelfAttendance = Guid.Parse("ccb0589f-712b-43de-92ed-5b6088e7dc4e"); public static readonly Guid ViewMasters = Guid.Parse("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"); public static readonly Guid ManageMasters = Guid.Parse("588a8824-f924-4955-82d8-fc51956cf323"); + public static readonly Guid ExpenseViewSelf = Guid.Parse("385be49f-8fde-440e-bdbc-3dffeb8dd116"); + public static readonly Guid ExpenseViewAll = Guid.Parse("01e06444-9ca7-4df4-b900-8c3fa051b92f"); + public static readonly Guid ExpenseUpload = Guid.Parse("0f57885d-bcb2-4711-ac95-d841ace6d5a7"); + public static readonly Guid ExpenseReview = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"); + 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"); } } diff --git a/Marco.Pms.Model/Expenses/BillAttachments.cs b/Marco.Pms.Model/Expenses/BillAttachments.cs new file mode 100644 index 0000000..5d62b09 --- /dev/null +++ b/Marco.Pms.Model/Expenses/BillAttachments.cs @@ -0,0 +1,22 @@ +using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Expenses +{ + public class BillAttachments : TenantRelation + { + public Guid Id { get; set; } + public Guid ExpensesId { get; set; } + + [ValidateNever] + [ForeignKey("ExpensesId")] + public Expenses? Expenses { get; set; } + public Guid DocumentId { get; set; } + + [ValidateNever] + [ForeignKey("DocumentId")] + public Document? Document { get; set; } + } +} diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs new file mode 100644 index 0000000..19e8333 --- /dev/null +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -0,0 +1,49 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Master; +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.Expenses +{ + public class Expenses : TenantRelation + { + public Guid Id { get; set; } + public Guid ProjectId { get; set; } + + [ValidateNever] + [ForeignKey("ProjectId")] + public Project? Project { get; set; } + public Guid ExpensesTypeId { get; set; } + + [ValidateNever] + [ForeignKey("ExpensesTypeId")] + public ExpensesTypeMaster? ExpensesType { get; set; } + public Guid PaymentModeId { get; set; } + + [ValidateNever] + [ForeignKey("PaymentModeId")] + public PaymentModeMatser? PaymentMode { get; set; } + public Guid PaidById { get; set; } + + [ValidateNever] + [ForeignKey("PaidById")] + public Employee? PaidBy { get; set; } + public DateTime TransactionDate { get; set; } + public string? TransactionId { get; set; } + public string Description { get; set; } = string.Empty; + public string? Location { get; set; } + public string? GSTNumber { get; set; } + public string SupplerName { get; set; } = string.Empty; + public double Amount { get; set; } + public int? NoOfPersons { get; set; } + public Guid StatusId { get; set; } + + [ValidateNever] + [ForeignKey("StatusId")] + public ExpensesStatusMaster? Status { get; set; } + public bool PreApproved { get; set; } = false; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Expenses/ExpensesReimburse.cs b/Marco.Pms.Model/Expenses/ExpensesReimburse.cs new file mode 100644 index 0000000..401ecda --- /dev/null +++ b/Marco.Pms.Model/Expenses/ExpensesReimburse.cs @@ -0,0 +1,20 @@ +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.Expenses +{ + public class ExpensesReimburse : TenantRelation + { + public Guid Id { get; set; } + public string ReimburseTransactionId { get; set; } = string.Empty; + public DateTime ReimburseDate { get; set; } + public Guid ReimburseById { get; set; } + + [ValidateNever] + [ForeignKey("ReimburseById")] + public Employee? ReimburseBy { get; set; } + public string ReimburseNote { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs b/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs new file mode 100644 index 0000000..c1c2be6 --- /dev/null +++ b/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Expenses +{ + public class ExpensesReimburseMapping + { + public Guid Id { get; set; } + public Guid ExpensesId { get; set; } + + [ValidateNever] + [ForeignKey("ExpensesId")] + public Expenses? Expenses { get; set; } + public Guid ExpensesReimburseId { get; set; } + + [ValidateNever] + [ForeignKey("ExpensesReimburseId")] + public ExpensesReimburse? ExpensesReimburse { get; set; } + } +} diff --git a/Marco.Pms.Model/Expenses/StatusMapping.cs b/Marco.Pms.Model/Expenses/StatusMapping.cs new file mode 100644 index 0000000..cc683a4 --- /dev/null +++ b/Marco.Pms.Model/Expenses/StatusMapping.cs @@ -0,0 +1,22 @@ +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.Expenses +{ + public class StatusMapping : TenantRelation + { + public Guid Id { get; set; } + public Guid StatusId { get; set; } + + [ValidateNever] + [ForeignKey("ExpeStatusIdnsesId")] + public ExpensesStatusMaster? Status { get; set; } + public Guid NextStatusId { get; set; } + + [ValidateNever] + [ForeignKey("NextStatusId")] + public ExpensesStatusMaster? NextStatus { get; set; } + } +} diff --git a/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs new file mode 100644 index 0000000..2fe9334 --- /dev/null +++ b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs @@ -0,0 +1,22 @@ +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Master; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Expenses +{ + public class StatusPermissionMapping + { + public Guid Id { get; set; } + public Guid StatusId { get; set; } + + [ValidateNever] + [ForeignKey("StatusId")] + public ExpensesStatusMaster? Status { get; set; } + public Guid PermissionId { get; set; } + + [ValidateNever] + [ForeignKey("PermissionId")] + public FeaturePermission? Permission { get; set; } + } +} diff --git a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs new file mode 100644 index 0000000..dc2556a --- /dev/null +++ b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs @@ -0,0 +1,13 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Master +{ + public class ExpensesStatusMaster : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public bool IsSystem { get; set; } = false; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Master/ExpensesTypeMaster.cs b/Marco.Pms.Model/Master/ExpensesTypeMaster.cs new file mode 100644 index 0000000..7e7d682 --- /dev/null +++ b/Marco.Pms.Model/Master/ExpensesTypeMaster.cs @@ -0,0 +1,13 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Master +{ + public class ExpensesTypeMaster : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public bool NoOfPersonsRequired { get; set; } + public string Description { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Master/PaymentModeMatser.cs b/Marco.Pms.Model/Master/PaymentModeMatser.cs new file mode 100644 index 0000000..e947c55 --- /dev/null +++ b/Marco.Pms.Model/Master/PaymentModeMatser.cs @@ -0,0 +1,12 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Master +{ + public class PaymentModeMatser : TenantRelation + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} From 0b1d2669ca29b42ad6d5a4ec9101bf8ac72731eb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 14:58:47 +0530 Subject: [PATCH 006/125] Improved the data seeder function --- .../Controllers/TaskController.cs | 6 +- .../Service/StartupDataSeeder.cs | 285 +++++++++++------- 2 files changed, 184 insertions(+), 107 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TaskController.cs b/Marco.Pms.Services/Controllers/TaskController.cs index b764f00..6a1921b 100644 --- a/Marco.Pms.Services/Controllers/TaskController.cs +++ b/Marco.Pms.Services/Controllers/TaskController.cs @@ -230,8 +230,8 @@ namespace MarcoBMS.Services.Controllers : image.Base64Data; var fileType = _s3Service.GetContentTypeFromBase64(base64); - var fileName = _s3Service.GenerateFileName(fileType, tenantId, "task_report"); - var objectKey = $"tenant-{tenantId}/project-{projectId}/Actitvity/{fileName}"; + var fileName = _s3Service.GenerateFileName(fileType, taskAllocation.Id, "task_report"); + var objectKey = $"tenant-{tenantId}/project-{projectId}/Activity/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); @@ -336,7 +336,7 @@ namespace MarcoBMS.Services.Controllers : image.Base64Data; var fileType = _s3Service.GetContentTypeFromBase64(base64); - var fileName = _s3Service.GenerateFileName(fileType, tenantId, "task_comment"); + var fileName = _s3Service.GenerateFileName(fileType, comment.Id, "task_comment"); var objectKey = $"tenant-{tenantId}/project-{projectId}/Activity/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); diff --git a/Marco.Pms.Services/Service/StartupDataSeeder.cs b/Marco.Pms.Services/Service/StartupDataSeeder.cs index 10d6f71..d2496fc 100644 --- a/Marco.Pms.Services/Service/StartupDataSeeder.cs +++ b/Marco.Pms.Services/Service/StartupDataSeeder.cs @@ -4,134 +4,211 @@ using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Roles; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; // For configuration +using System.Linq.Expressions; namespace Marco.Pms.Services.Service { + // A configuration class to hold settings from appsettings.json + // This avoids hardcoding sensitive information. + public class SuperAdminSettings + { + public const string CONFIG_SECTION_NAME = "SuperAdminAccount"; + public string Email { get; set; } = "admin@marcoaiot.com"; + public string Password { get; set; } = "User@123"; + public string TenantId { get; set; } = "b3466e83-7e11-464c-b93a-daf047838b26"; + } + public class StartupUserSeeder : IHostedService { private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; - public StartupUserSeeder(IServiceProvider serviceProvider) + // Constants to avoid "magic strings" + private const string AdminJobRoleName = "Admin"; + private const string SuperUserRoleName = "Super User"; + + public StartupUserSeeder(IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; + _logger = logger; } public async Task StartAsync(CancellationToken cancellationToken) { + _logger.LogInformation("Starting database seeding process..."); + using var scope = _serviceProvider.CreateScope(); - var userManager = scope.ServiceProvider.GetRequiredService>(); - var dbContext = scope.ServiceProvider.GetRequiredService(); + var serviceProvider = scope.ServiceProvider; - var userEmail = "admin@marcoaiot.com"; + // Get services from the scoped provider + var userManager = serviceProvider.GetRequiredService>(); + var dbContext = serviceProvider.GetRequiredService(); + var adminSettings = serviceProvider.GetRequiredService>().Value; + var tenantId = Guid.Parse(adminSettings.TenantId); - var user = await userManager.FindByEmailAsync(userEmail); - var newUser = new ApplicationUser + // Use a database transaction to ensure all operations succeed or none do. + await using var transaction = await dbContext.Database.BeginTransactionAsync(cancellationToken); + + try { - UserName = userEmail, - Email = userEmail, - EmailConfirmed = true, - IsRootUser = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }; - var result = new IdentityResult(); + // 1. Seed the Application User (Super Admin) + var user = await SeedSuperAdminUserAsync(userManager, adminSettings, tenantId); + // 2. Seed the Job Role + var jobRole = await GetOrCreateAsync( + dbContext.JobRoles, + j => j.Name == AdminJobRoleName && j.TenantId == tenantId, + () => new JobRole + { + Name = AdminJobRoleName, + Description = "Administrator with full system access.", + TenantId = tenantId + }); + + // 3. Seed the Application Role + var appRole = await GetOrCreateAsync( + dbContext.ApplicationRoles, + a => a.Role == SuperUserRoleName && a.TenantId == tenantId, + () => new ApplicationRole + { + Role = SuperUserRoleName, + Description = "System role with all permissions.", + IsSystem = true, + TenantId = tenantId + }); + + // 4. Seed the Employee record linked to the user and job role + var employee = await GetOrCreateAsync( + dbContext.Employees, + e => e.Email == adminSettings.Email && e.TenantId == tenantId, + () => new Employee + { + ApplicationUserId = user.Id, + FirstName = "Admin", + LastName = "User", + Email = adminSettings.Email, + TenantId = tenantId, + PhoneNumber = "9876543210", + JobRoleId = jobRole.Id, + IsSystem = true, + JoiningDate = DateTime.UtcNow, + BirthDate = new DateTime(1970, 1, 1) + // Set other non-nullable fields to sensible defaults + }); + + // 5. Seed the Employee-Role Mapping + await GetOrCreateAsync( + dbContext.EmployeeRoleMappings, + erm => erm.EmployeeId == employee.Id && erm.RoleId == appRole.Id, + () => new EmployeeRoleMapping + { + EmployeeId = employee.Id, + RoleId = appRole.Id, + TenantId = tenantId, + IsEnabled = true + }); + + // 6. Seed Role Permissions (Efficiently) + await SeedRolePermissionsAsync(dbContext, appRole.Id); + + // All entities are now tracked by the DbContext. + // A single SaveChanges call is more efficient. + await dbContext.SaveChangesAsync(cancellationToken); + + // If all operations were successful, commit the transaction. + await transaction.CommitAsync(cancellationToken); + _logger.LogInformation("Database seeding process completed successfully."); + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred during database seeding. Rolling back changes."); + await transaction.RollbackAsync(cancellationToken); + // Optionally re-throw or handle the exception as needed + throw; + } + } + + private async Task SeedSuperAdminUserAsync(UserManager userManager, SuperAdminSettings settings, Guid tenantId) + { + _logger.LogInformation("Seeding Super Admin user: {Email}", settings.Email); + var user = await userManager.FindByEmailAsync(settings.Email); if (user == null) { - result = await userManager.CreateAsync(newUser, "User@123"); - } - else - { - newUser = user; - } - - var jobRole = new JobRole - { - Id = Guid.Empty, - Name = "Admin", - Description = "Admin", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - }; - - if (!await dbContext.JobRoles.Where(j => j.Name == "Admin").AnyAsync()) - { - await dbContext.JobRoles.AddAsync(jobRole); - } - else - { - jobRole = await dbContext.JobRoles.Where(j => j.Name == "Admin").FirstOrDefaultAsync(); - } - var role = new ApplicationRole - { - Role = "Super User", - Description = "Super User", - IsSystem = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }; - if (!await dbContext.ApplicationRoles.Where(a => a.Role == "Super User").AnyAsync()) - { - await dbContext.ApplicationRoles.AddAsync(role); - } - else - { - role = await dbContext.ApplicationRoles.Where(a => a.Role == "Super User").FirstOrDefaultAsync(); - } - await dbContext.SaveChangesAsync(); - var employee = new Employee - { - ApplicationUserId = newUser.Id, - FirstName = "Admin", - LastName = "", - Email = userEmail, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - CurrentAddress = "", - BirthDate = Convert.ToDateTime("1965-04-20 10:11:17.588000"), - EmergencyPhoneNumber = "", - EmergencyContactPerson = "", - AadharNumber = "", - Gender = "", - MiddleName = "", - PanNumber = "", - PermanentAddress = "", - PhoneNumber = "9876543210", - Photo = null, // GetFileDetails(model.Photo).Result.FileData, - JobRoleId = jobRole != null ? jobRole.Id : Guid.Empty, - IsSystem = true, - JoiningDate = Convert.ToDateTime("2000-04-20 10:11:17.588000"), - }; - if ((!await dbContext.Employees.Where(e => e.Email == "admin@marcoaiot.com").AnyAsync()) && jobRole?.Id != Guid.Empty) - { - await dbContext.Employees.AddAsync(employee); - } - else - { - employee = await dbContext.Employees.Where(e => e.Email == "admin@marcoaiot.com").FirstOrDefaultAsync(); - } - await dbContext.SaveChangesAsync(); - if (!await dbContext.EmployeeRoleMappings.AnyAsync()) - { - await dbContext.EmployeeRoleMappings.AddAsync(new EmployeeRoleMapping + user = new ApplicationUser { - EmployeeId = employee?.Id ?? Guid.Empty, - IsEnabled = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - RoleId = role?.Id ?? Guid.Empty - }); - } - if (!await dbContext.RolePermissionMappings.AnyAsync()) - { - List permissions = await dbContext.FeaturePermissions.ToListAsync(); - List rolesMapping = new List(); - foreach (var permission in permissions) + UserName = settings.Email, + Email = settings.Email, + EmailConfirmed = true, + IsRootUser = true, + TenantId = tenantId + }; + var result = await userManager.CreateAsync(user, settings.Password); + + if (!result.Succeeded) { - rolesMapping.Add(new RolePermissionMappings - { - ApplicationRoleId = role != null ? role.Id : Guid.Empty, - FeaturePermissionId = permission.Id - }); + // If user creation fails, it's a critical error. + var errors = string.Join(", ", result.Errors.Select(e => e.Description)); + _logger.LogError("Failed to create super admin user. Errors: {Errors}", errors); + throw new InvalidOperationException($"Failed to create super admin user: {errors}"); } - await dbContext.RolePermissionMappings.AddRangeAsync(rolesMapping); + _logger.LogInformation("Super Admin user created successfully."); } - await dbContext.SaveChangesAsync(); + else + { + _logger.LogInformation("Super Admin user already exists."); + } + return user; + } + + private async Task SeedRolePermissionsAsync(ApplicationDbContext dbContext, Guid superUserRoleId) + { + _logger.LogInformation("Seeding permissions for Super User role (ID: {RoleId})", superUserRoleId); + + var allPermissionIds = await dbContext.FeaturePermissions + .Select(p => p.Id) + .ToListAsync(); + + var permissionIdsFromDb = await dbContext.RolePermissionMappings + .Where(pm => pm.ApplicationRoleId == superUserRoleId) + .Select(pm => pm.FeaturePermissionId) + .ToListAsync(); // 1. Fetch data from DB into a List + + var existingPermissionIds = new HashSet(permissionIdsFromDb); // 2. Convert the List to a HashSet in memory + + var missingPermissionIds = allPermissionIds.Except(existingPermissionIds).ToList(); + + if (missingPermissionIds.Any()) + { + var newMappings = missingPermissionIds.Select(permissionId => new RolePermissionMappings + { + ApplicationRoleId = superUserRoleId, + FeaturePermissionId = permissionId + }); + + await dbContext.RolePermissionMappings.AddRangeAsync(newMappings); + _logger.LogInformation("Added {Count} new permission mappings to the Super User role.", missingPermissionIds.Count); + } + else + { + _logger.LogInformation("Super User role already has all available permissions."); + } + } + + /// + /// A generic helper to find an entity by a predicate or create, add, and return it if not found. + /// This promotes code reuse and makes the main logic cleaner. + /// + private async Task GetOrCreateAsync(DbSet dbSet, Expression> predicate, Func factory) where T : class + { + var entity = await dbSet.FirstOrDefaultAsync(predicate); + if (entity == null) + { + entity = factory(); + await dbSet.AddAsync(entity); + _logger.LogInformation("Creating new entity of type {EntityType}.", typeof(T).Name); + } + return entity; } public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; From cc2e545442e74695adb85c74dc777540a6e9b9ad Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 15:00:21 +0530 Subject: [PATCH 007/125] Added created by and created at in expenses model --- ...edBy_And_CareatedAt_In_Expense.Designer.cs | 4196 +++++++++++++++++ ...ded_CreatedBy_And_CareatedAt_In_Expense.cs | 63 + .../ApplicationDbContextModelSnapshot.cs | 16 + Marco.Pms.Model/Expenses/Expenses.cs | 6 + 4 files changed, 4281 insertions(+) create mode 100644 Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs new file mode 100644 index 0000000..47a46cc --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs @@ -0,0 +1,4196 @@ +// +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("20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense")] + partial class Added_CreatedBy_And_CareatedAt_In_Expense + { + /// + 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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + 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("ProjectId") + .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("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProjectId"); + + 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.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpeStatusIdnsesId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpeStatusIdnsesId"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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"); + }); + + 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.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + 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("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Description = "Expense has been created but not yet submitted.", + IsActive = true, + IsSystem = true, + Name = "Draft", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Description = "Reviewer is currently reviewing the expense.", + IsActive = true, + IsSystem = true, + Name = "Review Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Description = "Review is completed, waiting for action of approver.", + IsActive = true, + IsSystem = true, + Name = "Approval Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsActive = true, + IsSystem = true, + Name = "Rejected", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Description = "Approved expense is awaiting final payment.", + IsActive = true, + IsSystem = true, + Name = "Process Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Description = "Expense has been settled.", + IsActive = true, + IsSystem = true, + Name = "Processed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + 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.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("Project"); + + 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.Entitlements.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.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("ExpeStatusIdnsesId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs new file mode 100644 index 0000000..19a5c08 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs @@ -0,0 +1,63 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_CreatedBy_And_CareatedAt_In_Expense : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CreatedAt", + table: "Expenses", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "CreatedById", + table: "Expenses", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_CreatedById", + table: "Expenses", + column: "CreatedById"); + + migrationBuilder.AddForeignKey( + name: "FK_Expenses_Employees_CreatedById", + table: "Expenses", + column: "CreatedById", + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Expenses_Employees_CreatedById", + table: "Expenses"); + + migrationBuilder.DropIndex( + name: "IX_Expenses_CreatedById", + table: "Expenses"); + + migrationBuilder.DropColumn( + name: "CreatedAt", + table: "Expenses"); + + migrationBuilder.DropColumn( + name: "CreatedById", + table: "Expenses"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 766e2dd..182224e 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1297,6 +1297,12 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("Amount") .HasColumnType("double"); + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + b.Property("Description") .IsRequired() .HasColumnType("longtext"); @@ -1346,6 +1352,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasKey("Id"); + b.HasIndex("CreatedById"); + b.HasIndex("ExpensesTypeId"); b.HasIndex("PaidById"); @@ -3651,6 +3659,12 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => { + 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") @@ -3687,6 +3701,8 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("CreatedBy"); + b.Navigation("ExpensesType"); b.Navigation("PaidBy"); diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs index 19e8333..a396715 100644 --- a/Marco.Pms.Model/Expenses/Expenses.cs +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -30,7 +30,13 @@ namespace Marco.Pms.Model.Expenses [ValidateNever] [ForeignKey("PaidById")] public Employee? PaidBy { get; set; } + public Guid CreatedById { get; set; } + + [ValidateNever] + [ForeignKey("CreatedById")] + public Employee? CreatedBy { get; set; } public DateTime TransactionDate { get; set; } + public DateTime CreatedAt { get; set; } public string? TransactionId { get; set; } public string Description { get; set; } = string.Empty; public string? Location { get; set; } From 8e69219e73da35856cc711a5c43bfd263093a9bb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 15:02:48 +0530 Subject: [PATCH 008/125] Added all get lsit for Expenses-Type, Expenses-Status and payment-mode --- .../Controllers/MasterController.cs | 41 +++++++++- Marco.Pms.Services/Helpers/MasterHelper.cs | 57 ++++++------- .../MappingProfiles/MappingProfile.cs | 12 ++- Marco.Pms.Services/Program.cs | 1 + Marco.Pms.Services/Service/MasterService.cs | 80 +++++++++++++++++++ Marco.Pms.Services/Service/S3UploadService.cs | 46 +++++++++-- .../ServiceInterfaces/IMasterService.cs | 11 +++ 7 files changed, 206 insertions(+), 42 deletions(-) create mode 100644 Marco.Pms.Services/Service/MasterService.cs create mode 100644 Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 9000cdf..f115bde 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -10,6 +10,7 @@ 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; using Microsoft.AspNetCore.Authorization; @@ -27,12 +28,14 @@ namespace Marco.Pms.Services.Controllers private readonly UserHelper _userHelper; private readonly ILoggingService _logger; private readonly MasterHelper _masterHelper; - public MasterController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, MasterHelper masterHelper) + private readonly IMasterService _masterService; + public MasterController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, MasterHelper masterHelper, IMasterService masterService) { _context = context; _userHelper = userHelper; _logger = logger; _masterHelper = masterHelper; + _masterService = masterService; } // -------------------------------- Activity -------------------------------- @@ -846,5 +849,41 @@ namespace Marco.Pms.Services.Controllers var response = await _masterHelper.DeleteContactTag(id); return Ok(response); } + #region =================================================================== Expenses Type APIs =================================================================== + [HttpGet("expenses-types")] + public async Task GetExpenseTypeList() + { + var response = await _masterService.GetExpenseTypeListAsync(); + return StatusCode(response.StatusCode, response); + } + public async Task CreateExpenseType(ExpensesTypeMasterDto dto) + { + var response = await _masterService.GetExpenseTypeListAsync(); + return StatusCode(response.StatusCode, response); + } + + #endregion + + #region =================================================================== Expenses Status APIs =================================================================== + [HttpGet("expenses-status")] + public async Task GetExpenseStatusList() + { + var response = await _masterService.GetExpenseStatusListAsync(); + return StatusCode(response.StatusCode, response); + } + + + #endregion + + #region =================================================================== Payment mode APIs =================================================================== + [HttpGet("payment-modes")] + public async Task GetPaymentModeList() + { + var response = await _masterService.GetPaymentModeListAsync(); + return StatusCode(response.StatusCode, response); + } + + + #endregion } } diff --git a/Marco.Pms.Services/Helpers/MasterHelper.cs b/Marco.Pms.Services/Helpers/MasterHelper.cs index 83bc007..d50a603 100644 --- a/Marco.Pms.Services/Helpers/MasterHelper.cs +++ b/Marco.Pms.Services/Helpers/MasterHelper.cs @@ -19,20 +19,21 @@ namespace Marco.Pms.Services.Helpers private readonly ApplicationDbContext _context; private readonly ILoggingService _logger; private readonly UserHelper _userHelper; - private readonly PermissionServices _permissionService; + private readonly PermissionServices _permission; + private readonly Guid tenantId; - - public MasterHelper(ApplicationDbContext context, ILoggingService logger, UserHelper userHelper, PermissionServices permissionServices) + public MasterHelper(ApplicationDbContext context, ILoggingService logger, UserHelper userHelper, PermissionServices permission) { _context = context; _logger = logger; _userHelper = userHelper; - _permissionService = permissionServices; + _permission = permission; + tenantId = userHelper.GetTenantId(); } - // -------------------------------- Contact Category -------------------------------- + #region =================================================================== Contact Category APIs =================================================================== + public async Task> CreateContactCategory(CreateContactCategoryDto contactCategoryDto) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (contactCategoryDto != null) { @@ -55,7 +56,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> UpdateContactCategory(Guid id, UpdateContactCategoryDto contactCategoryDto) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (contactCategoryDto != null && id == contactCategoryDto.Id) { @@ -86,7 +86,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> GetContactCategoriesList() { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var categoryList = await _context.ContactCategoryMasters.Where(c => c.TenantId == tenantId).ToListAsync(); @@ -101,7 +100,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> GetContactCategoryById(Guid id) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var category = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); @@ -117,7 +115,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> DeleteContactCategory(Guid id) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); ContactCategoryMaster? contactCategory = await _context.ContactCategoryMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); if (contactCategory != null) @@ -148,14 +145,12 @@ namespace Marco.Pms.Services.Helpers _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 - // -------------------------------- Contact Tag -------------------------------- - + #region =================================================================== Contact Tag APIs =================================================================== public async Task> GetContactTags() { - Guid tenantId = _userHelper.GetTenantId(); - var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var taglist = await _context.ContactTagMasters.Where(t => t.TenantId == tenantId).ToListAsync(); @@ -170,7 +165,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> CreateContactTag(CreateContactTagDto contactTagDto) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (contactTagDto != null) { @@ -193,7 +187,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> UpdateContactTag(Guid id, UpdateContactTagDto contactTagDto) { - var tenantId = _userHelper.GetTenantId(); Employee LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (contactTagDto != null && contactTagDto.Id == id) { @@ -226,7 +219,6 @@ namespace Marco.Pms.Services.Helpers } public async Task> DeleteContactTag(Guid id) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); ContactTagMaster? contactTag = await _context.ContactTagMasters.FirstOrDefaultAsync(c => c.Id == id && c.TenantId == tenantId); if (contactTag != null) @@ -252,19 +244,21 @@ namespace Marco.Pms.Services.Helpers return ApiResponse.SuccessResponse(new { }, "Tag deleted successfully", 200); } - // -------------------------------- Work Status -------------------------------- + #endregion + + #region =================================================================== Work Status APIs =================================================================== + public async Task> GetWorkStatusList() { _logger.LogInfo("GetWorkStatusList called."); try { - // Step 1: Get tenant and logged-in employee info - Guid tenantId = _userHelper.GetTenantId(); + // Step 1: Get logged-in employee info var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); // Step 2: Check permission to view master data - bool hasViewPermission = await _permissionService.HasPermission(PermissionsMaster.ViewMasters, loggedInEmployee.Id); + bool hasViewPermission = await _permission.HasPermission(PermissionsMaster.ViewMasters, loggedInEmployee.Id); if (!hasViewPermission) { _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); @@ -294,7 +288,7 @@ namespace Marco.Pms.Services.Helpers } catch (Exception ex) { - _logger.LogWarning("Error occurred while fetching work status list : {Error}", ex.Message); + _logger.LogError(ex, "Error occurred while fetching work status list"); return ApiResponse.ErrorResponse("An error occurred", "Unable to fetch work status list", 500); } } @@ -304,12 +298,11 @@ namespace Marco.Pms.Services.Helpers try { - // Step 1: Get tenant and logged-in employee - Guid tenantId = _userHelper.GetTenantId(); + // 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 _permissionService.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); if (!hasManageMasterPermission) { _logger.LogWarning("Access denied for employeeId: {EmployeeId}", loggedInEmployee.Id); @@ -343,7 +336,7 @@ namespace Marco.Pms.Services.Helpers } catch (Exception ex) { - _logger.LogWarning("Error occurred while creating work status : {Error}", ex.Message); + _logger.LogError(ex, "Error occurred while creating work status"); return ApiResponse.ErrorResponse("An error occurred", "Unable to create work status", 500); } } @@ -360,12 +353,11 @@ namespace Marco.Pms.Services.Helpers return ApiResponse.ErrorResponse("Invalid data provided", "The provided work status ID is invalid", 400); } - // Step 2: Get tenant and logged-in employee - Guid tenantId = _userHelper.GetTenantId(); + // Step 2: Get logged-in employee var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); // Step 3: Check permissions - var hasManageMasterPermission = await _permissionService.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + 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); @@ -413,12 +405,11 @@ namespace Marco.Pms.Services.Helpers try { - // Step 1: Get current tenant and logged-in employee - Guid tenantId = _userHelper.GetTenantId(); + // Step 1: Get logged-in employee var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); // Step 2: Check permission to manage master data - var hasManageMasterPermission = await _permissionService.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + var hasManageMasterPermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); if (!hasManageMasterPermission) { _logger.LogWarning("Delete denied. EmployeeId: {EmployeeId} lacks Manage_Master permission.", loggedInEmployee.Id); @@ -462,5 +453,7 @@ namespace Marco.Pms.Services.Helpers 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 bf3777c..2706083 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Master; @@ -60,9 +61,18 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Comment)); #endregion - #region ======================================================= Projects ======================================================= + #region ======================================================= Employee ======================================================= CreateMap(); #endregion + + #region ======================================================= Master ======================================================= + CreateMap() + .ForMember( + dest => dest.Id, + // Explicitly and safely convert nullable Guid to non-nullable Guid + opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) + ); + #endregion } } } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index e67ed7a..a43af8b 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/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs new file mode 100644 index 0000000..bd74bce --- /dev/null +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -0,0 +1,80 @@ +using AutoMapper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.Dtos.Master; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Master; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; +using Microsoft.EntityFrameworkCore; + +namespace Marco.Pms.Services.Service +{ + public class MasterService : IMasterService + { + private readonly ApplicationDbContext _context; + private readonly ILoggingService _logger; + private readonly UserHelper _userHelper; + private readonly PermissionServices _permission; + private readonly IMapper _mapper; + private readonly Guid tenantId; + + public MasterService( + ApplicationDbContext context, + ILoggingService logger, + UserHelper userHelper, + PermissionServices permission, + IMapper mapper) + { + _context = context; + _logger = logger; + _userHelper = userHelper; + _permission = permission; + _mapper = mapper; + tenantId = userHelper.GetTenantId(); + } + + #region =================================================================== Expenses Type APIs =================================================================== + + public async Task> GetExpenseTypeListAsync() + { + var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync(); + return ApiResponse.SuccessResponse(typeList); + } + public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPANSES TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + } + var expensesType = _mapper.Map(dto); + return ApiResponse.SuccessResponse(expensesType); + } + + #endregion + + #region =================================================================== Expenses Status APIs =================================================================== + public async Task> GetExpenseStatusListAsync() + { + var typeList = await _context.ExpensesStatusMaster.Where(et => et.TenantId == tenantId).ToListAsync(); + return ApiResponse.SuccessResponse(typeList); + } + + + #endregion + + #region =================================================================== Payment mode APIs =================================================================== + public async Task> GetPaymentModeListAsync() + { + var typeList = await _context.PaymentModeMatser.Where(et => et.TenantId == tenantId).ToListAsync(); + return ApiResponse.SuccessResponse(typeList); + } + + + #endregion + } +} diff --git a/Marco.Pms.Services/Service/S3UploadService.cs b/Marco.Pms.Services/Service/S3UploadService.cs index 4ce7a4b..1d98a33 100644 --- a/Marco.Pms.Services/Service/S3UploadService.cs +++ b/Marco.Pms.Services/Service/S3UploadService.cs @@ -5,6 +5,7 @@ using Marco.Pms.Model.Utilities; using MarcoBMS.Services.Service; using Microsoft.Extensions.Options; using MimeDetective; +using System.Text.RegularExpressions; namespace Marco.Pms.Services.Service { @@ -12,7 +13,7 @@ namespace Marco.Pms.Services.Service public class S3UploadService { private readonly IAmazonS3 _s3Client; - private readonly string _bucketName = "your-bucket-name"; + private readonly string _bucketName; private readonly ILoggingService _logger; private readonly IConfiguration _configuration; @@ -64,7 +65,7 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) { - _logger.LogError(ex, "error occured while uploading file to S3"); + _logger.LogError(ex, "Error ocurred while uploading file to S3", ex.Message); } @@ -87,7 +88,7 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) { - _logger.LogError(ex, "error occured while requesting presigned url from Amazon S3", ex.Message); + _logger.LogError(ex, "Error occured while requesting presigned url from Amazon S3"); return string.Empty; } } @@ -107,17 +108,17 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) { - _logger.LogError(ex, "error ocured while deleting from Amazon S3"); + _logger.LogError(ex, "while deleting from Amazon S3"); return false; } } - public string GenerateFileName(string contentType, Guid tenantId, string? name) + public string GenerateFileName(string contentType, Guid entityId, string? name) { string extenstion = GetExtensionFromMimeType(contentType); if (string.IsNullOrEmpty(name)) - return $"{tenantId}_{DateTime.UtcNow:yyyyMMddHHmmssfff}{extenstion}"; - return $"{name}_{tenantId}_{DateTime.UtcNow:yyyyMMddHHmmssfff}{extenstion}"; + return $"{entityId}_{DateTime.UtcNow:yyyyMMddHHmmssfff}{extenstion}"; + return $"{name}_{entityId}_{DateTime.UtcNow:yyyyMMddHHmmssfff}{extenstion}"; } public string GetExtensionFromMimeType(string contentType) @@ -220,9 +221,38 @@ namespace Marco.Pms.Services.Service catch (Exception ex) { // Handle other potential errors during decoding or inspection - _logger.LogError(ex, "errors during decoding or inspection"); + _logger.LogError(ex, "An error occurred while decoding base64"); return string.Empty; } } + public bool IsBase64String(string? input) + { + if (string.IsNullOrWhiteSpace(input)) + return false; + + // Normalize string + input = input.Trim(); + + // Length must be multiple of 4 + if (input.Length % 4 != 0) + return false; + + // Valid Base64 characters with correct padding + var base64Regex = new Regex(@"^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); + if (!base64Regex.IsMatch(input)) + return false; + + try + { + // Decode and re-encode to confirm validity + var bytes = Convert.FromBase64String(input); + var reEncoded = Convert.ToBase64String(bytes); + return input == reEncoded; + } + catch + { + return false; + } + } } } \ No newline at end of file diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs new file mode 100644 index 0000000..1b970ca --- /dev/null +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -0,0 +1,11 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Services.Service.ServiceInterfaces +{ + public interface IMasterService + { + Task> GetExpenseTypeListAsync(); + Task> GetExpenseStatusListAsync(); + Task> GetPaymentModeListAsync(); + } +} From 15f100308f1d00a10e51b82518c0e99901501e8d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 15:41:27 +0530 Subject: [PATCH 009/125] Added created API to create expenses entity --- .../Dtos/Expenses/CreateExpensesDto.cs | 5 +- .../Controllers/ExpanseController.cs | 199 ++++++++++++++++++ .../Controllers/MasterController.cs | 1 + 3 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.Services/Controllers/ExpanseController.cs diff --git a/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs index d1d8ec4..d4e9b8d 100644 --- a/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs +++ b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs @@ -5,8 +5,9 @@ namespace Marco.Pms.Model.Dtos.Expenses public class CreateExpensesDto { public required Guid ProjectId { get; set; } - public Guid ExpensesTypeId { get; set; } - public Guid PaymentModeId { get; set; } + public required Guid ExpensesTypeId { get; set; } + public required Guid PaymentModeId { get; set; } + public required Guid PaidById { get; set; } public DateTime TransactionDate { get; set; } = DateTime.Now; public string? TransactionId { get; set; } public required string Description { get; set; } diff --git a/Marco.Pms.Services/Controllers/ExpanseController.cs b/Marco.Pms.Services/Controllers/ExpanseController.cs new file mode 100644 index 0000000..b642495 --- /dev/null +++ b/Marco.Pms.Services/Controllers/ExpanseController.cs @@ -0,0 +1,199 @@ +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.Dtos.Expenses; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Services.Service; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Document = Marco.Pms.Model.DocumentManager.Document; + +// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 + +namespace Marco.Pms.Services.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class ExpanseController : ControllerBase + { + private readonly ApplicationDbContext _context; + private readonly UserHelper _userHelper; + private readonly PermissionServices _permission; + private readonly ILoggingService _logger; + private readonly S3UploadService _s3Service; + private readonly Guid tenantId; + public ExpanseController( + ApplicationDbContext context, + UserHelper userHelper, + PermissionServices permission, + ILoggingService logger, + S3UploadService s3Service) + { + _context = context; + _userHelper = userHelper; + _permission = permission; + _logger = logger; + tenantId = userHelper.GetTenantId(); + _s3Service = s3Service; + } + + [HttpGet] + public IEnumerable Get() + { + return new string[] { "value1", "value2" }; + } + + [HttpGet("{id}")] + public string Get(int id) + { + return "value"; + } + + [HttpPost] + public async Task Post([FromBody] CreateExpensesDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var hasUploadPermission = await _permission.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); + var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, dto.ProjectId); + if (!hasUploadPermission || !hasProjectPermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for uploading expense on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403)); + } + var isExpensesTypeExist = await _context.ExpensesTypeMaster.AnyAsync(et => et.Id == dto.ExpensesTypeId); + if (!isExpensesTypeExist) + { + _logger.LogWarning("Expenses type not for ID: {ExpensesTypeId} when creating new expense", dto.ExpensesTypeId); + return NotFound(ApiResponse.ErrorResponse("Expanses Type not found", "Expanses Type not found", 404)); + } + var isPaymentModeExist = await _context.PaymentModeMatser.AnyAsync(et => et.Id == dto.PaymentModeId); + if (!isPaymentModeExist) + { + _logger.LogWarning("Payment Mode not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); + return NotFound(ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404)); + } + var isStatusExist = await _context.ExpensesStatusMaster.AnyAsync(et => et.Id == dto.StatusId); + if (!isStatusExist) + { + _logger.LogWarning("Status not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); + return NotFound(ApiResponse.ErrorResponse("Status not found", "Status not found", 404)); + } + var expense = new Expenses + { + ProjectId = dto.ProjectId, + ExpensesTypeId = dto.ExpensesTypeId, + PaymentModeId = dto.PaymentModeId, + PaidById = dto.PaidById, + CreatedById = loggedInEmployee.Id, + TransactionDate = dto.TransactionDate, + CreatedAt = DateTime.UtcNow, + TransactionId = dto.TransactionId, + Description = dto.Description, + Location = dto.Location, + GSTNumber = dto.GSTNumber, + SupplerName = dto.SupplerName, + Amount = dto.Amount, + NoOfPersons = dto.NoOfPersons, + StatusId = dto.StatusId, + PreApproved = dto.PreApproved, + IsActive = true, + TenantId = tenantId + }; + _context.Expenses.Add(expense); + + + Guid batchId = Guid.NewGuid(); + foreach (var attachment in dto.BillAttachments) + { + //if (!_s3Service.IsBase64String(attachment.Base64Data)) + //{ + // _logger.LogWarning("Image upload failed: Base64 data is missing While creating new expense entity for project {ProjectId} by employee {EmployeeId}", expense.ProjectId, expense.PaidById); + // return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); + //} + var base64 = attachment.Base64Data!.Contains(',') + ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] + : attachment.Base64Data; + + var fileType = _s3Service.GetContentTypeFromBase64(base64); + var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); + var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; + try + { + await _s3Service.UploadFileAsync(base64, fileType, objectKey); + _logger.LogInfo("Image uploaded to S3 with key: {ObjectKey}", objectKey); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while saving image to S3"); + //return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new + //{ + // message = ex.Message, + // innerexcption = ex.InnerException?.Message, + // stackTrace = ex.StackTrace, + // source = ex.Source + //}, 400)); + } + + var document = new Document + { + BatchId = batchId, + UploadedById = loggedInEmployee.Id, + FileName = attachment.FileName ?? "", + ContentType = attachment.ContentType ?? "", + S3Key = objectKey, + //Base64Data = attachment.Base64Data, + FileSize = attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + _context.Documents.Add(document); + + var billAttachement = new BillAttachments + { + DocumentId = document.Id, + ExpensesId = expense.Id, + TenantId = tenantId + }; + _context.BillAttachments.Add(billAttachement); + } + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Error occured while saving Expense, Document and bill attachment entity"); + return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 400)); + } + _logger.LogInfo("Documents and attachments saved for Expense: {ExpenseId}", expense.Id); + + return StatusCode(201, ApiResponse.SuccessResponse(expense, "Expense created Successfully", 201)); + } + + + [HttpPut("{id}")] + public void Put(int id, [FromBody] string value) + { + } + + [HttpDelete("{id}")] + public void Delete(int id) + { + } + } +} diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index f115bde..608caed 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -856,6 +856,7 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpenseTypeListAsync(); return StatusCode(response.StatusCode, response); } + [HttpPost("expenses-type")] public async Task CreateExpenseType(ExpensesTypeMasterDto dto) { var response = await _masterService.GetExpenseTypeListAsync(); From 84f5da25f6a0ed754fd023be8b4b924f3ccd5fd9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 15:49:23 +0530 Subject: [PATCH 010/125] Added the get API in Expenses module --- Marco.Pms.Services/Controllers/ExpanseController.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ExpanseController.cs b/Marco.Pms.Services/Controllers/ExpanseController.cs index b642495..ee05590 100644 --- a/Marco.Pms.Services/Controllers/ExpanseController.cs +++ b/Marco.Pms.Services/Controllers/ExpanseController.cs @@ -42,9 +42,18 @@ namespace Marco.Pms.Services.Controllers } [HttpGet] - public IEnumerable Get() + public async Task Get() { - return new string[] { "value1", "value2" }; + var expensesList = await _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .Where(e => e.TenantId == tenantId) + .ToListAsync(); + return StatusCode(200, ApiResponse.SuccessResponse(expensesList)); } [HttpGet("{id}")] From c27ffe3a28c5c4bb630104ac3c93967640782414 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 16:13:37 +0530 Subject: [PATCH 011/125] Addd a table to save logs of expenses --- .../Data/ApplicationDbContext.cs | 1 + ...9103905_Added_ExpenseLog_Table.Designer.cs | 4243 +++++++++++++++++ .../20250719103905_Added_ExpenseLog_Table.cs | 62 + .../ApplicationDbContextModelSnapshot.cs | 47 + Marco.Pms.Model/Expenses/ExpenseLog.cs | 23 + 5 files changed, 4376 insertions(+) create mode 100644 Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs create mode 100644 Marco.Pms.Model/Expenses/ExpenseLog.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 781344e..bc9ab5d 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -91,6 +91,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet MPINDetails { get; set; } public DbSet Expenses { get; set; } + public DbSet ExpenseLogs { get; set; } public DbSet ExpensesTypeMaster { get; set; } public DbSet PaymentModeMatser { get; set; } public DbSet ExpensesStatusMaster { get; set; } diff --git a/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs new file mode 100644 index 0000000..2eaef13 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs @@ -0,0 +1,4243 @@ +// +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("20250719103905_Added_ExpenseLog_Table")] + partial class Added_ExpenseLog_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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + 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("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("ProjectId") + .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("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProjectId"); + + 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.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpeStatusIdnsesId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpeStatusIdnsesId"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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"); + }); + + 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.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + 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("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Description = "Expense has been created but not yet submitted.", + IsActive = true, + IsSystem = true, + Name = "Draft", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Description = "Reviewer is currently reviewing the expense.", + IsActive = true, + IsSystem = true, + Name = "Review Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Description = "Review is completed, waiting for action of approver.", + IsActive = true, + IsSystem = true, + Name = "Approval Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsActive = true, + IsSystem = true, + Name = "Rejected", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Description = "Approved expense is awaiting final payment.", + IsActive = true, + IsSystem = true, + Name = "Process Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Description = "Expense has been settled.", + IsActive = true, + IsSystem = true, + Name = "Processed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + 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.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("Project"); + + 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.Entitlements.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.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("ExpeStatusIdnsesId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250719103905_Added_ExpenseLog_Table.cs b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs new file mode 100644 index 0000000..c4fc528 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs @@ -0,0 +1,62 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_ExpenseLog_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ExpenseLogs", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpenseId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Action = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Comment = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_ExpenseLogs", x => x.Id); + table.ForeignKey( + name: "FK_ExpenseLogs_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpenseLogs_Expenses_ExpenseId", + column: x => x.ExpenseId, + principalTable: "Expenses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_ExpenseLogs_ExpenseId", + table: "ExpenseLogs", + column: "ExpenseId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpenseLogs_UpdatedById", + table: "ExpenseLogs", + column: "UpdatedById"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ExpenseLogs"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 182224e..63ff979 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1288,6 +1288,34 @@ namespace Marco.Pms.DataAccess.Migrations 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("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => { b.Property("Id") @@ -3657,6 +3685,25 @@ namespace Marco.Pms.DataAccess.Migrations 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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("UpdatedBy"); + }); + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => { b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") diff --git a/Marco.Pms.Model/Expenses/ExpenseLog.cs b/Marco.Pms.Model/Expenses/ExpenseLog.cs new file mode 100644 index 0000000..ec3d8fd --- /dev/null +++ b/Marco.Pms.Model/Expenses/ExpenseLog.cs @@ -0,0 +1,23 @@ +using Marco.Pms.Model.Employees; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Expenses +{ + public class ExpenseLog + { + public Guid Id { get; set; } + public Guid ExpenseId { get; set; } + + [ValidateNever] + [ForeignKey("ExpenseId")] + public Expenses? Expense { get; set; } + public Guid UpdatedById { get; set; } + + [ValidateNever] + [ForeignKey("UpdatedById")] + public Employee? UpdatedBy { get; set; } + public string Action { get; set; } = string.Empty; + public string? Comment { get; set; } + } +} From 448d586b94d27018f2e1232ff9fed7d7142a2844 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 16:21:54 +0530 Subject: [PATCH 012/125] Changed the endpoint names in expense controller --- Marco.Pms.Services/Controllers/ExpanseController.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ExpanseController.cs b/Marco.Pms.Services/Controllers/ExpanseController.cs index ee05590..9f85454 100644 --- a/Marco.Pms.Services/Controllers/ExpanseController.cs +++ b/Marco.Pms.Services/Controllers/ExpanseController.cs @@ -41,7 +41,7 @@ namespace Marco.Pms.Services.Controllers _s3Service = s3Service; } - [HttpGet] + [HttpGet("list")] public async Task Get() { var expensesList = await _context.Expenses @@ -56,13 +56,13 @@ namespace Marco.Pms.Services.Controllers return StatusCode(200, ApiResponse.SuccessResponse(expensesList)); } - [HttpGet("{id}")] + [HttpGet("details/{id}")] public string Get(int id) { return "value"; } - [HttpPost] + [HttpPost("create")] public async Task Post([FromBody] CreateExpensesDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -195,12 +195,12 @@ namespace Marco.Pms.Services.Controllers } - [HttpPut("{id}")] + [HttpPut("edit/{id}")] public void Put(int id, [FromBody] string value) { } - [HttpDelete("{id}")] + [HttpDelete("delete/{id}")] public void Delete(int id) { } From 741acb194e3e3510c2d7eb47e6b2a014429381af Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 17:10:02 +0530 Subject: [PATCH 013/125] Added the status Mapping table in database --- .../Data/ApplicationDbContext.cs | 15 +- ...ded_ExpensesStatusMaping_Table.Designer.cs | 4243 +++++++++++++++++ ...113715_Added_ExpensesStatusMaping_Table.cs | 149 + .../ApplicationDbContextModelSnapshot.cs | 6 +- ...tusMapping.cs => ExpensesStatusMapping.cs} | 2 +- 5 files changed, 4404 insertions(+), 11 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs rename Marco.Pms.Model/Expenses/{StatusMapping.cs => ExpensesStatusMapping.cs} (91%) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index bc9ab5d..71dbdfa 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -99,6 +99,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet ExpensesReimburse { get; set; } public DbSet ExpensesReimburseMapping { get; set; } public DbSet StatusPermissionMapping { get; set; } + public DbSet ExpensesStatusMapping { get; set; } @@ -444,9 +445,9 @@ namespace Marco.Pms.DataAccess.Data } ); - modelBuilder.Entity().HasData( + modelBuilder.Entity().HasData( // Process to processed - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("5cf7f1df-9d1f-4289-add0-1775ad614f25"), StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), @@ -454,7 +455,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Approve to Rejected - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("36c00548-241c-43ec-bc95-cacebedb925c"), StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), @@ -462,7 +463,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Approve to Process - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("1fca1700-1266-477d-bba4-9ac3753aa33c"), StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), @@ -470,7 +471,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Review to Rejected - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("fddaaf20-4ccc-4f4e-a724-dd310272b356"), StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), @@ -478,7 +479,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Review to Aprrove - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), @@ -486,7 +487,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Draft to Review - new StatusMapping + new ExpensesStatusMapping { Id = Guid.Parse("af1e4492-98ee-4451-8ab7-fd8323f29c32"), StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"), diff --git a/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs new file mode 100644 index 0000000..d5fe0c3 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs @@ -0,0 +1,4243 @@ +// +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("20250719113715_Added_ExpensesStatusMaping_Table")] + partial class Added_ExpensesStatusMaping_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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + 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("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("ProjectId") + .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("CreatedById"); + + b.HasIndex("ExpensesTypeId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("ProjectId"); + + 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.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpeStatusIdnsesId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpeStatusIdnsesId"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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"); + }); + + 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.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + 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("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Description = "Expense has been created but not yet submitted.", + IsActive = true, + IsSystem = true, + Name = "Draft", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Description = "Reviewer is currently reviewing the expense.", + IsActive = true, + IsSystem = true, + Name = "Review Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Description = "Review is completed, waiting for action of approver.", + IsActive = true, + IsSystem = true, + Name = "Approval Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + IsActive = true, + IsSystem = true, + Name = "Rejected", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Description = "Approved expense is awaiting final payment.", + IsActive = true, + IsSystem = true, + Name = "Process Pending", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Description = "Expense has been settled.", + IsActive = true, + IsSystem = true, + Name = "Processed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + 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.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("ExpensesType"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("Project"); + + 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.Entitlements.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.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("ExpeStatusIdnsesId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250719113715_Added_ExpensesStatusMaping_Table.cs b/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs new file mode 100644 index 0000000..f20e292 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs @@ -0,0 +1,149 @@ +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_ExpensesStatusMaping_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "StatusMapping"); + + migrationBuilder.CreateTable( + name: "ExpensesStatusMapping", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + NextStatusId = 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_ExpensesStatusMapping", x => x.Id); + table.ForeignKey( + name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", + column: x => x.ExpeStatusIdnsesId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_NextStatusId", + column: x => x.NextStatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpensesStatusMapping_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "ExpensesStatusMapping", + columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_ExpeStatusIdnsesId", + table: "ExpensesStatusMapping", + column: "ExpeStatusIdnsesId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_NextStatusId", + table: "ExpensesStatusMapping", + column: "NextStatusId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_TenantId", + table: "ExpensesStatusMapping", + column: "TenantId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ExpensesStatusMapping"); + + migrationBuilder.CreateTable( + name: "StatusMapping", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + NextStatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_StatusMapping", x => x.Id); + table.ForeignKey( + name: "FK_StatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", + column: x => x.ExpeStatusIdnsesId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_StatusMapping_ExpensesStatusMaster_NextStatusId", + column: x => x.NextStatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StatusMapping_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "StatusMapping", + columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_ExpeStatusIdnsesId", + table: "StatusMapping", + column: "ExpeStatusIdnsesId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_NextStatusId", + table: "StatusMapping", + column: "NextStatusId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMapping_TenantId", + table: "StatusMapping", + column: "TenantId"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 63ff979..0151173 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1450,7 +1450,7 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("ExpensesReimburseMapping"); }); - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -1476,7 +1476,7 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("TenantId"); - b.ToTable("StatusMapping"); + b.ToTable("ExpensesStatusMapping"); b.HasData( new @@ -3801,7 +3801,7 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("ExpensesReimburse"); }); - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesStatusMapping", b => { b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") .WithMany() diff --git a/Marco.Pms.Model/Expenses/StatusMapping.cs b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs similarity index 91% rename from Marco.Pms.Model/Expenses/StatusMapping.cs rename to Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs index cc683a4..e09350d 100644 --- a/Marco.Pms.Model/Expenses/StatusMapping.cs +++ b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Marco.Pms.Model.Expenses { - public class StatusMapping : TenantRelation + public class ExpensesStatusMapping : TenantRelation { public Guid Id { get; set; } public Guid StatusId { get; set; } From c1845dd8b7852a20b974799057fefa614a2094c7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 19:05:07 +0530 Subject: [PATCH 014/125] Change the ExpanseController to ExpenseController --- .../ViewModels/Expenses/ExpenseList.cs | 23 ++++++ .../Master/ExpensesStatusMasterVM.cs | 10 +++ .../ViewModels/Master/ExpensesTypeMasterVM.cs | 10 +++ .../ViewModels/Master/PaymentModeMatserVM.cs | 9 +++ ...anseController.cs => ExpenseController.cs} | 79 ++++++++++++++++--- .../MappingProfiles/MappingProfile.cs | 18 +++++ 6 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs create mode 100644 Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs create mode 100644 Marco.Pms.Model/ViewModels/Master/ExpensesTypeMasterVM.cs create mode 100644 Marco.Pms.Model/ViewModels/Master/PaymentModeMatserVM.cs rename Marco.Pms.Services/Controllers/{ExpanseController.cs => ExpenseController.cs} (73%) diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs new file mode 100644 index 0000000..198102d --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs @@ -0,0 +1,23 @@ +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Model.ViewModels.Projects; + +namespace Marco.Pms.Model.ViewModels.Expanses +{ + public class ExpenseList + { + public Guid Id { get; set; } + public ProjectInfoVM? Project { get; set; } + public ExpensesTypeMasterVM? ExpensesType { get; set; } + public PaymentModeMatserVM? PaymentMode { get; set; } + public BasicEmployeeVM? PaidBy { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + public DateTime TransactionDate { get; set; } + public DateTime CreatedAt { get; set; } + public string SupplerName { get; set; } = string.Empty; + public double Amount { get; set; } + public ExpensesStatusMasterVM? Status { get; set; } + public List? NextStatus { get; set; } + public bool PreApproved { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs new file mode 100644 index 0000000..f772695 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.ViewModels.Master +{ + public class ExpensesStatusMasterVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public bool IsSystem { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesTypeMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesTypeMasterVM.cs new file mode 100644 index 0000000..f4551d3 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesTypeMasterVM.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.ViewModels.Master +{ + public class ExpensesTypeMasterVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public bool NoOfPersonsRequired { get; set; } + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/ViewModels/Master/PaymentModeMatserVM.cs b/Marco.Pms.Model/ViewModels/Master/PaymentModeMatserVM.cs new file mode 100644 index 0000000..de7716a --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Master/PaymentModeMatserVM.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.ViewModels.Master +{ + public class PaymentModeMatserVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Services/Controllers/ExpanseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs similarity index 73% rename from Marco.Pms.Services/Controllers/ExpanseController.cs rename to Marco.Pms.Services/Controllers/ExpenseController.cs index 9f85454..ccde41d 100644 --- a/Marco.Pms.Services/Controllers/ExpanseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -1,8 +1,11 @@ -using Marco.Pms.DataAccess.Data; +using AutoMapper; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Expanses; +using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; @@ -18,42 +21,100 @@ namespace Marco.Pms.Services.Controllers [Route("api/[controller]")] [ApiController] [Authorize] - public class ExpanseController : ControllerBase + public class ExpenseController : ControllerBase { private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; private readonly PermissionServices _permission; private readonly ILoggingService _logger; private readonly S3UploadService _s3Service; + private readonly IMapper _mapper; private readonly Guid tenantId; - public ExpanseController( + public ExpenseController( ApplicationDbContext context, UserHelper userHelper, PermissionServices permission, ILoggingService logger, - S3UploadService s3Service) + S3UploadService s3Service, + IMapper mapper) { _context = context; _userHelper = userHelper; _permission = permission; _logger = logger; - tenantId = userHelper.GetTenantId(); _s3Service = s3Service; + _mapper = mapper; + tenantId = userHelper.GetTenantId(); } [HttpGet("list")] - public async Task Get() + public async Task GetExpensesList() { - var expensesList = await _context.Expenses + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var loggedInEmployeeId = loggedInEmployee.Id; + + List? expensesList = null; + var expensesListQuery = _context.Expenses .Include(e => e.ExpensesType) .Include(e => e.Project) .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) .Include(e => e.PaymentMode) .Include(e => e.Status) .Include(e => e.CreatedBy) - .Where(e => e.TenantId == tenantId) + .Where(e => e.TenantId == tenantId); + + var HasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); + var HasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); + + if (HasViewAllPermission) + { + expensesList = await expensesListQuery.ToListAsync(); + } + else if (HasViewSelfPermission) + { + expensesList = await expensesListQuery.Where(e => e.CreatedById == loggedInEmployeeId).ToListAsync(); + } + + if (expensesList == null) + { + _logger.LogInfo("No Expense found for employee {EmployeeId}", loggedInEmployeeId); + return Ok(ApiResponse.SuccessResponse(new List(), "No Expense found for current user", 200)); + } + + //ImageFilter? imageFilter = null; + //if (!string.IsNullOrWhiteSpace(filter)) + //{ + // try + // { + // var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + // //string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; + // //imageFilter = JsonSerializer.Deserialize(unescapedJsonString, options); + // imageFilter = JsonSerializer.Deserialize(filter, options); + // } + // catch (Exception ex) + // { + // _logger.LogWarning("[GetImageList] Failed to parse filter: {Message}", ex.Message); + // } + //} + + + var response = _mapper.Map>(expensesList); + + var statusIds = expensesList.Select(e => e.StatusId).ToList(); + + var statusMappings = await _context.ExpensesStatusMapping + .Include(sm => sm.NextStatus) + .Where(sm => statusIds.Contains(sm.StatusId)) .ToListAsync(); - return StatusCode(200, ApiResponse.SuccessResponse(expensesList)); + + foreach (var expense in response) + { + var statusMapping = statusMappings.Where(sm => sm.StatusId == expense.Status?.Id).Select(sm => _mapper.Map(sm.NextStatus)).ToList(); + expense.NextStatus = statusMapping; + + } + return StatusCode(200, ApiResponse.SuccessResponse(response, $"{response.Count} records of expenses for you fetched successfully", 200)); } [HttpGet("details/{id}")] diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 2706083..fad5b78 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -2,10 +2,14 @@ using AutoMapper; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Expenses; 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.Employee; +using Marco.Pms.Model.ViewModels.Expanses; +using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; namespace Marco.Pms.Services.MappingProfiles @@ -63,6 +67,17 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Employee ======================================================= CreateMap(); + CreateMap() + .ForMember( + dest => dest.JobRoleName, + opt => opt.MapFrom(src => src.JobRole != null ? src.JobRole.Name : "")); + #endregion + + #region ======================================================= Expenses ======================================================= + + CreateMap(); + + #endregion #region ======================================================= Master ======================================================= @@ -72,6 +87,9 @@ namespace Marco.Pms.Services.MappingProfiles // Explicitly and safely convert nullable Guid to non-nullable Guid opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) ); + CreateMap(); + CreateMap(); + CreateMap(); #endregion } } From 3b4b09783b09df60ee6c56c996d75d3c3cfc894e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 19 Jul 2025 20:32:06 +0530 Subject: [PATCH 015/125] Completed the get expenses list API with optimized code --- Marco.Pms.Model/Utilities/ExpensesFilter.cs | 12 + .../Controllers/ExpenseController.cs | 322 ++++++++++++++++-- 2 files changed, 301 insertions(+), 33 deletions(-) create mode 100644 Marco.Pms.Model/Utilities/ExpensesFilter.cs diff --git a/Marco.Pms.Model/Utilities/ExpensesFilter.cs b/Marco.Pms.Model/Utilities/ExpensesFilter.cs new file mode 100644 index 0000000..7a0c397 --- /dev/null +++ b/Marco.Pms.Model/Utilities/ExpensesFilter.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.Utilities +{ + public class ExpensesFilter + { + public List? ProjectIds { get; set; } + public List? StatusIds { get; set; } + public List? CreatedByIds { get; set; } + public List? PaidById { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index ccde41d..23aae3f 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -12,6 +12,7 @@ using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using System.Text.Json; using Document = Marco.Pms.Model.DocumentManager.Document; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -48,7 +49,7 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("list")] - public async Task GetExpensesList() + public async Task GetExpensesList1(string? filter, int pageSize = 20, int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var loggedInEmployeeId = loggedInEmployee.Id; @@ -62,42 +63,78 @@ namespace Marco.Pms.Services.Controllers .Include(e => e.PaymentMode) .Include(e => e.Status) .Include(e => e.CreatedBy) - .Where(e => e.TenantId == tenantId); + .Where(e => e.TenantId == tenantId) + .OrderByDescending(e => e.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize); var HasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); var HasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); - if (HasViewAllPermission) + if (HasViewSelfPermission) { - expensesList = await expensesListQuery.ToListAsync(); + expensesListQuery = expensesListQuery.Where(e => e.CreatedById == loggedInEmployeeId); } - else if (HasViewSelfPermission) + else if (!HasViewAllPermission) { - expensesList = await expensesListQuery.Where(e => e.CreatedById == loggedInEmployeeId).ToListAsync(); - } - - if (expensesList == null) - { - _logger.LogInfo("No Expense found for employee {EmployeeId}", loggedInEmployeeId); + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expanses list.", loggedInEmployeeId); return Ok(ApiResponse.SuccessResponse(new List(), "No Expense found for current user", 200)); } - //ImageFilter? imageFilter = null; - //if (!string.IsNullOrWhiteSpace(filter)) - //{ - // try - // { - // var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; - // //string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; - // //imageFilter = JsonSerializer.Deserialize(unescapedJsonString, options); - // imageFilter = JsonSerializer.Deserialize(filter, options); - // } - // catch (Exception ex) - // { - // _logger.LogWarning("[GetImageList] Failed to parse filter: {Message}", ex.Message); - // } - //} + ExpensesFilter? expenesFilter = null; + if (!string.IsNullOrWhiteSpace(filter)) + { + try + { + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + expenesFilter = JsonSerializer.Deserialize(filter, options); + } + catch (Exception ex) + { + _logger.LogError(ex, "[GetExpensesList] Failed to parse filter came from website or mobile"); + try + { + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; + expenesFilter = JsonSerializer.Deserialize(unescapedJsonString, options); + } + catch (Exception ex1) + { + _logger.LogError(ex1, "[GetExpensesList] Failed to parse filter came from postman"); + } + } + } + + var projectIds = expenesFilter?.ProjectIds; + var filterStatusIds = expenesFilter?.StatusIds; + var createdByIds = expenesFilter?.CreatedByIds; + var paidById = expenesFilter?.PaidById; + var startDate = expenesFilter?.StartDate; + var endDate = expenesFilter?.EndDate; + + if (startDate != null && endDate != null) + { + expensesListQuery = expensesListQuery.Where(e => e.CreatedAt.Date >= startDate && e.CreatedAt.Date <= endDate); + } + else if (projectIds != null && projectIds.Any()) + { + expensesListQuery = expensesListQuery.Where(e => projectIds.Contains(e.ProjectId)); + } + else if (filterStatusIds != null && filterStatusIds.Any()) + { + expensesListQuery = expensesListQuery.Where(e => filterStatusIds.Contains(e.StatusId)); + } + else if (createdByIds != null && createdByIds.Any() && HasViewAllPermission) + { + expensesListQuery = expensesListQuery.Where(e => createdByIds.Contains(e.CreatedById)); + } + else if (paidById != null && paidById.Any()) + { + expensesListQuery = expensesListQuery.Where(e => paidById.Contains(e.PaidById)); + } + + expensesList = await expensesListQuery.ToListAsync(); var response = _mapper.Map>(expensesList); @@ -117,6 +154,225 @@ namespace Marco.Pms.Services.Controllers return StatusCode(200, ApiResponse.SuccessResponse(response, $"{response.Count} records of expenses for you fetched successfully", 200)); } + /// + /// Retrieves a paginated list of expenses based on user permissions and optional filters. + /// + /// A URL-encoded JSON string containing filter criteria. See . + /// The number of records to return per page. + /// The page number to retrieve. + /// A paginated list of expenses. + [HttpGet] // Assuming this is a GET endpoint + public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) + { + try + { + _logger.LogInfo( + "Attempting to fetch expenses list for PageNumber: {PageNumber}, PageSize: {PageSize} with Filter: {Filter}", + pageNumber, pageSize, filter ?? ""); + + // 1. --- Get User and Permissions --- + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + // This is an authentication/authorization issue. The user should be logged in. + _logger.LogWarning("Could not find an employee for the current logged-in user."); + return Unauthorized(ApiResponse.ErrorResponse("User not found or not authenticated.", 401)); + } + Guid loggedInEmployeeId = loggedInEmployee.Id; + + var hasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); + var hasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); + + // 2. --- Build Base Query and Apply Permissions --- + // Start with a base IQueryable. Filters will be chained onto this. + var expensesQuery = _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + + // Apply permission-based filtering BEFORE any other filters or pagination. + if (hasViewAllPermission) + { + // User has 'View All' permission, no initial restriction on who created the expense. + _logger.LogInfo("User {EmployeeId} has 'View All' permission.", loggedInEmployeeId); + } + else if (hasViewSelfPermission) + { + // User only has 'View Self' permission, so restrict the query to their own expenses. + _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); + } + else + { + // User has neither required permission. Deny access. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployeeId); + return Ok(ApiResponse.SuccessResponse(new List(), "You do not have permission to view any expenses.", 200)); + } + + // 3. --- Deserialize Filter and Apply --- + ExpensesFilter? expenseFilter = TryDeserializeFilter(filter); + + if (expenseFilter != null) + { + // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + { + expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + } + + if (expenseFilter.ProjectIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId)); + } + + if (expenseFilter.StatusIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.StatusIds.Contains(e.StatusId)); + } + + if (expenseFilter.PaidById?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.PaidById.Contains(e.PaidById)); + } + + // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. + if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermission) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); + } + } + + // 4. --- Apply Ordering and Pagination --- + // This should be the last step before executing the query. + var paginatedQuery = expensesQuery + .OrderByDescending(e => e.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize); + + // 5. --- Execute Query and Map Results --- + var expensesList = await paginatedQuery.ToListAsync(); + + if (!expensesList.Any()) + { + _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployeeId); + return Ok(ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200)); + } + + var response = _mapper.Map>(expensesList); + + // 6. --- Efficiently Fetch and Append 'Next Status' Information --- + var statusIds = expensesList.Select(e => e.StatusId).Distinct().ToList(); + + var statusMappings = await _context.ExpensesStatusMapping + .Include(sm => sm.NextStatus) + .Where(sm => statusIds.Contains(sm.StatusId)) + .ToListAsync(); + + // Use a Lookup for efficient O(1) mapping. This is much better than repeated `.Where()` in a loop. + var statusMapLookup = statusMappings.ToLookup(sm => sm.StatusId); + + foreach (var expense in response) + { + if (expense.Status?.Id != null && statusMapLookup.Contains(expense.Status.Id)) + { + expense.NextStatus = statusMapLookup[expense.Status.Id] + .Select(sm => _mapper.Map(sm.NextStatus)) + .ToList(); + } + else + { + expense.NextStatus = new List(); // Ensure it's never null + } + } + + // 7. --- Return Final Success Response --- + var message = $"{response.Count} expense records fetched successfully."; + _logger.LogInfo(message); + return StatusCode(200, ApiResponse.SuccessResponse(response, message, 200)); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while fetching list expenses"); + return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 400)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching list expenses"); + return BadRequest(ApiResponse.ErrorResponse("Error Occured", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 400)); + } + } + + /// + /// 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 ExpensesFilter? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + ExpensesFilter? 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; + } + [HttpGet("details/{id}")] public string Get(int id) { @@ -199,13 +455,13 @@ namespace Marco.Pms.Services.Controllers catch (Exception ex) { _logger.LogError(ex, "Error occured while saving image to S3"); - //return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new - //{ - // message = ex.Message, - // innerexcption = ex.InnerException?.Message, - // stackTrace = ex.StackTrace, - // source = ex.Source - //}, 400)); + return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new + { + message = ex.Message, + innerexcption = ex.InnerException?.Message, + stackTrace = ex.StackTrace, + source = ex.Source + }, 400)); } var document = new Document From 839bc360f3210710304d8032215b3a70c594d030 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 12:29:33 +0530 Subject: [PATCH 016/125] Added skeleton for action and update API. --- .../Dtos/Expenses/CreateExpensesDto.cs | 1 - .../Dtos/Expenses/ExpenseRecordDto.cs | 9 + .../Dtos/Expenses/UpdateExpensesDto.cs | 23 + .../Controllers/ExpenseController.cs | 715 +++++++++++------- .../MappingProfiles/MappingProfile.cs | 4 +- Marco.Pms.Services/Service/S3UploadService.cs | 1 + 6 files changed, 491 insertions(+), 262 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs create mode 100644 Marco.Pms.Model/Dtos/Expenses/UpdateExpensesDto.cs diff --git a/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs index d4e9b8d..53c8170 100644 --- a/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs +++ b/Marco.Pms.Model/Dtos/Expenses/CreateExpensesDto.cs @@ -16,7 +16,6 @@ namespace Marco.Pms.Model.Dtos.Expenses public required string SupplerName { get; set; } public required double Amount { get; set; } public int? NoOfPersons { get; set; } = 0; - public required Guid StatusId { get; set; } public bool PreApproved { get; set; } = false; public required List BillAttachments { get; set; } } diff --git a/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs new file mode 100644 index 0000000..ef18799 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Expenses +{ + public class ExpenseRecordDto + { + public Guid ExpenseId { get; set; } + public Guid StatusId { get; set; } + public string? Description { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/Expenses/UpdateExpensesDto.cs b/Marco.Pms.Model/Dtos/Expenses/UpdateExpensesDto.cs new file mode 100644 index 0000000..28c4faf --- /dev/null +++ b/Marco.Pms.Model/Dtos/Expenses/UpdateExpensesDto.cs @@ -0,0 +1,23 @@ +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Model.Dtos.Expenses +{ + public class UpdateExpensesDto + { + public required Guid Id { get; set; } + public required Guid ProjectId { get; set; } + public required Guid ExpensesTypeId { get; set; } + public required Guid PaymentModeId { get; set; } + public required Guid PaidById { get; set; } + public DateTime TransactionDate { get; set; } = DateTime.Now; + public string? TransactionId { get; set; } + public required string Description { get; set; } + public string? Location { get; set; } + public string? GSTNumber { get; set; } + public required string SupplerName { get; set; } + public required double Amount { get; set; } + public int? NoOfPersons { get; set; } = 0; + public bool PreApproved { get; set; } = false; + public List? BillAttachments { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 23aae3f..029b65e 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -6,6 +6,7 @@ using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Expanses; 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; @@ -15,7 +16,6 @@ using Microsoft.EntityFrameworkCore; using System.Text.Json; using Document = Marco.Pms.Model.DocumentManager.Document; -// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace Marco.Pms.Services.Controllers { @@ -24,135 +24,37 @@ namespace Marco.Pms.Services.Controllers [Authorize] public class ExpenseController : ControllerBase { + private readonly IDbContextFactory _dbContextFactory; private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; private readonly PermissionServices _permission; private readonly ILoggingService _logger; private readonly S3UploadService _s3Service; + private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IMapper _mapper; private readonly Guid tenantId; + private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); public ExpenseController( + IDbContextFactory dbContextFactory, ApplicationDbContext context, UserHelper userHelper, PermissionServices permission, + IServiceScopeFactory serviceScopeFactory, ILoggingService logger, S3UploadService s3Service, IMapper mapper) { + _dbContextFactory = dbContextFactory; _context = context; _userHelper = userHelper; _permission = permission; _logger = logger; + _serviceScopeFactory = serviceScopeFactory; _s3Service = s3Service; _mapper = mapper; tenantId = userHelper.GetTenantId(); } - [HttpGet("list")] - public async Task GetExpensesList1(string? filter, int pageSize = 20, int pageNumber = 1) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var loggedInEmployeeId = loggedInEmployee.Id; - - List? expensesList = null; - var expensesListQuery = _context.Expenses - .Include(e => e.ExpensesType) - .Include(e => e.Project) - .Include(e => e.PaidBy) - .ThenInclude(e => e!.JobRole) - .Include(e => e.PaymentMode) - .Include(e => e.Status) - .Include(e => e.CreatedBy) - .Where(e => e.TenantId == tenantId) - .OrderByDescending(e => e.CreatedAt) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize); - - var HasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); - var HasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); - - if (HasViewSelfPermission) - { - expensesListQuery = expensesListQuery.Where(e => e.CreatedById == loggedInEmployeeId); - } - else if (!HasViewAllPermission) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expanses list.", loggedInEmployeeId); - return Ok(ApiResponse.SuccessResponse(new List(), "No Expense found for current user", 200)); - } - - ExpensesFilter? expenesFilter = null; - if (!string.IsNullOrWhiteSpace(filter)) - { - try - { - var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; - expenesFilter = JsonSerializer.Deserialize(filter, options); - } - catch (Exception ex) - { - _logger.LogError(ex, "[GetExpensesList] Failed to parse filter came from website or mobile"); - - try - { - var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; - string unescapedJsonString = JsonSerializer.Deserialize(filter, options) ?? ""; - expenesFilter = JsonSerializer.Deserialize(unescapedJsonString, options); - } - catch (Exception ex1) - { - _logger.LogError(ex1, "[GetExpensesList] Failed to parse filter came from postman"); - } - } - } - - var projectIds = expenesFilter?.ProjectIds; - var filterStatusIds = expenesFilter?.StatusIds; - var createdByIds = expenesFilter?.CreatedByIds; - var paidById = expenesFilter?.PaidById; - var startDate = expenesFilter?.StartDate; - var endDate = expenesFilter?.EndDate; - - if (startDate != null && endDate != null) - { - expensesListQuery = expensesListQuery.Where(e => e.CreatedAt.Date >= startDate && e.CreatedAt.Date <= endDate); - } - else if (projectIds != null && projectIds.Any()) - { - expensesListQuery = expensesListQuery.Where(e => projectIds.Contains(e.ProjectId)); - } - else if (filterStatusIds != null && filterStatusIds.Any()) - { - expensesListQuery = expensesListQuery.Where(e => filterStatusIds.Contains(e.StatusId)); - } - else if (createdByIds != null && createdByIds.Any() && HasViewAllPermission) - { - expensesListQuery = expensesListQuery.Where(e => createdByIds.Contains(e.CreatedById)); - } - else if (paidById != null && paidById.Any()) - { - expensesListQuery = expensesListQuery.Where(e => paidById.Contains(e.PaidById)); - } - - expensesList = await expensesListQuery.ToListAsync(); - - var response = _mapper.Map>(expensesList); - - var statusIds = expensesList.Select(e => e.StatusId).ToList(); - - var statusMappings = await _context.ExpensesStatusMapping - .Include(sm => sm.NextStatus) - .Where(sm => statusIds.Contains(sm.StatusId)) - .ToListAsync(); - - foreach (var expense in response) - { - var statusMapping = statusMappings.Where(sm => sm.StatusId == expense.Status?.Id).Select(sm => _mapper.Map(sm.NextStatus)).ToList(); - expense.NextStatus = statusMapping; - - } - return StatusCode(200, ApiResponse.SuccessResponse(response, $"{response.Count} records of expenses for you fetched successfully", 200)); - } /// /// Retrieves a paginated list of expenses based on user permissions and optional filters. @@ -161,7 +63,7 @@ namespace Marco.Pms.Services.Controllers /// The number of records to return per page. /// The page number to retrieve. /// A paginated list of expenses. - [HttpGet] // Assuming this is a GET endpoint + [HttpGet("list")] // Assuming this is a GET endpoint public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) { try @@ -180,8 +82,21 @@ namespace Marco.Pms.Services.Controllers } Guid loggedInEmployeeId = loggedInEmployee.Id; - var hasViewAllPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); - var hasViewSelfPermission = await _permission.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); + var hasViewSelfPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); + }); + + var hasViewAllPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); + }); + + await Task.WhenAll(hasViewSelfPermissionTask, hasViewAllPermissionTask); // 2. --- Build Base Query and Apply Permissions --- // Start with a base IQueryable. Filters will be chained onto this. @@ -196,12 +111,12 @@ namespace Marco.Pms.Services.Controllers .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. // Apply permission-based filtering BEFORE any other filters or pagination. - if (hasViewAllPermission) + if (hasViewAllPermissionTask.Result) { // User has 'View All' permission, no initial restriction on who created the expense. _logger.LogInfo("User {EmployeeId} has 'View All' permission.", loggedInEmployeeId); } - else if (hasViewSelfPermission) + else if (hasViewSelfPermissionTask.Result) { // User only has 'View Self' permission, so restrict the query to their own expenses. _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); @@ -241,7 +156,7 @@ namespace Marco.Pms.Services.Controllers } // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. - if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermission) + if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermissionTask.Result) { expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); } @@ -329,6 +244,433 @@ namespace Marco.Pms.Services.Controllers } } + [HttpGet("details/{id}")] + public string Get(int id) + { + return "value"; + } + + [HttpPost("create")] + public async Task CreateExpense1([FromBody] CreateExpensesDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var hasUploadPermission = await _permission.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); + var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, dto.ProjectId); + if (!hasUploadPermission || !hasProjectPermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for uploading expense on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403)); + } + var isExpensesTypeExist = await _context.ExpensesTypeMaster.AnyAsync(et => et.Id == dto.ExpensesTypeId); + if (!isExpensesTypeExist) + { + _logger.LogWarning("Expenses type not for ID: {ExpensesTypeId} when creating new expense", dto.ExpensesTypeId); + return NotFound(ApiResponse.ErrorResponse("Expanses Type not found", "Expanses Type not found", 404)); + } + var isPaymentModeExist = await _context.PaymentModeMatser.AnyAsync(et => et.Id == dto.PaymentModeId); + if (!isPaymentModeExist) + { + _logger.LogWarning("Payment Mode not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); + return NotFound(ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404)); + } + var isStatusExist = await _context.ExpensesStatusMaster.AnyAsync(et => et.Id == Draft); + if (!isStatusExist) + { + _logger.LogWarning("Status not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); + return NotFound(ApiResponse.ErrorResponse("Status not found", "Status not found", 404)); + } + + var expense = _mapper.Map(dto); + + expense.CreatedById = loggedInEmployee.Id; + expense.CreatedAt = DateTime.UtcNow; + expense.TenantId = tenantId; + expense.IsActive = true; + expense.StatusId = Draft; + + _context.Expenses.Add(expense); + + Guid batchId = Guid.NewGuid(); + foreach (var attachment in dto.BillAttachments) + { + if (!_s3Service.IsBase64String(attachment.Base64Data)) + { + _logger.LogWarning("Image upload failed: Base64 data is missing While creating new expense entity for project {ProjectId} by employee {EmployeeId}", expense.ProjectId, expense.PaidById); + return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); + } + var base64 = attachment.Base64Data!.Contains(',') + ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] + : attachment.Base64Data; + + var fileType = _s3Service.GetContentTypeFromBase64(base64); + var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); + var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; + try + { + await _s3Service.UploadFileAsync(base64, fileType, objectKey); + _logger.LogInfo("Image uploaded to S3 with key: {ObjectKey}", objectKey); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while saving image to S3"); + return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new + { + message = ex.Message, + innerexcption = ex.InnerException?.Message, + stackTrace = ex.StackTrace, + source = ex.Source + }, 400)); + } + + var document = new Document + { + BatchId = batchId, + UploadedById = loggedInEmployee.Id, + FileName = attachment.FileName ?? "", + ContentType = attachment.ContentType ?? "", + S3Key = objectKey, + FileSize = attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + _context.Documents.Add(document); + + var billAttachement = new BillAttachments + { + DocumentId = document.Id, + ExpensesId = expense.Id, + TenantId = tenantId + }; + _context.BillAttachments.Add(billAttachement); + } + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Error occured while saving Expense, Document and bill attachment entity"); + return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 400)); + } + _logger.LogInfo("Documents and attachments saved for Expense: {ExpenseId}", expense.Id); + + return StatusCode(201, ApiResponse.SuccessResponse(expense, "Expense created Successfully", 201)); + } + + /// + /// Creates a new expense entry along with its bill attachments. + /// This operation is transactional and performs validations and file uploads in parallel for optimal performance. + /// Permission checks are also run in parallel using IServiceScopeFactory to ensure thread safety. + /// + /// The data transfer object containing expense details and attachments. + /// An IActionResult indicating the result of the creation operation. + [HttpPost] + public async Task CreateExpense([FromBody] CreateExpensesDto dto) + { + _logger.LogDebug("CreateExpense for Project {ProjectId}", dto.ProjectId); + // The entire operation is wrapped in a transaction to ensure data consistency. + await using var transaction = await _context.Database.BeginTransactionAsync(); + + try + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // 1. Authorization: Run permission checks in parallel using a service scope for each task. + // This is crucial for thread-safety as IPermissionService is a scoped service. + var hasUploadPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); + }); + + var hasProjectPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasProjectPermission(loggedInEmployee, dto.ProjectId); + }); + + await Task.WhenAll(hasUploadPermissionTask, hasProjectPermissionTask); + + if (!hasUploadPermissionTask.Result || !hasProjectPermissionTask.Result) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload expenses for this project.", 403)); + } + + + // 2. Validation: Check if prerequisite entities exist. + // The method now returns a tuple indicating success or failure. + // Each task creates its own DbContext instance from the factory, making the parallel calls thread-safe. + var projectGetTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.FirstOrDefaultAsync(p => p.Id == dto.ProjectId); + }); + + var expenseTypeGetTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.FirstOrDefaultAsync(et => et.Id == dto.ExpensesTypeId); + }); + + var paymentModeGetTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.FirstOrDefaultAsync(pm => pm.Id == dto.PaymentModeId); + }); + + var statusGetTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster.FirstOrDefaultAsync(es => es.Id == Draft); + }); + + await Task.WhenAll(projectGetTask, expenseTypeGetTask, paymentModeGetTask, statusGetTask); + + var project = await projectGetTask; + var expenseType = await expenseTypeGetTask; + var paymentMode = await paymentModeGetTask; + var status = await statusGetTask; + + if (project == null) + { + await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. + _logger.LogWarning("Expense creation failed due to validation: Project with ID {ProjectId} not found.", dto.ProjectId); + return NotFound(ApiResponse.ErrorResponse("Project not found.", "Project not found.", 404)); + } + else if (expenseType == null) + { + await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. + _logger.LogWarning("Expense creation failed due to validation: Expense Type with ID {ExpensesTypeId} not found.", dto.ExpensesTypeId); + return NotFound(ApiResponse.ErrorResponse("Expense Type not found.", "Expense Type not found.", 404)); + } + else if (paymentMode == null) + { + await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. + _logger.LogWarning("Expense creation failed due to validation: Payment Mode with ID {PaymentModeId} not found.", dto.PaymentModeId); + return NotFound(ApiResponse.ErrorResponse("Payment Mode not found.", "Payment Mode not found.", 404)); + } + else if (status == null) + { + await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. + _logger.LogWarning("Expense creation failed due to validation: Status with ID {StatusId} not found.", Draft); + return NotFound(ApiResponse.ErrorResponse("Status not found.", "Status not found.", 404)); + } + + // 3. Entity Creation + var expense = _mapper.Map(dto); + expense.CreatedById = loggedInEmployee.Id; + expense.CreatedAt = DateTime.UtcNow; + expense.TenantId = tenantId; + expense.IsActive = true; + expense.StatusId = Draft; + + _context.Expenses.Add(expense); + + // 4. Process Attachments + if (dto.BillAttachments?.Any() ?? false) + { + await ProcessAndUploadAttachmentsAsync(dto.BillAttachments, expense, loggedInEmployee.Id, tenantId); + } + + // 5. Database Commit + await _context.SaveChangesAsync(); + + + // 6. Transaction Commit + await transaction.CommitAsync(); + + var response = _mapper.Map(expense); + + response.Project = _mapper.Map(project); + response.Status = _mapper.Map(status); + response.PaymentMode = _mapper.Map(paymentMode); + response.ExpensesType = _mapper.Map(expenseType); + + _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); + return StatusCode(201, ApiResponse.SuccessResponse(response, "Expense created successfully.", 201)); + } + catch (ArgumentException ex) // For invalid Base64 or other bad arguments. + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Invalid argument provided during expense creation for project {ProjectId}.", dto.ProjectId); + return BadRequest(ApiResponse.ErrorResponse("Invalid Request Data", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 400)); + } + catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 failure). + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); + return StatusCode(500, ApiResponse.ErrorResponse("An internal server error occurred.", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500)); + } + } + + /// + /// Processes and uploads attachments in parallel, then adds the resulting entities to the main DbContext. + /// + private async Task ProcessAndUploadAttachmentsAsync(IEnumerable attachments, Expenses expense, Guid employeeId, Guid tenantId) + { + var batchId = Guid.NewGuid(); + + var processingTasks = attachments.Select(attachment => Task.Run(async () => + { + if (string.IsNullOrWhiteSpace(attachment.Base64Data) || !_s3Service.IsBase64String(attachment.Base64Data)) + throw new ArgumentException("Invalid or missing Base64 data for an attachment."); + + var base64Data = attachment.Base64Data!.Contains(',') ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] : attachment.Base64Data; + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); + var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; + + // Upload and create entities + await _s3Service.UploadFileAsync(base64Data, fileType, objectKey); + _logger.LogInfo("Uploaded file to S3 with key: {ObjectKey}", objectKey); + + return CreateAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); + })).ToList(); + + var results = await Task.WhenAll(processingTasks); + + // This part is thread-safe as it runs after all parallel tasks are complete. + foreach (var (document, billAttachment) in results) + { + _context.Documents.Add(document); + _context.BillAttachments.Add(billAttachment); + } + _logger.LogInfo("{AttachmentCount} attachments processed and staged for saving.", results.Length); + } + + /// + /// A private static helper method to create Document and BillAttachment entities. + /// + private static (Document document, BillAttachments billAttachment) CreateAttachmentEntities( + Guid batchId, Guid expenseId, Guid uploadedById, Guid tenantId, string s3Key, FileUploadModel attachmentDto) + { + var document = new Document + { + BatchId = batchId, + UploadedById = uploadedById, + FileName = attachmentDto.FileName ?? "", + ContentType = attachmentDto.ContentType ?? "", + S3Key = s3Key, + FileSize = attachmentDto.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + var billAttachment = new BillAttachments { Document = document, ExpensesId = expenseId, TenantId = tenantId }; + return (document, billAttachment); + } + + [HttpPost("action")] + public async Task ChangeStatus([FromBody] ExpenseRecordDto model) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var exsitingExpenses = await _context.Expenses + .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.TenantId == tenantId); + + if (exsitingExpenses == null) + { + return NotFound(ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404)); + } + + exsitingExpenses.StatusId = model.StatusId; + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException dbEx) + { + // --- Step 3: Handle Concurrency Conflicts --- + // This happens if another user modified the project after we fetched it. + _logger.LogError(dbEx, "Error occured while update status of expanse."); + return StatusCode(500, ApiResponse.ErrorResponse("Error occured while update status of expanse.", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500)); + } + var response = _mapper.Map(exsitingExpenses); + return Ok(ApiResponse.SuccessResponse(response)); + } + + [HttpPut("edit/{id}")] + public async Task UpdateExpanse(Guid id, [FromBody] UpdateExpensesDto model) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var exsitingExpense = await _context.Expenses.FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); + + + if (exsitingExpense == null) + { + return NotFound(ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404)); + } + _mapper.Map(model, exsitingExpense); + _context.Entry(exsitingExpense).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("Successfully updated project {ProjectId} by user {UserId}.", id, loggedInEmployee.Id); + } + catch (DbUpdateConcurrencyException ex) + { + // --- Step 3: Handle Concurrency Conflicts --- + // This happens if another user modified the project after we fetched it. + _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); + return StatusCode(409, ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409)); + } + var response = _mapper.Map(exsitingExpense); + return Ok(ApiResponse.SuccessResponse(response)); + } + + [HttpDelete("delete/{id}")] + public void Delete(int id) + { + } + #region =================================================================== Helper Functions =================================================================== + /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). /// @@ -373,153 +715,6 @@ namespace Marco.Pms.Services.Controllers return expenseFilter; } - [HttpGet("details/{id}")] - public string Get(int id) - { - return "value"; - } - - [HttpPost("create")] - public async Task Post([FromBody] CreateExpensesDto dto) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var hasUploadPermission = await _permission.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, dto.ProjectId); - if (!hasUploadPermission || !hasProjectPermission) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} for uploading expense on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403)); - } - var isExpensesTypeExist = await _context.ExpensesTypeMaster.AnyAsync(et => et.Id == dto.ExpensesTypeId); - if (!isExpensesTypeExist) - { - _logger.LogWarning("Expenses type not for ID: {ExpensesTypeId} when creating new expense", dto.ExpensesTypeId); - return NotFound(ApiResponse.ErrorResponse("Expanses Type not found", "Expanses Type not found", 404)); - } - var isPaymentModeExist = await _context.PaymentModeMatser.AnyAsync(et => et.Id == dto.PaymentModeId); - if (!isPaymentModeExist) - { - _logger.LogWarning("Payment Mode not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); - return NotFound(ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404)); - } - var isStatusExist = await _context.ExpensesStatusMaster.AnyAsync(et => et.Id == dto.StatusId); - if (!isStatusExist) - { - _logger.LogWarning("Status not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); - return NotFound(ApiResponse.ErrorResponse("Status not found", "Status not found", 404)); - } - var expense = new Expenses - { - ProjectId = dto.ProjectId, - ExpensesTypeId = dto.ExpensesTypeId, - PaymentModeId = dto.PaymentModeId, - PaidById = dto.PaidById, - CreatedById = loggedInEmployee.Id, - TransactionDate = dto.TransactionDate, - CreatedAt = DateTime.UtcNow, - TransactionId = dto.TransactionId, - Description = dto.Description, - Location = dto.Location, - GSTNumber = dto.GSTNumber, - SupplerName = dto.SupplerName, - Amount = dto.Amount, - NoOfPersons = dto.NoOfPersons, - StatusId = dto.StatusId, - PreApproved = dto.PreApproved, - IsActive = true, - TenantId = tenantId - }; - _context.Expenses.Add(expense); - - - Guid batchId = Guid.NewGuid(); - foreach (var attachment in dto.BillAttachments) - { - //if (!_s3Service.IsBase64String(attachment.Base64Data)) - //{ - // _logger.LogWarning("Image upload failed: Base64 data is missing While creating new expense entity for project {ProjectId} by employee {EmployeeId}", expense.ProjectId, expense.PaidById); - // return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); - //} - var base64 = attachment.Base64Data!.Contains(',') - ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] - : attachment.Base64Data; - - var fileType = _s3Service.GetContentTypeFromBase64(base64); - var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); - var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; - try - { - await _s3Service.UploadFileAsync(base64, fileType, objectKey); - _logger.LogInfo("Image uploaded to S3 with key: {ObjectKey}", objectKey); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occured while saving image to S3"); - return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new - { - message = ex.Message, - innerexcption = ex.InnerException?.Message, - stackTrace = ex.StackTrace, - source = ex.Source - }, 400)); - } - - var document = new Document - { - BatchId = batchId, - UploadedById = loggedInEmployee.Id, - FileName = attachment.FileName ?? "", - ContentType = attachment.ContentType ?? "", - S3Key = objectKey, - //Base64Data = attachment.Base64Data, - FileSize = attachment.FileSize, - UploadedAt = DateTime.UtcNow, - TenantId = tenantId - }; - _context.Documents.Add(document); - - var billAttachement = new BillAttachments - { - DocumentId = document.Id, - ExpensesId = expense.Id, - TenantId = tenantId - }; - _context.BillAttachments.Add(billAttachement); - } - try - { - await _context.SaveChangesAsync(); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Error occured while saving Expense, Document and bill attachment entity"); - return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - innerexcption = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 400)); - } - _logger.LogInfo("Documents and attachments saved for Expense: {ExpenseId}", expense.Id); - - return StatusCode(201, ApiResponse.SuccessResponse(expense, "Expense created Successfully", 201)); - } - - - [HttpPut("edit/{id}")] - public void Put(int id, [FromBody] string value) - { - } - - [HttpDelete("delete/{id}")] - public void Delete(int id) - { - } + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index fad5b78..ea34613 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; @@ -76,7 +77,8 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Expenses ======================================================= CreateMap(); - + CreateMap(); + CreateMap(); #endregion diff --git a/Marco.Pms.Services/Service/S3UploadService.cs b/Marco.Pms.Services/Service/S3UploadService.cs index 1d98a33..b07093c 100644 --- a/Marco.Pms.Services/Service/S3UploadService.cs +++ b/Marco.Pms.Services/Service/S3UploadService.cs @@ -41,6 +41,7 @@ namespace Marco.Pms.Services.Service if (allowedFilesType == null || !allowedFilesType.Contains(fileType)) { + _logger.LogWarning("Unsupported file type. {FileType}", fileType); throw new InvalidOperationException("Unsupported file type."); } From 282d33d8b261a4c9bf03af880f08fef9c57129ca Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 13:05:04 +0530 Subject: [PATCH 017/125] Optimized and enchance the created expense API --- .../Controllers/ExpenseController.cs | 387 +++++++----------- 1 file changed, 139 insertions(+), 248 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 029b65e..4501c61 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -27,7 +27,6 @@ namespace Marco.Pms.Services.Controllers private readonly IDbContextFactory _dbContextFactory; private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; - private readonly PermissionServices _permission; private readonly ILoggingService _logger; private readonly S3UploadService _s3Service; private readonly IServiceScopeFactory _serviceScopeFactory; @@ -38,7 +37,6 @@ namespace Marco.Pms.Services.Controllers IDbContextFactory dbContextFactory, ApplicationDbContext context, UserHelper userHelper, - PermissionServices permission, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, S3UploadService s3Service, @@ -47,7 +45,6 @@ namespace Marco.Pms.Services.Controllers _dbContextFactory = dbContextFactory; _context = context; _userHelper = userHelper; - _permission = permission; _logger = logger; _serviceScopeFactory = serviceScopeFactory; _s3Service = s3Service; @@ -63,7 +60,8 @@ namespace Marco.Pms.Services.Controllers /// The number of records to return per page. /// The page number to retrieve. /// A paginated list of expenses. - [HttpGet("list")] // Assuming this is a GET endpoint + + [HttpGet("list")] public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) { try @@ -250,135 +248,18 @@ namespace Marco.Pms.Services.Controllers return "value"; } - [HttpPost("create")] - public async Task CreateExpense1([FromBody] CreateExpensesDto dto) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var hasUploadPermission = await _permission.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, dto.ProjectId); - if (!hasUploadPermission || !hasProjectPermission) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} for uploading expense on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403)); - } - var isExpensesTypeExist = await _context.ExpensesTypeMaster.AnyAsync(et => et.Id == dto.ExpensesTypeId); - if (!isExpensesTypeExist) - { - _logger.LogWarning("Expenses type not for ID: {ExpensesTypeId} when creating new expense", dto.ExpensesTypeId); - return NotFound(ApiResponse.ErrorResponse("Expanses Type not found", "Expanses Type not found", 404)); - } - var isPaymentModeExist = await _context.PaymentModeMatser.AnyAsync(et => et.Id == dto.PaymentModeId); - if (!isPaymentModeExist) - { - _logger.LogWarning("Payment Mode not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); - return NotFound(ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404)); - } - var isStatusExist = await _context.ExpensesStatusMaster.AnyAsync(et => et.Id == Draft); - if (!isStatusExist) - { - _logger.LogWarning("Status not for ID: {PaymentModeId} when creating new expense", dto.PaymentModeId); - return NotFound(ApiResponse.ErrorResponse("Status not found", "Status not found", 404)); - } - - var expense = _mapper.Map(dto); - - expense.CreatedById = loggedInEmployee.Id; - expense.CreatedAt = DateTime.UtcNow; - expense.TenantId = tenantId; - expense.IsActive = true; - expense.StatusId = Draft; - - _context.Expenses.Add(expense); - - Guid batchId = Guid.NewGuid(); - foreach (var attachment in dto.BillAttachments) - { - if (!_s3Service.IsBase64String(attachment.Base64Data)) - { - _logger.LogWarning("Image upload failed: Base64 data is missing While creating new expense entity for project {ProjectId} by employee {EmployeeId}", expense.ProjectId, expense.PaidById); - return BadRequest(ApiResponse.ErrorResponse("Base64 data is missing", "Base64 data is missing", 400)); - } - var base64 = attachment.Base64Data!.Contains(',') - ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] - : attachment.Base64Data; - - var fileType = _s3Service.GetContentTypeFromBase64(base64); - var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); - var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; - try - { - await _s3Service.UploadFileAsync(base64, fileType, objectKey); - _logger.LogInfo("Image uploaded to S3 with key: {ObjectKey}", objectKey); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occured while saving image to S3"); - return BadRequest(ApiResponse.ErrorResponse("Cannot upload attachment to S3", new - { - message = ex.Message, - innerexcption = ex.InnerException?.Message, - stackTrace = ex.StackTrace, - source = ex.Source - }, 400)); - } - - var document = new Document - { - BatchId = batchId, - UploadedById = loggedInEmployee.Id, - FileName = attachment.FileName ?? "", - ContentType = attachment.ContentType ?? "", - S3Key = objectKey, - FileSize = attachment.FileSize, - UploadedAt = DateTime.UtcNow, - TenantId = tenantId - }; - _context.Documents.Add(document); - - var billAttachement = new BillAttachments - { - DocumentId = document.Id, - ExpensesId = expense.Id, - TenantId = tenantId - }; - _context.BillAttachments.Add(billAttachement); - } - try - { - await _context.SaveChangesAsync(); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Error occured while saving Expense, Document and bill attachment entity"); - return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - innerexcption = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 400)); - } - _logger.LogInfo("Documents and attachments saved for Expense: {ExpenseId}", expense.Id); - - return StatusCode(201, ApiResponse.SuccessResponse(expense, "Expense created Successfully", 201)); - } - /// /// Creates a new expense entry along with its bill attachments. - /// This operation is transactional and performs validations and file uploads in parallel for optimal performance. - /// Permission checks are also run in parallel using IServiceScopeFactory to ensure thread safety. + /// This operation is transactional and performs validations and file uploads concurrently for optimal performance + /// by leveraging async/await without unnecessary thread-pool switching via Task.Run. /// /// The data transfer object containing expense details and attachments. /// An IActionResult indicating the result of the creation operation. - [HttpPost] + + [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto dto) { - _logger.LogDebug("CreateExpense for Project {ProjectId}", dto.ProjectId); + _logger.LogDebug("Starting CreateExpense for Project {ProjectId}", dto.ProjectId); // The entire operation is wrapped in a transaction to ensure data consistency. await using var transaction = await _context.Database.BeginTransactionAsync(); @@ -386,9 +267,10 @@ namespace Marco.Pms.Services.Controllers { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - // 1. Authorization: Run permission checks in parallel using a service scope for each task. - // This is crucial for thread-safety as IPermissionService is a scoped service. - var hasUploadPermissionTask = Task.Run(async () => + // 1. Authorization & Validation: Run all I/O-bound checks concurrently using factories for safety. + + // PERMISSION CHECKS: Use IServiceScopeFactory for thread-safe access to scoped services. + var hasUploadPermissionTask = Task.Run(async () => // Task.Run is acceptable here to create a new scope, but let's do it cleaner. { using var scope = _serviceScopeFactory.CreateScope(); var permissionService = scope.ServiceProvider.GetRequiredService(); @@ -402,72 +284,66 @@ namespace Marco.Pms.Services.Controllers return await permissionService.HasProjectPermission(loggedInEmployee, dto.ProjectId); }); - await Task.WhenAll(hasUploadPermissionTask, hasProjectPermissionTask); + // VALIDATION CHECKS: Use IDbContextFactory for thread-safe, parallel database queries. + // Each task gets its own DbContext instance. + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == dto.ProjectId); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == dto.ExpensesTypeId); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == dto.PaymentModeId); + }); + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster.AsNoTracking().FirstOrDefaultAsync(es => es.Id == Draft); + }); - if (!hasUploadPermissionTask.Result || !hasProjectPermissionTask.Result) + + // Await all prerequisite checks at once. + await Task.WhenAll( + hasUploadPermissionTask, hasProjectPermissionTask, + projectTask, expenseTypeTask, paymentModeTask, statusTask + ); + + // Await all prerequisite checks at once. + await Task.WhenAll( + hasUploadPermissionTask, hasProjectPermissionTask, + projectTask, expenseTypeTask, paymentModeTask, statusTask + ); + + // 2. Aggregate and Check Results + if (!await hasUploadPermissionTask || !await hasProjectPermissionTask) { _logger.LogWarning("Access DENIED for employee {EmployeeId} on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload expenses for this project.", 403)); } + var validationErrors = new List(); + var project = await projectTask; + var expenseType = await expenseTypeTask; + var paymentMode = await paymentModeTask; + var status = await statusTask; - // 2. Validation: Check if prerequisite entities exist. - // The method now returns a tuple indicating success or failure. - // Each task creates its own DbContext instance from the factory, making the parallel calls thread-safe. - var projectGetTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.FirstOrDefaultAsync(p => p.Id == dto.ProjectId); - }); + if (project == null) validationErrors.Add("Project not found."); + if (expenseType == null) validationErrors.Add("Expense Type not found."); + if (paymentMode == null) validationErrors.Add("Payment Mode not found."); + if (status == null) validationErrors.Add("Default status 'Draft' not found."); - var expenseTypeGetTask = Task.Run(async () => + if (validationErrors.Any()) { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.FirstOrDefaultAsync(et => et.Id == dto.ExpensesTypeId); - }); - - var paymentModeGetTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.FirstOrDefaultAsync(pm => pm.Id == dto.PaymentModeId); - }); - - var statusGetTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMaster.FirstOrDefaultAsync(es => es.Id == Draft); - }); - - await Task.WhenAll(projectGetTask, expenseTypeGetTask, paymentModeGetTask, statusGetTask); - - var project = await projectGetTask; - var expenseType = await expenseTypeGetTask; - var paymentMode = await paymentModeGetTask; - var status = await statusGetTask; - - if (project == null) - { - await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. - _logger.LogWarning("Expense creation failed due to validation: Project with ID {ProjectId} not found.", dto.ProjectId); - return NotFound(ApiResponse.ErrorResponse("Project not found.", "Project not found.", 404)); - } - else if (expenseType == null) - { - await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. - _logger.LogWarning("Expense creation failed due to validation: Expense Type with ID {ExpensesTypeId} not found.", dto.ExpensesTypeId); - return NotFound(ApiResponse.ErrorResponse("Expense Type not found.", "Expense Type not found.", 404)); - } - else if (paymentMode == null) - { - await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. - _logger.LogWarning("Expense creation failed due to validation: Payment Mode with ID {PaymentModeId} not found.", dto.PaymentModeId); - return NotFound(ApiResponse.ErrorResponse("Payment Mode not found.", "Payment Mode not found.", 404)); - } - else if (status == null) - { - await transaction.RollbackAsync(); // Ensure transaction is terminated before returning. - _logger.LogWarning("Expense creation failed due to validation: Status with ID {StatusId} not found.", Draft); - return NotFound(ApiResponse.ErrorResponse("Status not found.", "Status not found.", 404)); + await transaction.RollbackAsync(); + var errorMessage = string.Join(" ", validationErrors); + _logger.LogWarning("Expense creation failed due to validation errors: {ValidationErrors}", errorMessage); + return BadRequest(ApiResponse.ErrorResponse("Invalid input data.", errorMessage, 400)); } // 3. Entity Creation @@ -489,12 +365,10 @@ namespace Marco.Pms.Services.Controllers // 5. Database Commit await _context.SaveChangesAsync(); - // 6. Transaction Commit await transaction.CommitAsync(); var response = _mapper.Map(expense); - response.Project = _mapper.Map(project); response.Status = _mapper.Map(status); response.PaymentMode = _mapper.Map(paymentMode); @@ -503,11 +377,11 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); return StatusCode(201, ApiResponse.SuccessResponse(response, "Expense created successfully.", 201)); } - catch (ArgumentException ex) // For invalid Base64 or other bad arguments. + catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation { await transaction.RollbackAsync(); - _logger.LogError(ex, "Invalid argument provided during expense creation for project {ProjectId}.", dto.ProjectId); - return BadRequest(ApiResponse.ErrorResponse("Invalid Request Data", new + _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); + return BadRequest(ApiResponse.ErrorResponse("Invalid Request Data.", new { Message = ex.Message, StackTrace = ex.StackTrace, @@ -520,7 +394,7 @@ namespace Marco.Pms.Services.Controllers } }, 400)); } - catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 failure). + catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { await transaction.RollbackAsync(); _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); @@ -539,62 +413,6 @@ namespace Marco.Pms.Services.Controllers } } - /// - /// Processes and uploads attachments in parallel, then adds the resulting entities to the main DbContext. - /// - private async Task ProcessAndUploadAttachmentsAsync(IEnumerable attachments, Expenses expense, Guid employeeId, Guid tenantId) - { - var batchId = Guid.NewGuid(); - - var processingTasks = attachments.Select(attachment => Task.Run(async () => - { - if (string.IsNullOrWhiteSpace(attachment.Base64Data) || !_s3Service.IsBase64String(attachment.Base64Data)) - throw new ArgumentException("Invalid or missing Base64 data for an attachment."); - - var base64Data = attachment.Base64Data!.Contains(',') ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] : attachment.Base64Data; - var fileType = _s3Service.GetContentTypeFromBase64(base64Data); - var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); - var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; - - // Upload and create entities - await _s3Service.UploadFileAsync(base64Data, fileType, objectKey); - _logger.LogInfo("Uploaded file to S3 with key: {ObjectKey}", objectKey); - - return CreateAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); - })).ToList(); - - var results = await Task.WhenAll(processingTasks); - - // This part is thread-safe as it runs after all parallel tasks are complete. - foreach (var (document, billAttachment) in results) - { - _context.Documents.Add(document); - _context.BillAttachments.Add(billAttachment); - } - _logger.LogInfo("{AttachmentCount} attachments processed and staged for saving.", results.Length); - } - - /// - /// A private static helper method to create Document and BillAttachment entities. - /// - private static (Document document, BillAttachments billAttachment) CreateAttachmentEntities( - Guid batchId, Guid expenseId, Guid uploadedById, Guid tenantId, string s3Key, FileUploadModel attachmentDto) - { - var document = new Document - { - BatchId = batchId, - UploadedById = uploadedById, - FileName = attachmentDto.FileName ?? "", - ContentType = attachmentDto.ContentType ?? "", - S3Key = s3Key, - FileSize = attachmentDto.FileSize, - UploadedAt = DateTime.UtcNow, - TenantId = tenantId - }; - var billAttachment = new BillAttachments { Document = document, ExpensesId = expenseId, TenantId = tenantId }; - return (document, billAttachment); - } - [HttpPost("action")] public async Task ChangeStatus([FromBody] ExpenseRecordDto model) { @@ -715,6 +533,79 @@ namespace Marco.Pms.Services.Controllers return expenseFilter; } + /// + /// Processes and uploads attachments concurrently, then adds the resulting entities to the main DbContext. + /// + private async Task ProcessAndUploadAttachmentsAsync(IEnumerable attachments, Expenses expense, Guid employeeId, Guid tenantId) + { + // Pre-validate all attachments to fail fast before any uploads. + foreach (var attachment in attachments) + { + if (string.IsNullOrWhiteSpace(attachment.Base64Data) || !_s3Service.IsBase64String(attachment.Base64Data)) + { + throw new ArgumentException($"Invalid or missing Base64 data for attachment: {attachment.FileName ?? "N/A"}"); + } + } + + var batchId = Guid.NewGuid(); + + // Create a list of tasks to be executed concurrently. + var processingTasks = attachments.Select(attachment => + ProcessSingleAttachmentAsync(attachment, expense, employeeId, tenantId, batchId) + ).ToList(); + + var results = await Task.WhenAll(processingTasks); + + // This part is thread-safe as it runs after all concurrent tasks are complete. + foreach (var (document, billAttachment) in results) + { + _context.Documents.Add(document); + _context.BillAttachments.Add(billAttachment); + } + _logger.LogInfo("{AttachmentCount} attachments processed and staged for saving.", results.Length); + } + + /// + /// Handles the logic for a single attachment: upload to S3 and create corresponding entities. + /// + private async Task<(Document document, BillAttachments billAttachment)> ProcessSingleAttachmentAsync( + FileUploadModel attachment, Expenses expense, Guid employeeId, Guid tenantId, Guid batchId) + { + var base64Data = attachment.Base64Data!.Contains(',') ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] : attachment.Base64Data; + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); + var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; + + // Await the I/O-bound upload operation directly. + await _s3Service.UploadFileAsync(base64Data, fileType, objectKey); + _logger.LogInfo("Uploaded file to S3 with key: {ObjectKey}", objectKey); + + return CreateAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); + } + + + /// + /// A private static helper method to create Document and BillAttachment entities. + /// This remains unchanged as it's a pure data-shaping method. + /// + private static (Document document, BillAttachments billAttachment) CreateAttachmentEntities( + Guid batchId, Guid expenseId, Guid uploadedById, Guid tenantId, string s3Key, FileUploadModel attachmentDto) + { + var document = new Document + { + BatchId = batchId, + UploadedById = uploadedById, + FileName = attachmentDto.FileName ?? "", + ContentType = attachmentDto.ContentType ?? "", + S3Key = s3Key, + FileSize = attachmentDto.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + var billAttachment = new BillAttachments { Document = document, ExpensesId = expenseId, TenantId = tenantId }; + return (document, billAttachment); + } + #endregion } } From f9213b6040b6980b30729ce91a2763f6d0d57bc7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 18:21:51 +0530 Subject: [PATCH 018/125] Completely optimmized the Action API --- Marco.Pms.CacheHelper/UpdateLogHelper.cs | 12 +- .../Data/ApplicationDbContext.cs | 64 +- ...19074035_Expenses_tables_Added.Designer.cs | 4180 ---------------- ...edBy_And_CareatedAt_In_Expense.Designer.cs | 4196 ---------------- ...ded_CreatedBy_And_CareatedAt_In_Expense.cs | 63 - ...9103905_Added_ExpenseLog_Table.Designer.cs | 4243 ----------------- .../20250719103905_Added_ExpenseLog_Table.cs | 62 - ...113715_Added_ExpensesStatusMaping_Table.cs | 149 - ..._Added_Expense_Related_Tables.Designer.cs} | 126 +- ...721124928_Added_Expense_Related_Tables.cs} | 197 +- .../ApplicationDbContextModelSnapshot.cs | 122 +- .../Dtos/Expenses/ExpenseRecordDto.cs | 2 +- Marco.Pms.Model/Expenses/ExpenseLog.cs | 3 +- .../Expenses/ExpensesReimburseMapping.cs | 5 +- .../Expenses/ExpensesStatusMapping.cs | 2 +- .../Expenses/StatusPermissionMapping.cs | 3 +- .../Master/ExpensesStatusMaster.cs | 2 + .../Master/ExpensesStatusMasterVM.cs | 2 + .../Controllers/ExpenseController.cs | 559 +-- Marco.Pms.Services/Program.cs | 1 + Marco.Pms.Services/Service/ExpensesService.cs | 895 ++++ .../ServiceInterfaces/IExpensesService.cs | 14 + .../appsettings.Development.json | 9 +- 23 files changed, 1399 insertions(+), 13512 deletions(-) delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs delete mode 100644 Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs rename Marco.Pms.DataAccess/Migrations/{20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs => 20250721124928_Added_Expense_Related_Tables.Designer.cs} (96%) rename Marco.Pms.DataAccess/Migrations/{20250719074035_Expenses_tables_Added.cs => 20250721124928_Added_Expense_Related_Tables.cs} (74%) create mode 100644 Marco.Pms.Services/Service/ExpensesService.cs create mode 100644 Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs diff --git a/Marco.Pms.CacheHelper/UpdateLogHelper.cs b/Marco.Pms.CacheHelper/UpdateLogHelper.cs index 9bc520a..ddea104 100644 --- a/Marco.Pms.CacheHelper/UpdateLogHelper.cs +++ b/Marco.Pms.CacheHelper/UpdateLogHelper.cs @@ -11,18 +11,18 @@ namespace Marco.Pms.CacheHelper private readonly IMongoDatabase _mongoDatabase; public UpdateLogHelper(IConfiguration configuration) { - var connectionString = configuration["MongoDB:ConnectionString"]; + var connectionString = configuration["MongoDB:ModificationConnectionString"]; var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); // Your MongoDB connection string _mongoDatabase = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name } - public async Task PushToUpdateLogs(UpdateLogsObject oldObject, string collectionName) + public async Task PushToUpdateLogsAsync(UpdateLogsObject oldObject, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); await collection.InsertOneAsync(oldObject); } - public async Task> GetFromUpdateLogsByEntityId(Guid entityId, string collectionName) + public async Task> GetFromUpdateLogsByEntityIdAsync(Guid entityId, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); var filter = Builders.Filter.Eq(p => p.EntityId, entityId.ToString()); @@ -34,7 +34,7 @@ namespace Marco.Pms.CacheHelper return result; } - public async Task> GetFromUpdateLogsByUpdetedById(Guid updatedById, string collectionName) + public async Task> GetFromUpdateLogsByUpdetedByIdAsync(Guid updatedById, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); var filter = Builders.Filter.Eq(p => p.UpdatedById, updatedById.ToString()); @@ -46,7 +46,7 @@ namespace Marco.Pms.CacheHelper return result; } - public BsonDocument NormalizeGuidsToStrings(object entity) + public BsonDocument EntityToBsonDocument(object entity) { var bson = new BsonDocument(); @@ -73,7 +73,7 @@ namespace Marco.Pms.CacheHelper var array = new BsonArray(); foreach (var item in list) { - array.Add(NormalizeGuidsToStrings(item)); // recursive + array.Add(EntityToBsonDocument(item)); // recursive } bson[prop.Name] = array; } diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 71dbdfa..85ea792 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -393,7 +393,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"), Name = "Draft", + DisplayName = "Draft", Description = "Expense has been created but not yet submitted.", + Color = "#212529", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -402,7 +404,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), Name = "Review Pending", + DisplayName = "Review", Description = "Reviewer is currently reviewing the expense.", + Color = "#0d6efd", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -411,7 +415,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Name = "Approval Pending", + DisplayName = "Approve", Description = "Review is completed, waiting for action of approver.", + Color = "#0dcaf0", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -420,7 +426,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), Name = "Rejected", + DisplayName = "Reject", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + Color = "#dc3545", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -429,7 +437,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Name = "Process Pending", + DisplayName = "Process", Description = "Approved expense is awaiting final payment.", + Color = "#ffc107", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -438,7 +448,9 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), Name = "Processed", + DisplayName = "Paid", Description = "Expense has been settled.", + Color = "#198754", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -451,7 +463,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("5cf7f1df-9d1f-4289-add0-1775ad614f25"), StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + NextStatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, // Approve to Rejected @@ -470,6 +482,14 @@ namespace Marco.Pms.DataAccess.Data NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, + // Rejected to Review + new ExpensesStatusMapping + { + Id = Guid.Parse("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), + StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, // Review to Rejected new ExpensesStatusMapping { @@ -496,6 +516,48 @@ namespace Marco.Pms.DataAccess.Data } ); + modelBuilder.Entity().HasData( + + // Approval Pending Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("ed893799-1a5f-4311-a077-de93c86ca8fd"), + PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Rejected Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), + PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new StatusPermissionMapping + { + Id = Guid.Parse("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Process Pending Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }, + // Processed Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = Guid.Parse("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), + TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + }); + modelBuilder.Entity().HasData( new ExpensesTypeMaster { diff --git a/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs deleted file mode 100644 index a126fc0..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.Designer.cs +++ /dev/null @@ -1,4180 +0,0 @@ -// -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("20250719074035_Expenses_tables_Added")] - partial class Expenses_tables_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("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.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.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("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("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.Entitlements.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ContactName") - .HasColumnType("longtext"); - - b.Property("ContactNumber") - .HasColumnType("longtext"); - - b.Property("Description") - .HasColumnType("longtext"); - - b.Property("DomainName") - .HasColumnType("longtext"); - - b.Property("IndustryId") - .HasColumnType("char(36)"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .HasColumnType("longtext"); - - b.Property("OnBoardingDate") - .HasColumnType("datetime(6)"); - - b.Property("OragnizationSize") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("IndustryId"); - - b.ToTable("Tenants"); - - b.HasData( - new - { - Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), - ContactName = "Admin", - ContactNumber = "123456789", - Description = "", - DomainName = "www.marcobms.org", - IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), - IsActive = true, - Name = "MarcoBMS", - OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), - OragnizationSize = "100-200" - }); - }); - - 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.Expenses", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("Amount") - .HasColumnType("double"); - - 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("ProjectId") - .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("ExpensesTypeId"); - - b.HasIndex("PaidById"); - - b.HasIndex("PaymentModeId"); - - b.HasIndex("ProjectId"); - - 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.HasKey("Id"); - - b.HasIndex("ExpensesId"); - - b.HasIndex("ExpensesReimburseId"); - - b.ToTable("ExpensesReimburseMapping"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ExpeStatusIdnsesId") - .HasColumnType("char(36)"); - - b.Property("NextStatusId") - .HasColumnType("char(36)"); - - b.Property("StatusId") - .HasColumnType("char(36)"); - - b.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("ExpeStatusIdnsesId"); - - b.HasIndex("NextStatusId"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMapping"); - - b.HasData( - new - { - Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), - NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), - NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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"); - }); - - 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.ExpensesStatusMaster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - 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("ExpensesStatusMaster"); - - b.HasData( - new - { - Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Description = "Expense has been created but not yet submitted.", - IsActive = true, - IsSystem = true, - Name = "Draft", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - Description = "Reviewer is currently reviewing the expense.", - IsActive = true, - IsSystem = true, - Name = "Review Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - Description = "Review is completed, waiting for action of approver.", - IsActive = true, - IsSystem = true, - Name = "Approval Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", - IsActive = true, - IsSystem = true, - Name = "Rejected", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Description = "Approved expense is awaiting final payment.", - IsActive = true, - IsSystem = true, - Name = "Process Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - Description = "Expense has been settled.", - IsActive = true, - IsSystem = true, - Name = "Processed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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("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" - }); - }); - - 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" - }); - }); - - 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.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMasters"); - - b.HasData( - new - { - Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), - Status = "Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), - Status = "In Progress", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), - Status = "On Hold", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - Status = "In Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - Status = "Completed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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 = "#6c757d", - 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => - { - b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") - .WithMany() - .HasForeignKey("IndustryId"); - - b.Navigation("Industry"); - }); - - 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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Document"); - - b.Navigation("Expenses"); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => - { - 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.Projects.Project", "Project") - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("StatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("ExpensesType"); - - b.Navigation("PaidBy"); - - b.Navigation("PaymentMode"); - - b.Navigation("Project"); - - 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.Entitlements.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.Navigation("Expenses"); - - b.Navigation("ExpensesReimburse"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("ExpeStatusIdnsesId"); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") - .WithMany() - .HasForeignKey("NextStatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("NextStatus"); - - b.Navigation("Status"); - - b.Navigation("Tenant"); - }); - - 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - 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/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs deleted file mode 100644 index 47a46cc..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.Designer.cs +++ /dev/null @@ -1,4196 +0,0 @@ -// -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("20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense")] - partial class Added_CreatedBy_And_CareatedAt_In_Expense - { - /// - 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("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.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.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("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("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.Entitlements.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ContactName") - .HasColumnType("longtext"); - - b.Property("ContactNumber") - .HasColumnType("longtext"); - - b.Property("Description") - .HasColumnType("longtext"); - - b.Property("DomainName") - .HasColumnType("longtext"); - - b.Property("IndustryId") - .HasColumnType("char(36)"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .HasColumnType("longtext"); - - b.Property("OnBoardingDate") - .HasColumnType("datetime(6)"); - - b.Property("OragnizationSize") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("IndustryId"); - - b.ToTable("Tenants"); - - b.HasData( - new - { - Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), - ContactName = "Admin", - ContactNumber = "123456789", - Description = "", - DomainName = "www.marcobms.org", - IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), - IsActive = true, - Name = "MarcoBMS", - OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), - OragnizationSize = "100-200" - }); - }); - - 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.Expenses", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("Amount") - .HasColumnType("double"); - - 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("ProjectId") - .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("CreatedById"); - - b.HasIndex("ExpensesTypeId"); - - b.HasIndex("PaidById"); - - b.HasIndex("PaymentModeId"); - - b.HasIndex("ProjectId"); - - 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.HasKey("Id"); - - b.HasIndex("ExpensesId"); - - b.HasIndex("ExpensesReimburseId"); - - b.ToTable("ExpensesReimburseMapping"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ExpeStatusIdnsesId") - .HasColumnType("char(36)"); - - b.Property("NextStatusId") - .HasColumnType("char(36)"); - - b.Property("StatusId") - .HasColumnType("char(36)"); - - b.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("ExpeStatusIdnsesId"); - - b.HasIndex("NextStatusId"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMapping"); - - b.HasData( - new - { - Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), - NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), - NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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"); - }); - - 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.ExpensesStatusMaster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - 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("ExpensesStatusMaster"); - - b.HasData( - new - { - Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Description = "Expense has been created but not yet submitted.", - IsActive = true, - IsSystem = true, - Name = "Draft", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - Description = "Reviewer is currently reviewing the expense.", - IsActive = true, - IsSystem = true, - Name = "Review Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - Description = "Review is completed, waiting for action of approver.", - IsActive = true, - IsSystem = true, - Name = "Approval Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", - IsActive = true, - IsSystem = true, - Name = "Rejected", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Description = "Approved expense is awaiting final payment.", - IsActive = true, - IsSystem = true, - Name = "Process Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - Description = "Expense has been settled.", - IsActive = true, - IsSystem = true, - Name = "Processed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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("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" - }); - }); - - 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" - }); - }); - - 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.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMasters"); - - b.HasData( - new - { - Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), - Status = "Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), - Status = "In Progress", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), - Status = "On Hold", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - Status = "In Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - Status = "Completed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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 = "#6c757d", - 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => - { - b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") - .WithMany() - .HasForeignKey("IndustryId"); - - b.Navigation("Industry"); - }); - - 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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Document"); - - b.Navigation("Expenses"); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => - { - 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.Projects.Project", "Project") - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("StatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CreatedBy"); - - b.Navigation("ExpensesType"); - - b.Navigation("PaidBy"); - - b.Navigation("PaymentMode"); - - b.Navigation("Project"); - - 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.Entitlements.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.Navigation("Expenses"); - - b.Navigation("ExpensesReimburse"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("ExpeStatusIdnsesId"); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") - .WithMany() - .HasForeignKey("NextStatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("NextStatus"); - - b.Navigation("Status"); - - b.Navigation("Tenant"); - }); - - 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - 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/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs b/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs deleted file mode 100644 index 19a5c08..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719091116_Added_CreatedBy_And_CareatedAt_In_Expense.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Marco.Pms.DataAccess.Migrations -{ - /// - public partial class Added_CreatedBy_And_CareatedAt_In_Expense : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "CreatedAt", - table: "Expenses", - type: "datetime(6)", - nullable: false, - defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); - - migrationBuilder.AddColumn( - name: "CreatedById", - table: "Expenses", - type: "char(36)", - nullable: false, - defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), - collation: "ascii_general_ci"); - - migrationBuilder.CreateIndex( - name: "IX_Expenses_CreatedById", - table: "Expenses", - column: "CreatedById"); - - migrationBuilder.AddForeignKey( - name: "FK_Expenses_Employees_CreatedById", - table: "Expenses", - column: "CreatedById", - principalTable: "Employees", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropForeignKey( - name: "FK_Expenses_Employees_CreatedById", - table: "Expenses"); - - migrationBuilder.DropIndex( - name: "IX_Expenses_CreatedById", - table: "Expenses"); - - migrationBuilder.DropColumn( - name: "CreatedAt", - table: "Expenses"); - - migrationBuilder.DropColumn( - name: "CreatedById", - table: "Expenses"); - } - } -} diff --git a/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs deleted file mode 100644 index 2eaef13..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.Designer.cs +++ /dev/null @@ -1,4243 +0,0 @@ -// -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("20250719103905_Added_ExpenseLog_Table")] - partial class Added_ExpenseLog_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("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.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.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("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("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.Entitlements.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ContactName") - .HasColumnType("longtext"); - - b.Property("ContactNumber") - .HasColumnType("longtext"); - - b.Property("Description") - .HasColumnType("longtext"); - - b.Property("DomainName") - .HasColumnType("longtext"); - - b.Property("IndustryId") - .HasColumnType("char(36)"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .HasColumnType("longtext"); - - b.Property("OnBoardingDate") - .HasColumnType("datetime(6)"); - - b.Property("OragnizationSize") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("IndustryId"); - - b.ToTable("Tenants"); - - b.HasData( - new - { - Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), - ContactName = "Admin", - ContactNumber = "123456789", - Description = "", - DomainName = "www.marcobms.org", - IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), - IsActive = true, - Name = "MarcoBMS", - OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), - OragnizationSize = "100-200" - }); - }); - - 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("UpdatedById") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("ExpenseId"); - - 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("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("ProjectId") - .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("CreatedById"); - - b.HasIndex("ExpensesTypeId"); - - b.HasIndex("PaidById"); - - b.HasIndex("PaymentModeId"); - - b.HasIndex("ProjectId"); - - 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.HasKey("Id"); - - b.HasIndex("ExpensesId"); - - b.HasIndex("ExpensesReimburseId"); - - b.ToTable("ExpensesReimburseMapping"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ExpeStatusIdnsesId") - .HasColumnType("char(36)"); - - b.Property("NextStatusId") - .HasColumnType("char(36)"); - - b.Property("StatusId") - .HasColumnType("char(36)"); - - b.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("ExpeStatusIdnsesId"); - - b.HasIndex("NextStatusId"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMapping"); - - b.HasData( - new - { - Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), - NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), - NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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"); - }); - - 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.ExpensesStatusMaster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - 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("ExpensesStatusMaster"); - - b.HasData( - new - { - Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Description = "Expense has been created but not yet submitted.", - IsActive = true, - IsSystem = true, - Name = "Draft", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - Description = "Reviewer is currently reviewing the expense.", - IsActive = true, - IsSystem = true, - Name = "Review Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - Description = "Review is completed, waiting for action of approver.", - IsActive = true, - IsSystem = true, - Name = "Approval Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", - IsActive = true, - IsSystem = true, - Name = "Rejected", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Description = "Approved expense is awaiting final payment.", - IsActive = true, - IsSystem = true, - Name = "Process Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - Description = "Expense has been settled.", - IsActive = true, - IsSystem = true, - Name = "Processed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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("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" - }); - }); - - 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" - }); - }); - - 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.Property("TenantId") - .HasColumnType("char(36)"); - - b.HasKey("Id"); - - b.HasIndex("TenantId"); - - b.ToTable("StatusMasters"); - - b.HasData( - new - { - Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), - Status = "Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), - Status = "In Progress", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), - Status = "On Hold", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - Status = "In Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }, - new - { - Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - Status = "Completed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") - }); - }); - - 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 = "#6c757d", - 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => - { - b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") - .WithMany() - .HasForeignKey("IndustryId"); - - b.Navigation("Industry"); - }); - - 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.Entitlements.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.Employees.Employee", "UpdatedBy") - .WithMany() - .HasForeignKey("UpdatedById") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Expense"); - - b.Navigation("UpdatedBy"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => - { - 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.Projects.Project", "Project") - .WithMany() - .HasForeignKey("ProjectId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("StatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CreatedBy"); - - b.Navigation("ExpensesType"); - - b.Navigation("PaidBy"); - - b.Navigation("PaymentMode"); - - b.Navigation("Project"); - - 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.Entitlements.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.Navigation("Expenses"); - - b.Navigation("ExpensesReimburse"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusMapping", b => - { - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") - .WithMany() - .HasForeignKey("ExpeStatusIdnsesId"); - - b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") - .WithMany() - .HasForeignKey("NextStatusId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("NextStatus"); - - b.Navigation("Status"); - - b.Navigation("Tenant"); - }); - - 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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - 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/20250719103905_Added_ExpenseLog_Table.cs b/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs deleted file mode 100644 index c4fc528..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719103905_Added_ExpenseLog_Table.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Marco.Pms.DataAccess.Migrations -{ - /// - public partial class Added_ExpenseLog_Table : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "ExpenseLogs", - columns: table => new - { - Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - ExpenseId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - UpdatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - Action = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Comment = table.Column(type: "longtext", nullable: true) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_ExpenseLogs", x => x.Id); - table.ForeignKey( - name: "FK_ExpenseLogs_Employees_UpdatedById", - column: x => x.UpdatedById, - principalTable: "Employees", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ExpenseLogs_Expenses_ExpenseId", - column: x => x.ExpenseId, - principalTable: "Expenses", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_ExpenseLogs_ExpenseId", - table: "ExpenseLogs", - column: "ExpenseId"); - - migrationBuilder.CreateIndex( - name: "IX_ExpenseLogs_UpdatedById", - table: "ExpenseLogs", - column: "UpdatedById"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "ExpenseLogs"); - } - } -} diff --git a/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs b/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs deleted file mode 100644 index f20e292..0000000 --- a/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.cs +++ /dev/null @@ -1,149 +0,0 @@ -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_ExpensesStatusMaping_Table : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "StatusMapping"); - - migrationBuilder.CreateTable( - name: "ExpensesStatusMapping", - columns: table => new - { - Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), - NextStatusId = 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_ExpensesStatusMapping", x => x.Id); - table.ForeignKey( - name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", - column: x => x.ExpeStatusIdnsesId, - principalTable: "ExpensesStatusMaster", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_NextStatusId", - column: x => x.NextStatusId, - principalTable: "ExpensesStatusMaster", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ExpensesStatusMapping_Tenants_TenantId", - column: x => x.TenantId, - principalTable: "Tenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.InsertData( - table: "ExpensesStatusMapping", - columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, - values: new object[,] - { - { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } - }); - - migrationBuilder.CreateIndex( - name: "IX_ExpensesStatusMapping_ExpeStatusIdnsesId", - table: "ExpensesStatusMapping", - column: "ExpeStatusIdnsesId"); - - migrationBuilder.CreateIndex( - name: "IX_ExpensesStatusMapping_NextStatusId", - table: "ExpensesStatusMapping", - column: "NextStatusId"); - - migrationBuilder.CreateIndex( - name: "IX_ExpensesStatusMapping_TenantId", - table: "ExpensesStatusMapping", - column: "TenantId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "ExpensesStatusMapping"); - - migrationBuilder.CreateTable( - name: "StatusMapping", - columns: table => new - { - Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), - NextStatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") - }, - constraints: table => - { - table.PrimaryKey("PK_StatusMapping", x => x.Id); - table.ForeignKey( - name: "FK_StatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", - column: x => x.ExpeStatusIdnsesId, - principalTable: "ExpensesStatusMaster", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_StatusMapping_ExpensesStatusMaster_NextStatusId", - column: x => x.NextStatusId, - principalTable: "ExpensesStatusMaster", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_StatusMapping_Tenants_TenantId", - column: x => x.TenantId, - principalTable: "Tenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.InsertData( - table: "StatusMapping", - columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, - values: new object[,] - { - { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } - }); - - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_ExpeStatusIdnsesId", - table: "StatusMapping", - column: "ExpeStatusIdnsesId"); - - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_NextStatusId", - table: "StatusMapping", - column: "NextStatusId"); - - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_TenantId", - table: "StatusMapping", - column: "TenantId"); - } - } -} diff --git a/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs similarity index 96% rename from Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs rename to Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index d5fe0c3..ad83f62 100644 --- a/Marco.Pms.DataAccess/Migrations/20250719113715_Added_ExpensesStatusMaping_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Marco.Pms.DataAccess.Migrations { [DbContext(typeof(ApplicationDbContext))] - [Migration("20250719113715_Added_ExpensesStatusMaping_Table")] - partial class Added_ExpensesStatusMaping_Table + [Migration("20250721124928_Added_Expense_Related_Tables")] + partial class Added_Expense_Related_Tables { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -1307,6 +1307,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("ExpenseId") .HasColumnType("char(36)"); + b.Property("TenantId") + .HasColumnType("char(36)"); + b.Property("UpdatedById") .HasColumnType("char(36)"); @@ -1314,6 +1317,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("ExpenseId"); + b.HasIndex("TenantId"); + b.HasIndex("UpdatedById"); b.ToTable("ExpenseLogs"); @@ -1444,12 +1449,17 @@ namespace Marco.Pms.DataAccess.Migrations 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"); }); @@ -1459,9 +1469,6 @@ namespace Marco.Pms.DataAccess.Migrations .ValueGeneratedOnAdd() .HasColumnType("char(36)"); - b.Property("ExpeStatusIdnsesId") - .HasColumnType("char(36)"); - b.Property("NextStatusId") .HasColumnType("char(36)"); @@ -1473,10 +1480,10 @@ namespace Marco.Pms.DataAccess.Migrations b.HasKey("Id"); - b.HasIndex("ExpeStatusIdnsesId"); - b.HasIndex("NextStatusId"); + b.HasIndex("StatusId"); + b.HasIndex("TenantId"); b.ToTable("ExpensesStatusMapping"); @@ -1485,7 +1492,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), - NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, @@ -1504,6 +1511,13 @@ namespace Marco.Pms.DataAccess.Migrations TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, new + { + Id = new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new { Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), @@ -1538,13 +1552,55 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("StatusId") .HasColumnType("char(36)"); + b.Property("TenantId") + .HasColumnType("char(36)"); + b.HasKey("Id"); b.HasIndex("PermissionId"); b.HasIndex("StatusId"); + b.HasIndex("TenantId"); + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); }); modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => @@ -1843,10 +1899,18 @@ namespace Marco.Pms.DataAccess.Migrations .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)"); @@ -1870,7 +1934,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#212529", Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", IsActive = true, IsSystem = true, Name = "Draft", @@ -1879,7 +1945,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#0d6efd", Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Review", IsActive = true, IsSystem = true, Name = "Review Pending", @@ -1888,7 +1956,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#0dcaf0", Description = "Review is completed, waiting for action of approver.", + DisplayName = "Approve", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1897,7 +1967,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#dc3545", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + DisplayName = "Reject", IsActive = true, IsSystem = true, Name = "Rejected", @@ -1906,7 +1978,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffc107", Description = "Approved expense is awaiting final payment.", + DisplayName = "Process", IsActive = true, IsSystem = true, Name = "Process Pending", @@ -1915,7 +1989,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#198754", Description = "Expense has been settled.", + DisplayName = "Paid", IsActive = true, IsSystem = true, Name = "Processed", @@ -3696,6 +3772,12 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") .WithMany() .HasForeignKey("UpdatedById") @@ -3704,6 +3786,8 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Expense"); + b.Navigation("Tenant"); + b.Navigation("UpdatedBy"); }); @@ -3799,23 +3883,33 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.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", "Status") - .WithMany() - .HasForeignKey("ExpeStatusIdnsesId"); - 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.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") @@ -3843,9 +3937,17 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.Navigation("Permission"); b.Navigation("Status"); + + b.Navigation("Tenant"); }); modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => diff --git a/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs similarity index 74% rename from Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs rename to Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index d53b349..1d1e2f9 100644 --- a/Marco.Pms.DataAccess/Migrations/20250719074035_Expenses_tables_Added.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace Marco.Pms.DataAccess.Migrations { /// - public partial class Expenses_tables_Added : Migration + public partial class Added_Expense_Related_Tables : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -51,8 +51,12 @@ namespace Marco.Pms.DataAccess.Migrations Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), Name = table.Column(type: "longtext", nullable: false) .Annotation("MySql:CharSet", "utf8mb4"), + DisplayName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), Description = table.Column(type: "longtext", nullable: false) .Annotation("MySql:CharSet", "utf8mb4"), + Color = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), IsSystem = table.Column(type: "tinyint(1)", nullable: false), IsActive = table.Column(type: "tinyint(1)", nullable: false), TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") @@ -119,31 +123,31 @@ namespace Marco.Pms.DataAccess.Migrations .Annotation("MySql:CharSet", "utf8mb4"); migrationBuilder.CreateTable( - name: "StatusMapping", + name: "ExpensesStatusMapping", columns: table => new { Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - ExpeStatusIdnsesId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), NextStatusId = 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_StatusMapping", x => x.Id); + table.PrimaryKey("PK_ExpensesStatusMapping", x => x.Id); table.ForeignKey( - name: "FK_StatusMapping_ExpensesStatusMaster_ExpeStatusIdnsesId", - column: x => x.ExpeStatusIdnsesId, - principalTable: "ExpensesStatusMaster", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_StatusMapping_ExpensesStatusMaster_NextStatusId", + name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_NextStatusId", column: x => x.NextStatusId, principalTable: "ExpensesStatusMaster", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_StatusMapping_Tenants_TenantId", + name: "FK_ExpensesStatusMapping_ExpensesStatusMaster_StatusId", + column: x => x.StatusId, + principalTable: "ExpensesStatusMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpensesStatusMapping_Tenants_TenantId", column: x => x.TenantId, principalTable: "Tenants", principalColumn: "Id", @@ -157,7 +161,8 @@ namespace Marco.Pms.DataAccess.Migrations { Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - PermissionId = 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 => { @@ -174,6 +179,12 @@ namespace Marco.Pms.DataAccess.Migrations principalTable: "FeaturePermissions", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StatusPermissionMapping_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }) .Annotation("MySql:CharSet", "utf8mb4"); @@ -186,7 +197,9 @@ namespace Marco.Pms.DataAccess.Migrations ExpensesTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), PaymentModeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), PaidById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), TransactionDate = table.Column(type: "datetime(6)", nullable: false), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), TransactionId = table.Column(type: "longtext", nullable: true) .Annotation("MySql:CharSet", "utf8mb4"), Description = table.Column(type: "longtext", nullable: false) @@ -207,6 +220,12 @@ namespace Marco.Pms.DataAccess.Migrations constraints: table => { table.PrimaryKey("PK_Expenses", x => x.Id); + table.ForeignKey( + name: "FK_Expenses_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_Expenses_Employees_PaidById", column: x => x.PaidById, @@ -279,13 +298,51 @@ namespace Marco.Pms.DataAccess.Migrations }) .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( + name: "ExpenseLogs", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ExpenseId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Action = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Comment = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_ExpenseLogs", x => x.Id); + table.ForeignKey( + name: "FK_ExpenseLogs_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpenseLogs_Expenses_ExpenseId", + column: x => x.ExpenseId, + principalTable: "Expenses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpenseLogs_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.CreateTable( name: "ExpensesReimburseMapping", columns: table => new { Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), ExpensesId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - ExpensesReimburseId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + ExpensesReimburseId = 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 => { @@ -302,20 +359,26 @@ namespace Marco.Pms.DataAccess.Migrations principalTable: "Expenses", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ExpensesReimburseMapping_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }) .Annotation("MySql:CharSet", "utf8mb4"); migrationBuilder.InsertData( table: "ExpensesStatusMaster", - columns: new[] { "Id", "Description", "IsActive", "IsSystem", "Name", "TenantId" }, + columns: new[] { "Id", "Color", "Description", "DisplayName", "IsActive", "IsSystem", "Name", "TenantId" }, values: new object[,] { - { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "Expense has been created but not yet submitted.", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "Review is completed, waiting for action of approver.", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "Expense has been settled.", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "Reviewer is currently reviewing the expense.", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "Expense was declined, often with a reason(either review rejected or approval rejected.", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "Approved expense is awaiting final payment.", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#212529", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#0dcaf0", "Review is completed, waiting for action of approver.", "Approve", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#198754", "Expense has been settled.", "Paid", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#0d6efd", "Reviewer is currently reviewing the expense.", "Review", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#dc3545", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffc107", "Approved expense is awaiting final payment.", "Process", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); migrationBuilder.InsertData( @@ -349,6 +412,20 @@ namespace Marco.Pms.DataAccess.Migrations { new Guid("ed667353-8eea-4fd1-8750-719405932480"), "Online banking portals used to transfer funds directly between accounts", true, "NetBanking", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); + migrationBuilder.InsertData( + table: "ExpensesStatusMapping", + columns: new[] { "Id", "NextStatusId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + migrationBuilder.InsertData( table: "FeaturePermissions", columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, @@ -364,16 +441,15 @@ namespace Marco.Pms.DataAccess.Migrations }); migrationBuilder.InsertData( - table: "StatusMapping", - columns: new[] { "Id", "ExpeStatusIdnsesId", "NextStatusId", "StatusId", "TenantId" }, + table: "StatusPermissionMapping", + columns: new[] { "Id", "PermissionId", "StatusId", "TenantId" }, values: new object[,] { - { new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), null, new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), null, new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), null, new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), null, new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + { new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); migrationBuilder.CreateIndex( @@ -391,6 +467,26 @@ namespace Marco.Pms.DataAccess.Migrations table: "BillAttachments", column: "TenantId"); + migrationBuilder.CreateIndex( + name: "IX_ExpenseLogs_ExpenseId", + table: "ExpenseLogs", + column: "ExpenseId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpenseLogs_TenantId", + table: "ExpenseLogs", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpenseLogs_UpdatedById", + table: "ExpenseLogs", + column: "UpdatedById"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_CreatedById", + table: "Expenses", + column: "CreatedById"); + migrationBuilder.CreateIndex( name: "IX_Expenses_ExpensesTypeId", table: "Expenses", @@ -441,6 +537,26 @@ namespace Marco.Pms.DataAccess.Migrations table: "ExpensesReimburseMapping", column: "ExpensesReimburseId"); + migrationBuilder.CreateIndex( + name: "IX_ExpensesReimburseMapping_TenantId", + table: "ExpensesReimburseMapping", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_NextStatusId", + table: "ExpensesStatusMapping", + column: "NextStatusId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_StatusId", + table: "ExpensesStatusMapping", + column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_TenantId", + table: "ExpensesStatusMapping", + column: "TenantId"); + migrationBuilder.CreateIndex( name: "IX_ExpensesStatusMaster_TenantId", table: "ExpensesStatusMaster", @@ -456,21 +572,6 @@ namespace Marco.Pms.DataAccess.Migrations table: "PaymentModeMatser", column: "TenantId"); - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_ExpeStatusIdnsesId", - table: "StatusMapping", - column: "ExpeStatusIdnsesId"); - - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_NextStatusId", - table: "StatusMapping", - column: "NextStatusId"); - - migrationBuilder.CreateIndex( - name: "IX_StatusMapping_TenantId", - table: "StatusMapping", - column: "TenantId"); - migrationBuilder.CreateIndex( name: "IX_StatusPermissionMapping_PermissionId", table: "StatusPermissionMapping", @@ -480,6 +581,11 @@ namespace Marco.Pms.DataAccess.Migrations name: "IX_StatusPermissionMapping_StatusId", table: "StatusPermissionMapping", column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_StatusPermissionMapping_TenantId", + table: "StatusPermissionMapping", + column: "TenantId"); } /// @@ -488,11 +594,14 @@ namespace Marco.Pms.DataAccess.Migrations migrationBuilder.DropTable( name: "BillAttachments"); + migrationBuilder.DropTable( + name: "ExpenseLogs"); + migrationBuilder.DropTable( name: "ExpensesReimburseMapping"); migrationBuilder.DropTable( - name: "StatusMapping"); + name: "ExpensesStatusMapping"); migrationBuilder.DropTable( name: "StatusPermissionMapping"); diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 0151173..c15054f 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1304,6 +1304,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("ExpenseId") .HasColumnType("char(36)"); + b.Property("TenantId") + .HasColumnType("char(36)"); + b.Property("UpdatedById") .HasColumnType("char(36)"); @@ -1311,6 +1314,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("ExpenseId"); + b.HasIndex("TenantId"); + b.HasIndex("UpdatedById"); b.ToTable("ExpenseLogs"); @@ -1441,12 +1446,17 @@ namespace Marco.Pms.DataAccess.Migrations 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"); }); @@ -1456,9 +1466,6 @@ namespace Marco.Pms.DataAccess.Migrations .ValueGeneratedOnAdd() .HasColumnType("char(36)"); - b.Property("ExpeStatusIdnsesId") - .HasColumnType("char(36)"); - b.Property("NextStatusId") .HasColumnType("char(36)"); @@ -1470,10 +1477,10 @@ namespace Marco.Pms.DataAccess.Migrations b.HasKey("Id"); - b.HasIndex("ExpeStatusIdnsesId"); - b.HasIndex("NextStatusId"); + b.HasIndex("StatusId"); + b.HasIndex("TenantId"); b.ToTable("ExpensesStatusMapping"); @@ -1482,7 +1489,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), - NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, @@ -1501,6 +1508,13 @@ namespace Marco.Pms.DataAccess.Migrations TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, new + { + Id = new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new { Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), @@ -1535,13 +1549,55 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("StatusId") .HasColumnType("char(36)"); + b.Property("TenantId") + .HasColumnType("char(36)"); + b.HasKey("Id"); b.HasIndex("PermissionId"); b.HasIndex("StatusId"); + b.HasIndex("TenantId"); + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + 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"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); }); modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => @@ -1840,10 +1896,18 @@ namespace Marco.Pms.DataAccess.Migrations .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)"); @@ -1867,7 +1931,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#212529", Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", IsActive = true, IsSystem = true, Name = "Draft", @@ -1876,7 +1942,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#0d6efd", Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Review", IsActive = true, IsSystem = true, Name = "Review Pending", @@ -1885,7 +1953,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#0dcaf0", Description = "Review is completed, waiting for action of approver.", + DisplayName = "Approve", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1894,7 +1964,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#dc3545", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + DisplayName = "Reject", IsActive = true, IsSystem = true, Name = "Rejected", @@ -1903,7 +1975,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffc107", Description = "Approved expense is awaiting final payment.", + DisplayName = "Process", IsActive = true, IsSystem = true, Name = "Process Pending", @@ -1912,7 +1986,9 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#198754", Description = "Expense has been settled.", + DisplayName = "Paid", IsActive = true, IsSystem = true, Name = "Processed", @@ -3693,6 +3769,12 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") .WithMany() .HasForeignKey("UpdatedById") @@ -3701,6 +3783,8 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Expense"); + b.Navigation("Tenant"); + b.Navigation("UpdatedBy"); }); @@ -3796,23 +3880,33 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.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", "Status") - .WithMany() - .HasForeignKey("ExpeStatusIdnsesId"); - 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.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") @@ -3840,9 +3934,17 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.Navigation("Permission"); b.Navigation("Status"); + + b.Navigation("Tenant"); }); modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => diff --git a/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs index ef18799..3731f3b 100644 --- a/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs +++ b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs @@ -4,6 +4,6 @@ { public Guid ExpenseId { get; set; } public Guid StatusId { get; set; } - public string? Description { get; set; } + public string? Comment { get; set; } } } diff --git a/Marco.Pms.Model/Expenses/ExpenseLog.cs b/Marco.Pms.Model/Expenses/ExpenseLog.cs index ec3d8fd..e0eaa21 100644 --- a/Marco.Pms.Model/Expenses/ExpenseLog.cs +++ b/Marco.Pms.Model/Expenses/ExpenseLog.cs @@ -1,10 +1,11 @@ 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.Expenses { - public class ExpenseLog + public class ExpenseLog : TenantRelation { public Guid Id { get; set; } public Guid ExpenseId { get; set; } diff --git a/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs b/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs index c1c2be6..16237de 100644 --- a/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs +++ b/Marco.Pms.Model/Expenses/ExpensesReimburseMapping.cs @@ -1,9 +1,10 @@ -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using System.ComponentModel.DataAnnotations.Schema; namespace Marco.Pms.Model.Expenses { - public class ExpensesReimburseMapping + public class ExpensesReimburseMapping : TenantRelation { public Guid Id { get; set; } public Guid ExpensesId { get; set; } diff --git a/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs index e09350d..1eb7470 100644 --- a/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs +++ b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs @@ -11,7 +11,7 @@ namespace Marco.Pms.Model.Expenses public Guid StatusId { get; set; } [ValidateNever] - [ForeignKey("ExpeStatusIdnsesId")] + [ForeignKey("StatusId")] public ExpensesStatusMaster? Status { get; set; } public Guid NextStatusId { get; set; } diff --git a/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs index 2fe9334..9333412 100644 --- a/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs +++ b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs @@ -1,11 +1,12 @@ using Marco.Pms.Model.Entitlements; 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.Expenses { - public class StatusPermissionMapping + public class StatusPermissionMapping : TenantRelation { public Guid Id { get; set; } public Guid StatusId { get; set; } diff --git a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs index dc2556a..dc393cd 100644 --- a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs +++ b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs @@ -6,7 +6,9 @@ namespace Marco.Pms.Model.Master { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public string Color { get; set; } = string.Empty; public bool IsSystem { get; set; } = false; public bool IsActive { get; set; } = true; } diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs index f772695..73a6487 100644 --- a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs @@ -4,7 +4,9 @@ { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public string? Color { get; set; } public bool IsSystem { get; set; } = false; } } diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 4501c61..8f3351d 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -1,20 +1,9 @@ -using AutoMapper; -using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.Dtos.Expenses; -using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Utilities; -using Marco.Pms.Model.ViewModels.Expanses; -using Marco.Pms.Model.ViewModels.Master; -using Marco.Pms.Model.ViewModels.Projects; -using Marco.Pms.Services.Service; +using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; -using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using System.Text.Json; -using Document = Marco.Pms.Model.DocumentManager.Document; namespace Marco.Pms.Services.Controllers @@ -24,31 +13,19 @@ namespace Marco.Pms.Services.Controllers [Authorize] public class ExpenseController : ControllerBase { - private readonly IDbContextFactory _dbContextFactory; - private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; - private readonly ILoggingService _logger; - private readonly S3UploadService _s3Service; - private readonly IServiceScopeFactory _serviceScopeFactory; - private readonly IMapper _mapper; + private readonly IExpensesService _expensesService; + private readonly ISignalRService _signalR; private readonly Guid tenantId; - private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); public ExpenseController( - IDbContextFactory dbContextFactory, - ApplicationDbContext context, UserHelper userHelper, - IServiceScopeFactory serviceScopeFactory, - ILoggingService logger, - S3UploadService s3Service, - IMapper mapper) + IExpensesService expensesService, + ISignalRService signalR + ) { - _dbContextFactory = dbContextFactory; - _context = context; _userHelper = userHelper; - _logger = logger; - _serviceScopeFactory = serviceScopeFactory; - _s3Service = s3Service; - _mapper = mapper; + _expensesService = expensesService; + _signalR = signalR; tenantId = userHelper.GetTenantId(); } @@ -64,182 +41,9 @@ namespace Marco.Pms.Services.Controllers [HttpGet("list")] public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) { - try - { - _logger.LogInfo( - "Attempting to fetch expenses list for PageNumber: {PageNumber}, PageSize: {PageSize} with Filter: {Filter}", - pageNumber, pageSize, filter ?? ""); - - // 1. --- Get User and Permissions --- - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - if (loggedInEmployee == null) - { - // This is an authentication/authorization issue. The user should be logged in. - _logger.LogWarning("Could not find an employee for the current logged-in user."); - return Unauthorized(ApiResponse.ErrorResponse("User not found or not authenticated.", 401)); - } - Guid loggedInEmployeeId = loggedInEmployee.Id; - - var hasViewSelfPermissionTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - return await permissionService.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); - }); - - var hasViewAllPermissionTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - return await permissionService.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); - }); - - await Task.WhenAll(hasViewSelfPermissionTask, hasViewAllPermissionTask); - - // 2. --- Build Base Query and Apply Permissions --- - // Start with a base IQueryable. Filters will be chained onto this. - var expensesQuery = _context.Expenses - .Include(e => e.ExpensesType) - .Include(e => e.Project) - .Include(e => e.PaidBy) - .ThenInclude(e => e!.JobRole) - .Include(e => e.PaymentMode) - .Include(e => e.Status) - .Include(e => e.CreatedBy) - .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. - - // Apply permission-based filtering BEFORE any other filters or pagination. - if (hasViewAllPermissionTask.Result) - { - // User has 'View All' permission, no initial restriction on who created the expense. - _logger.LogInfo("User {EmployeeId} has 'View All' permission.", loggedInEmployeeId); - } - else if (hasViewSelfPermissionTask.Result) - { - // User only has 'View Self' permission, so restrict the query to their own expenses. - _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); - expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); - } - else - { - // User has neither required permission. Deny access. - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployeeId); - return Ok(ApiResponse.SuccessResponse(new List(), "You do not have permission to view any expenses.", 200)); - } - - // 3. --- Deserialize Filter and Apply --- - ExpensesFilter? expenseFilter = TryDeserializeFilter(filter); - - if (expenseFilter != null) - { - // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. - if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) - { - expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); - } - - if (expenseFilter.ProjectIds?.Any() == true) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId)); - } - - if (expenseFilter.StatusIds?.Any() == true) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.StatusIds.Contains(e.StatusId)); - } - - if (expenseFilter.PaidById?.Any() == true) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.PaidById.Contains(e.PaidById)); - } - - // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. - if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermissionTask.Result) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); - } - } - - // 4. --- Apply Ordering and Pagination --- - // This should be the last step before executing the query. - var paginatedQuery = expensesQuery - .OrderByDescending(e => e.CreatedAt) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize); - - // 5. --- Execute Query and Map Results --- - var expensesList = await paginatedQuery.ToListAsync(); - - if (!expensesList.Any()) - { - _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployeeId); - return Ok(ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200)); - } - - var response = _mapper.Map>(expensesList); - - // 6. --- Efficiently Fetch and Append 'Next Status' Information --- - var statusIds = expensesList.Select(e => e.StatusId).Distinct().ToList(); - - var statusMappings = await _context.ExpensesStatusMapping - .Include(sm => sm.NextStatus) - .Where(sm => statusIds.Contains(sm.StatusId)) - .ToListAsync(); - - // Use a Lookup for efficient O(1) mapping. This is much better than repeated `.Where()` in a loop. - var statusMapLookup = statusMappings.ToLookup(sm => sm.StatusId); - - foreach (var expense in response) - { - if (expense.Status?.Id != null && statusMapLookup.Contains(expense.Status.Id)) - { - expense.NextStatus = statusMapLookup[expense.Status.Id] - .Select(sm => _mapper.Map(sm.NextStatus)) - .ToList(); - } - else - { - expense.NextStatus = new List(); // Ensure it's never null - } - } - - // 7. --- Return Final Success Response --- - var message = $"{response.Count} expense records fetched successfully."; - _logger.LogInfo(message); - return StatusCode(200, ApiResponse.SuccessResponse(response, message, 200)); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Databsae Exception occured while fetching list expenses"); - return BadRequest(ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - innerexcption = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 400)); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occured while fetching list expenses"); - return BadRequest(ApiResponse.ErrorResponse("Error Occured", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - innerexcption = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 400)); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetExpensesListAsync(loggedInEmployee, tenantId, filter, pageSize, pageNumber); + return StatusCode(response.StatusCode, response); } [HttpGet("details/{id}")] @@ -257,355 +61,38 @@ namespace Marco.Pms.Services.Controllers /// An IActionResult indicating the result of the creation operation. [HttpPost("create")] - public async Task CreateExpense([FromBody] CreateExpensesDto dto) + public async Task CreateExpense([FromBody] CreateExpensesDto model) { - _logger.LogDebug("Starting CreateExpense for Project {ProjectId}", dto.ProjectId); - // The entire operation is wrapped in a transaction to ensure data consistency. - await using var transaction = await _context.Database.BeginTransactionAsync(); - - try - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - // 1. Authorization & Validation: Run all I/O-bound checks concurrently using factories for safety. - - // PERMISSION CHECKS: Use IServiceScopeFactory for thread-safe access to scoped services. - var hasUploadPermissionTask = Task.Run(async () => // Task.Run is acceptable here to create a new scope, but let's do it cleaner. - { - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - return await permissionService.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); - }); - - var hasProjectPermissionTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - return await permissionService.HasProjectPermission(loggedInEmployee, dto.ProjectId); - }); - - // VALIDATION CHECKS: Use IDbContextFactory for thread-safe, parallel database queries. - // Each task gets its own DbContext instance. - var projectTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == dto.ProjectId); - }); - var expenseTypeTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == dto.ExpensesTypeId); - }); - var paymentModeTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == dto.PaymentModeId); - }); - var statusTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMaster.AsNoTracking().FirstOrDefaultAsync(es => es.Id == Draft); - }); - - - // Await all prerequisite checks at once. - await Task.WhenAll( - hasUploadPermissionTask, hasProjectPermissionTask, - projectTask, expenseTypeTask, paymentModeTask, statusTask - ); - - // Await all prerequisite checks at once. - await Task.WhenAll( - hasUploadPermissionTask, hasProjectPermissionTask, - projectTask, expenseTypeTask, paymentModeTask, statusTask - ); - - // 2. Aggregate and Check Results - if (!await hasUploadPermissionTask || !await hasProjectPermissionTask) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload expenses for this project.", 403)); - } - - var validationErrors = new List(); - var project = await projectTask; - var expenseType = await expenseTypeTask; - var paymentMode = await paymentModeTask; - var status = await statusTask; - - if (project == null) validationErrors.Add("Project not found."); - if (expenseType == null) validationErrors.Add("Expense Type not found."); - if (paymentMode == null) validationErrors.Add("Payment Mode not found."); - if (status == null) validationErrors.Add("Default status 'Draft' not found."); - - if (validationErrors.Any()) - { - await transaction.RollbackAsync(); - var errorMessage = string.Join(" ", validationErrors); - _logger.LogWarning("Expense creation failed due to validation errors: {ValidationErrors}", errorMessage); - return BadRequest(ApiResponse.ErrorResponse("Invalid input data.", errorMessage, 400)); - } - - // 3. Entity Creation - var expense = _mapper.Map(dto); - expense.CreatedById = loggedInEmployee.Id; - expense.CreatedAt = DateTime.UtcNow; - expense.TenantId = tenantId; - expense.IsActive = true; - expense.StatusId = Draft; - - _context.Expenses.Add(expense); - - // 4. Process Attachments - if (dto.BillAttachments?.Any() ?? false) - { - await ProcessAndUploadAttachmentsAsync(dto.BillAttachments, expense, loggedInEmployee.Id, tenantId); - } - - // 5. Database Commit - await _context.SaveChangesAsync(); - - // 6. Transaction Commit - await transaction.CommitAsync(); - - var response = _mapper.Map(expense); - response.Project = _mapper.Map(project); - response.Status = _mapper.Map(status); - response.PaymentMode = _mapper.Map(paymentMode); - response.ExpensesType = _mapper.Map(expenseType); - - _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); - return StatusCode(201, ApiResponse.SuccessResponse(response, "Expense created successfully.", 201)); - } - catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation - { - await transaction.RollbackAsync(); - _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); - return BadRequest(ApiResponse.ErrorResponse("Invalid Request Data.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - innerexcption = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 400)); - } - catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) - { - await transaction.RollbackAsync(); - _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); - return StatusCode(500, ApiResponse.ErrorResponse("An internal server error occurred.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - innerexcption = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500)); - } + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.CreateExpenseAsync(model, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); } [HttpPost("action")] public async Task ChangeStatus([FromBody] ExpenseRecordDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var exsitingExpenses = await _context.Expenses - .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.TenantId == tenantId); - - if (exsitingExpenses == null) + var response = await _expensesService.ChangeStatusAsync(model, loggedInEmployee, tenantId); + if (response.Success) { - return NotFound(ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404)); + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); } - - exsitingExpenses.StatusId = model.StatusId; - - try - { - await _context.SaveChangesAsync(); - } - catch (DbUpdateConcurrencyException dbEx) - { - // --- Step 3: Handle Concurrency Conflicts --- - // This happens if another user modified the project after we fetched it. - _logger.LogError(dbEx, "Error occured while update status of expanse."); - return StatusCode(500, ApiResponse.ErrorResponse("Error occured while update status of expanse.", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - innerexcption = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500)); - } - var response = _mapper.Map(exsitingExpenses); - return Ok(ApiResponse.SuccessResponse(response)); + return StatusCode(response.StatusCode, response); } [HttpPut("edit/{id}")] public async Task UpdateExpanse(Guid id, [FromBody] UpdateExpensesDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var exsitingExpense = await _context.Expenses.FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); - - - if (exsitingExpense == null) - { - return NotFound(ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404)); - } - _mapper.Map(model, exsitingExpense); - _context.Entry(exsitingExpense).State = EntityState.Modified; - - try - { - await _context.SaveChangesAsync(); - _logger.LogInfo("Successfully updated project {ProjectId} by user {UserId}.", id, loggedInEmployee.Id); - } - catch (DbUpdateConcurrencyException ex) - { - // --- Step 3: Handle Concurrency Conflicts --- - // This happens if another user modified the project after we fetched it. - _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); - return StatusCode(409, ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409)); - } - var response = _mapper.Map(exsitingExpense); - return Ok(ApiResponse.SuccessResponse(response)); + var response = await _expensesService.UpdateExpanseAsync(id, model, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); } [HttpDelete("delete/{id}")] public void Delete(int id) { } - #region =================================================================== Helper Functions =================================================================== - /// - /// 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 ExpensesFilter? TryDeserializeFilter(string? filter) - { - if (string.IsNullOrWhiteSpace(filter)) - { - return null; - } - - var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; - ExpensesFilter? 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; - } - - /// - /// Processes and uploads attachments concurrently, then adds the resulting entities to the main DbContext. - /// - private async Task ProcessAndUploadAttachmentsAsync(IEnumerable attachments, Expenses expense, Guid employeeId, Guid tenantId) - { - // Pre-validate all attachments to fail fast before any uploads. - foreach (var attachment in attachments) - { - if (string.IsNullOrWhiteSpace(attachment.Base64Data) || !_s3Service.IsBase64String(attachment.Base64Data)) - { - throw new ArgumentException($"Invalid or missing Base64 data for attachment: {attachment.FileName ?? "N/A"}"); - } - } - - var batchId = Guid.NewGuid(); - - // Create a list of tasks to be executed concurrently. - var processingTasks = attachments.Select(attachment => - ProcessSingleAttachmentAsync(attachment, expense, employeeId, tenantId, batchId) - ).ToList(); - - var results = await Task.WhenAll(processingTasks); - - // This part is thread-safe as it runs after all concurrent tasks are complete. - foreach (var (document, billAttachment) in results) - { - _context.Documents.Add(document); - _context.BillAttachments.Add(billAttachment); - } - _logger.LogInfo("{AttachmentCount} attachments processed and staged for saving.", results.Length); - } - - /// - /// Handles the logic for a single attachment: upload to S3 and create corresponding entities. - /// - private async Task<(Document document, BillAttachments billAttachment)> ProcessSingleAttachmentAsync( - FileUploadModel attachment, Expenses expense, Guid employeeId, Guid tenantId, Guid batchId) - { - var base64Data = attachment.Base64Data!.Contains(',') ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] : attachment.Base64Data; - var fileType = _s3Service.GetContentTypeFromBase64(base64Data); - var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); - var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; - - // Await the I/O-bound upload operation directly. - await _s3Service.UploadFileAsync(base64Data, fileType, objectKey); - _logger.LogInfo("Uploaded file to S3 with key: {ObjectKey}", objectKey); - - return CreateAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); - } - - - /// - /// A private static helper method to create Document and BillAttachment entities. - /// This remains unchanged as it's a pure data-shaping method. - /// - private static (Document document, BillAttachments billAttachment) CreateAttachmentEntities( - Guid batchId, Guid expenseId, Guid uploadedById, Guid tenantId, string s3Key, FileUploadModel attachmentDto) - { - var document = new Document - { - BatchId = batchId, - UploadedById = uploadedById, - FileName = attachmentDto.FileName ?? "", - ContentType = attachmentDto.ContentType ?? "", - S3Key = s3Key, - FileSize = attachmentDto.FileSize, - UploadedAt = DateTime.UtcNow, - TenantId = tenantId - }; - var billAttachment = new BillAttachments { Document = document, ExpensesId = expenseId, TenantId = tenantId }; - return (document, billAttachment); - } - - #endregion } } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index a43af8b..6b6bfa5 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(); builder.Services.AddScoped(); #endregion diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs new file mode 100644 index 0000000..71dfe33 --- /dev/null +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -0,0 +1,895 @@ +using AutoMapper; +using Marco.Pms.CacheHelper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Model.Dtos.Expenses; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Expanses; +using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Service; +using Microsoft.EntityFrameworkCore; +using System.Text.Json; + +namespace Marco.Pms.Services.Service +{ + public class ExpensesService : IExpensesService + { + private readonly IDbContextFactory _dbContextFactory; + private readonly ApplicationDbContext _context; + private readonly ILoggingService _logger; + private readonly S3UploadService _s3Service; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly UpdateLogHelper _updateLogHelper; + private readonly IMapper _mapper; + private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); + private static readonly string Collection = "ExpensesModificationLog"; + public ExpensesService( + IDbContextFactory dbContextFactory, + ApplicationDbContext context, + IServiceScopeFactory serviceScopeFactory, + UpdateLogHelper updateLogHelper, + ILoggingService logger, + S3UploadService s3Service, + IMapper mapper) + { + _dbContextFactory = dbContextFactory; + _context = context; + _logger = logger; + _serviceScopeFactory = serviceScopeFactory; + _updateLogHelper = updateLogHelper; + _s3Service = s3Service; + _mapper = mapper; + } + + + /// + /// Retrieves a paginated list of expenses based on user permissions and optional filters. + /// + /// A URL-encoded JSON string containing filter criteria. See . + /// The number of records to return per page. + /// The page number to retrieve. + /// A paginated list of expenses. + public async Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber) + { + try + { + _logger.LogInfo( + "Attempting to fetch expenses list for PageNumber: {PageNumber}, PageSize: {PageSize} with Filter: {Filter}", + pageNumber, pageSize, filter ?? ""); + + // 1. --- Get User Permissions --- + if (loggedInEmployee == null) + { + // This is an authentication/authorization issue. The user should be logged in. + _logger.LogWarning("Could not find an employee for the current logged-in user."); + return ApiResponse.ErrorResponse("User not found or not authenticated.", 403); + } + Guid loggedInEmployeeId = loggedInEmployee.Id; + + var hasViewSelfPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseViewSelf, loggedInEmployeeId); + }); + + var hasViewAllPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseViewAll, loggedInEmployeeId); + }); + + await Task.WhenAll(hasViewSelfPermissionTask, hasViewAllPermissionTask); + + // 2. --- Build Base Query and Apply Permissions --- + // Start with a base IQueryable. Filters will be chained onto this. + var expensesQuery = _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + + // Apply permission-based filtering BEFORE any other filters or pagination. + if (hasViewAllPermissionTask.Result) + { + // User has 'View All' permission, no initial restriction on who created the expense. + _logger.LogInfo("User {EmployeeId} has 'View All' permission.", loggedInEmployeeId); + } + else if (hasViewSelfPermissionTask.Result) + { + // User only has 'View Self' permission, so restrict the query to their own expenses. + _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); + } + else + { + // User has neither required permission. Deny access. + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployeeId); + return ApiResponse.SuccessResponse(new List(), "You do not have permission to view any expenses.", 200); + } + + // 3. --- Deserialize Filter and Apply --- + ExpensesFilter? expenseFilter = TryDeserializeFilter(filter); + + if (expenseFilter != null) + { + // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + { + expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + } + + if (expenseFilter.ProjectIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId)); + } + + if (expenseFilter.StatusIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.StatusIds.Contains(e.StatusId)); + } + + if (expenseFilter.PaidById?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.PaidById.Contains(e.PaidById)); + } + + // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. + if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermissionTask.Result) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); + } + } + + // 4. --- Apply Ordering and Pagination --- + // This should be the last step before executing the query. + var paginatedQuery = expensesQuery + .OrderByDescending(e => e.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize); + + // 5. --- Execute Query and Map Results --- + var expensesList = await paginatedQuery.ToListAsync(); + + if (!expensesList.Any()) + { + _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployeeId); + return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); + } + + var response = _mapper.Map>(expensesList); + + // 6. --- Efficiently Fetch and Append 'Next Status' Information --- + var statusIds = expensesList.Select(e => e.StatusId).Distinct().ToList(); + + var statusMappings = await _context.ExpensesStatusMapping + .Include(sm => sm.NextStatus) + .Where(sm => statusIds.Contains(sm.StatusId)) + .ToListAsync(); + + // Use a Lookup for efficient O(1) mapping. This is much better than repeated `.Where()` in a loop. + var statusMapLookup = statusMappings.ToLookup(sm => sm.StatusId); + + foreach (var expense in response) + { + if (expense.Status?.Id != null && statusMapLookup.Contains(expense.Status.Id)) + { + expense.NextStatus = statusMapLookup[expense.Status.Id] + .Select(sm => _mapper.Map(sm.NextStatus)) + .ToList(); + } + else + { + expense.NextStatus = new List(); // Ensure it's never null + } + } + + // 7. --- Return Final Success Response --- + var message = $"{response.Count} expense records fetched successfully."; + _logger.LogInfo(message); + return ApiResponse.SuccessResponse(response, message, 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while fetching list expenses"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching list expenses"); + return ApiResponse.ErrorResponse("Error Occured", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } + } + + public string Get(int id) + { + return "value"; + } + + /// + /// Creates a new expense entry along with its bill attachments. + /// This operation is transactional and performs validations and file uploads concurrently for optimal performance + /// by leveraging async/await without unnecessary thread-pool switching via Task.Run. + /// + /// The data transfer object containing expense details and attachments. + /// An IActionResult indicating the result of the creation operation. + public async Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId) + { + _logger.LogDebug("Starting CreateExpense for Project {ProjectId}", dto.ProjectId); + // The entire operation is wrapped in a transaction to ensure data consistency. + await using var transaction = await _context.Database.BeginTransactionAsync(); + + try + { + // 1. Authorization & Validation: Run all I/O-bound checks concurrently using factories for safety. + + // PERMISSION CHECKS: Use IServiceScopeFactory for thread-safe access to scoped services. + var hasUploadPermissionTask = Task.Run(async () => // Task.Run is acceptable here to create a new scope, but let's do it cleaner. + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseUpload, loggedInEmployee.Id); + }); + + var hasProjectPermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasProjectPermission(loggedInEmployee, dto.ProjectId); + }); + + // VALIDATION CHECKS: Use IDbContextFactory for thread-safe, parallel database queries. + // Each task gets its own DbContext instance. + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == dto.ProjectId); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == dto.PaidById); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == dto.ExpensesTypeId); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == dto.PaymentModeId); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .FirstOrDefaultAsync(es => es.StatusId == Draft && es.Status != null); + }); + + + // Await all prerequisite checks at once. + await Task.WhenAll( + hasUploadPermissionTask, hasProjectPermissionTask, + projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask + ); + + // 2. Aggregate and Check Results + if (!await hasUploadPermissionTask || !await hasProjectPermissionTask) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} on project {ProjectId}.", loggedInEmployee.Id, dto.ProjectId); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to upload expenses for this project.", 403); + } + + var validationErrors = new List(); + var project = await projectTask; + var expenseType = await expenseTypeTask; + var paymentMode = await paymentModeTask; + var statusMapping = await statusMappingTask; + var paidBy = await paidByTask; + + if (project == null) validationErrors.Add("Project not found."); + if (paidBy == null) validationErrors.Add("Paid by employee not found"); + if (expenseType == null) validationErrors.Add("Expense Type not found."); + if (paymentMode == null) validationErrors.Add("Payment Mode not found."); + if (statusMapping == null) validationErrors.Add("Default status 'Draft' not found."); + + if (validationErrors.Any()) + { + await transaction.RollbackAsync(); + var errorMessage = string.Join(" ", validationErrors); + _logger.LogWarning("Expense creation failed due to validation errors: {ValidationErrors}", errorMessage); + return ApiResponse.ErrorResponse("Invalid input data.", errorMessage, 400); + } + + // 3. Entity Creation + var expense = _mapper.Map(dto); + expense.CreatedById = loggedInEmployee.Id; + expense.CreatedAt = DateTime.UtcNow; + expense.TenantId = tenantId; + expense.IsActive = true; + expense.StatusId = Draft; + + _context.Expenses.Add(expense); + + // 4. Process Attachments + if (dto.BillAttachments?.Any() ?? false) + { + await ProcessAndUploadAttachmentsAsync(dto.BillAttachments, expense, loggedInEmployee.Id, tenantId); + } + + // 5. Database Commit + await _context.SaveChangesAsync(); + + // 6. Transaction Commit + await transaction.CommitAsync(); + + var response = _mapper.Map(expense); + response.PaidBy = _mapper.Map(paidBy); + response.Project = _mapper.Map(project); + response.Status = _mapper.Map(statusMapping!.Status); + response.NextStatus = _mapper.Map>(statusMapping!.NextStatus); + response.PaymentMode = _mapper.Map(paymentMode); + response.ExpensesType = _mapper.Map(expenseType); + + _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); + return ApiResponse.SuccessResponse(response, "Expense created successfully.", 201); + } + catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); + return ApiResponse.ErrorResponse("Invalid Request Data.", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 400); + } + catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); + return ApiResponse.ErrorResponse("An internal server error occurred.", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } + } + + public async Task> ChangeStatus(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId) + { + + var existingExpense = await _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.StatusId != model.StatusId && e.TenantId == tenantId); + + if (existingExpense == null) + { + return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); + } + + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.NextStatusId == model.StatusId && s.TenantId == tenantId); + }); + var statusPermissionMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping.Where(sp => sp.StatusId == model.StatusId).ToListAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(statusMappingTask, statusPermissionMappingTask); + + var statusMapping = await statusMappingTask; + var statusPermissions = await statusPermissionMappingTask; + if (statusMapping == null) + { + return ApiResponse.ErrorResponse("There is no follow-up status for currect status"); + } + if (statusPermissions.Any()) + { + foreach (var sp in statusPermissions) + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + + if (!await permissionService.HasPermission(sp.PermissionId, loggedInEmployee.Id)) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to change status of expense from status {StatusId} to {NextStatusId}", + loggedInEmployee.Id, statusMapping.StatusId, statusMapping.NextStatusId); + return ApiResponse.ErrorResponse("You do not have permission", "Access Denied", 403); + } + } + } + else if (existingExpense.CreatedById != loggedInEmployee.Id) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to change status of expense from status {StatusId} to {NextStatusId}", + loggedInEmployee.Id, statusMapping.StatusId, statusMapping.NextStatusId); + return ApiResponse.ErrorResponse("You do not have permission", "Access Denied", 403); + } + var existingEntity = _updateLogHelper.EntityToBsonDocument(existingExpense); + + existingExpense.StatusId = statusMapping.NextStatusId; + existingExpense.Status = statusMapping.NextStatus; + + _context.ExpenseLogs.Add(new ExpenseLog + { + ExpenseId = existingExpense.Id, + Action = statusMapping.NextStatus!.Name, + UpdatedById = loggedInEmployee.Id, + Comment = model.Comment + }); + + + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateConcurrencyException dbEx) + { + _logger.LogError(dbEx, "Error occured while update status of expanse."); + return ApiResponse.ErrorResponse("Error occured while update status of expanse.", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + try + { + var updateLog = new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntity, + UpdatedAt = DateTime.UtcNow + }; + var mongoDBTask = Task.Run(async () => + { + await _updateLogHelper.PushToUpdateLogsAsync(updateLog, Collection); + }); + + var getNextStatusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId); + }); + + await Task.WhenAll(mongoDBTask, getNextStatusTask); + + var getNextStatus = await getNextStatusTask; + + var response = _mapper.Map(existingExpense); + if (getNextStatus != null) + { + response.NextStatus = _mapper.Map>(getNextStatus.NextStatus); + } + + return ApiResponse.SuccessResponse(response); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while Saving old entity in mongoDb"); + return ApiResponse.ErrorResponse("Error occured while update status of expanse.", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + innerexcption = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } + } + /// + /// Changes the status of an expense record, performing validation, permission checks, and logging. + /// + /// The DTO containing the expense ID and the target status ID. + /// The employee performing the action. + /// The ID of the tenant owning the expense. + /// An ApiResponse containing the updated expense details or an error. + public async Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId) + { + // --- 1. Fetch Existing Expense --- + // We include all related entities needed for the final response mapping to avoid multiple database trips. + // The query also ensures we don't process a request if the status is already the one requested. + var existingExpense = await _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.StatusId != model.StatusId && e.TenantId == tenantId); + + if (existingExpense == null) + { + // Use structured logging for better searchability. + _logger.LogWarning("Attempted to change status for a non-existent or already-updated expense. ExpenseId: {ExpenseId}, TenantId: {TenantId}", model.ExpenseId, tenantId); + return ApiResponse.ErrorResponse("Expense not found or status is already set.", "Expense not found", 404); + } + + _logger.LogInfo("Initiating status change for ExpenseId: {ExpenseId} from StatusId: {OldStatusId} to {NewStatusId}", + existingExpense.Id, existingExpense.StatusId, model.StatusId); + + // --- 2. Concurrently Check Prerequisites --- + // We run status validation and permission fetching in parallel for efficiency. + // Using Task.Run with an async lambda is the standard way to start a concurrent, + // CPU- or I/O-bound operation on a background thread. + + // Task to validate if the requested status change is a valid transition. + var statusMappingTask = Task.Run(async () => + { + // 'await using' ensures the DbContext created by the factory is properly disposed + // within the scope of this background task. + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId && s.TenantId == tenantId); + }); + + // Task to fetch all permissions required for the *target* status. + var statusPermissionMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .Where(sp => sp.StatusId == model.StatusId && sp.TenantId == tenantId) + .ToListAsync(); + }); + + // Await both tasks to complete concurrently. + await Task.WhenAll(statusMappingTask, statusPermissionMappingTask); + + // Now you can safely get the results. + var statusMapping = await statusMappingTask; + var statusPermissions = await statusPermissionMappingTask; + + // --- 3. Validate Status Transition and Permissions --- + if (statusMapping == null) + { + _logger.LogWarning("Invalid status transition attempted for ExpenseId: {ExpenseId}. From StatusId: {FromStatusId} to {ToStatusId}", + existingExpense.Id, existingExpense.StatusId, model.StatusId); + return ApiResponse.ErrorResponse("This status change is not allowed.", "Invalid Transition", 400); + } + + // Check permissions. The logic is: + // 1. If the target status has specific permissions defined, the user must have at least one of them. + // 2. If no permissions are defined for the target status, only the original creator of the expense can change it. + bool hasPermission = false; + if (statusPermissions.Any()) + { + // Using a scope to resolve scoped services like PermissionServices. + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + foreach (var sp in statusPermissions) + { + if (await permissionService.HasPermission(sp.PermissionId, loggedInEmployee.Id)) + { + hasPermission = true; + break; // User has one of the required permissions, no need to check further. + } + } + } + else if (existingExpense.CreatedById == loggedInEmployee.Id) + { + // Fallback: If no permissions are required for the status, allow the creator to make the change. + hasPermission = true; + } + + if (!hasPermission) + { + _logger.LogWarning("Access DENIED for EmployeeId: {EmployeeId} attempting to change status of ExpenseId: {ExpenseId} to StatusId: {NewStatusId}", + loggedInEmployee.Id, existingExpense.Id, model.StatusId); + return ApiResponse.ErrorResponse("You do not have the required permissions to perform this action.", "Access Denied", 403); + } + + // --- 4. Update Expense and Add Log (in a transaction) --- + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); // Capture state for audit log BEFORE changes. + + existingExpense.StatusId = statusMapping.NextStatusId; + existingExpense.Status = statusMapping.NextStatus; // Assigning the included entity for the response mapping. + + _context.ExpenseLogs.Add(new ExpenseLog + { + ExpenseId = existingExpense.Id, + Action = $"Status changed to '{statusMapping.NextStatus!.Name}'", + UpdatedById = loggedInEmployee.Id, + Comment = model.Comment, + TenantId = tenantId + }); + + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("Successfully updated status for ExpenseId: {ExpenseId} to StatusId: {NewStatusId}", existingExpense.Id, existingExpense.StatusId); + } + catch (DbUpdateConcurrencyException dbEx) + { + // This error occurs if the record was modified by someone else after we fetched it. + _logger.LogError(dbEx, "Concurrency conflict while updating status for ExpenseId: {ExpenseId}. The record may have been modified by another user.", existingExpense.Id); + return ApiResponse.ErrorResponse("The expense was modified by another user. Please refresh and try again.", "Concurrency Error", 409); // 409 Conflict is appropriate + } + + // --- 5. Perform Post-Save Actions (Audit Log and Fetching Next State for UI) --- + try + { + // Task to save the detailed audit log to a separate system (e.g., MongoDB). + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + // Task to get all possible next statuses from the *new* current state to help the UI. + // NOTE: This now fetches a list of all possible next states, which is more useful for a UI. + var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(t => + { + var dbContext = t.Result; + return dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId) + .Select(s => s.NextStatus) // Select only the status object + .ToListAsync() + .ContinueWith(res => + { + dbContext.Dispose(); // Ensure the context is disposed + return res.Result; + }); + }).Unwrap(); + + await Task.WhenAll(mongoDBTask, getNextStatusesTask); + + var nextPossibleStatuses = await getNextStatusesTask; + + var response = _mapper.Map(existingExpense); + if (nextPossibleStatuses != null) + { + // The response DTO should have a property like: public List NextAvailableStatuses { get; set; } + response.NextStatus = _mapper.Map>(nextPossibleStatuses); + } + + return ApiResponse.SuccessResponse(response); + } + catch (Exception ex) + { + // This catch block handles errors from post-save operations like MongoDB logging. + // The primary update was successful, but we must log this failure. + _logger.LogError(ex, "Error occurred during post-save operations for ExpenseId: {ExpenseId} (e.g., audit logging). The primary status change was successful.", existingExpense.Id); + + // We can still return a success response because the main operation succeeded, + // but we should not block the user for a failed audit log. + // Alternatively, if audit logging is critical, you could return an error. + // Here, we choose to return success but log the ancillary failure. + var response = _mapper.Map(existingExpense); + return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); + } + } + public async Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId) + { + var exsitingExpense = await _context.Expenses.FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); + + + if (exsitingExpense == null) + { + return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); + } + _mapper.Map(model, exsitingExpense); + _context.Entry(exsitingExpense).State = EntityState.Modified; + + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("Successfully updated project {ProjectId} by user {UserId}.", id, loggedInEmployee.Id); + } + catch (DbUpdateConcurrencyException ex) + { + // --- Step 3: Handle Concurrency Conflicts --- + // This happens if another user modified the project after we fetched it. + _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); + return ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409); + } + var response = _mapper.Map(exsitingExpense); + return ApiResponse.SuccessResponse(response); + } + + public void Delete(int id) + { + } + #region =================================================================== Helper Functions =================================================================== + + /// + /// 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 ExpensesFilter? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + ExpensesFilter? 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; + } + + /// + /// Processes and uploads attachments concurrently, then adds the resulting entities to the main DbContext. + /// + private async Task ProcessAndUploadAttachmentsAsync(IEnumerable attachments, Expenses expense, Guid employeeId, Guid tenantId) + { + // Pre-validate all attachments to fail fast before any uploads. + foreach (var attachment in attachments) + { + if (string.IsNullOrWhiteSpace(attachment.Base64Data) || !_s3Service.IsBase64String(attachment.Base64Data)) + { + throw new ArgumentException($"Invalid or missing Base64 data for attachment: {attachment.FileName ?? "N/A"}"); + } + } + + var batchId = Guid.NewGuid(); + + // Create a list of tasks to be executed concurrently. + var processingTasks = attachments.Select(attachment => + ProcessSingleAttachmentAsync(attachment, expense, employeeId, tenantId, batchId) + ).ToList(); + + var results = await Task.WhenAll(processingTasks); + + // This part is thread-safe as it runs after all concurrent tasks are complete. + foreach (var (document, billAttachment) in results) + { + _context.Documents.Add(document); + _context.BillAttachments.Add(billAttachment); + } + _logger.LogInfo("{AttachmentCount} attachments processed and staged for saving.", results.Length); + } + + /// + /// Handles the logic for a single attachment: upload to S3 and create corresponding entities. + /// + private async Task<(Document document, BillAttachments billAttachment)> ProcessSingleAttachmentAsync( + FileUploadModel attachment, Expenses expense, Guid employeeId, Guid tenantId, Guid batchId) + { + var base64Data = attachment.Base64Data!.Contains(',') ? attachment.Base64Data[(attachment.Base64Data.IndexOf(",") + 1)..] : attachment.Base64Data; + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + var fileName = _s3Service.GenerateFileName(fileType, expense.Id, "Expense"); + var objectKey = $"tenant-{tenantId}/project-{expense.ProjectId}/Expenses/{fileName}"; + + // Await the I/O-bound upload operation directly. + await _s3Service.UploadFileAsync(base64Data, fileType, objectKey); + _logger.LogInfo("Uploaded file to S3 with key: {ObjectKey}", objectKey); + + return CreateAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); + } + + + /// + /// A private static helper method to create Document and BillAttachment entities. + /// This remains unchanged as it's a pure data-shaping method. + /// + private static (Document document, BillAttachments billAttachment) CreateAttachmentEntities( + Guid batchId, Guid expenseId, Guid uploadedById, Guid tenantId, string s3Key, FileUploadModel attachmentDto) + { + var document = new Document + { + BatchId = batchId, + UploadedById = uploadedById, + FileName = attachmentDto.FileName ?? "", + ContentType = attachmentDto.ContentType ?? "", + S3Key = s3Key, + FileSize = attachmentDto.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }; + var billAttachment = new BillAttachments { Document = document, ExpensesId = expenseId, TenantId = tenantId }; + return (document, billAttachment); + } + + #endregion + } +} diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs new file mode 100644 index 0000000..2cf2721 --- /dev/null +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -0,0 +1,14 @@ +using Marco.Pms.Model.Dtos.Expenses; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Utilities; + +namespace Marco.Pms.Services.Service.ServiceInterfaces +{ + public interface IExpensesService + { + Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber); + Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); + Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); + } +} diff --git a/Marco.Pms.Services/appsettings.Development.json b/Marco.Pms.Services/appsettings.Development.json index 030c450..579b059 100644 --- a/Marco.Pms.Services/appsettings.Development.json +++ b/Marco.Pms.Services/appsettings.Development.json @@ -46,8 +46,9 @@ "Region": "us-east-1", "BucketName": "testenv-marco-pms-documents" }, - "MongoDB": { - "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", - "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" - } + "MongoDB": { + "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", + "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500", + "ModificationConnectionString": "mongodb://localhost:27017/ModificationLog?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" + } } From 1fffde6d7fbb737c914dc30a55b8dc59da8fa850 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 18:39:34 +0530 Subject: [PATCH 019/125] Solved the database transcation error --- Marco.Pms.Services/Service/ExpensesService.cs | 18 ++-- .../appsettings.Production.json | 89 ++++++++++--------- 2 files changed, 51 insertions(+), 56 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 71dfe33..9411443 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -250,8 +250,6 @@ namespace Marco.Pms.Services.Service public async Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId) { _logger.LogDebug("Starting CreateExpense for Project {ProjectId}", dto.ProjectId); - // The entire operation is wrapped in a transaction to ensure data consistency. - await using var transaction = await _context.Database.BeginTransactionAsync(); try { @@ -301,7 +299,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .FirstOrDefaultAsync(es => es.StatusId == Draft && es.Status != null); + .Where(es => es.StatusId == Draft && es.Status != null).ToListAsync(); }); @@ -329,11 +327,10 @@ namespace Marco.Pms.Services.Service if (paidBy == null) validationErrors.Add("Paid by employee not found"); if (expenseType == null) validationErrors.Add("Expense Type not found."); if (paymentMode == null) validationErrors.Add("Payment Mode not found."); - if (statusMapping == null) validationErrors.Add("Default status 'Draft' not found."); + if (!statusMapping.Any()) validationErrors.Add("Default status 'Draft' not found."); if (validationErrors.Any()) { - await transaction.RollbackAsync(); var errorMessage = string.Join(" ", validationErrors); _logger.LogWarning("Expense creation failed due to validation errors: {ValidationErrors}", errorMessage); return ApiResponse.ErrorResponse("Invalid input data.", errorMessage, 400); @@ -358,14 +355,13 @@ namespace Marco.Pms.Services.Service // 5. Database Commit await _context.SaveChangesAsync(); - // 6. Transaction Commit - await transaction.CommitAsync(); - + var status = statusMapping.Select(sm => sm.Status).FirstOrDefault(); + var nextStatus = statusMapping.Select(sm => sm.NextStatus).ToList(); var response = _mapper.Map(expense); response.PaidBy = _mapper.Map(paidBy); response.Project = _mapper.Map(project); - response.Status = _mapper.Map(statusMapping!.Status); - response.NextStatus = _mapper.Map>(statusMapping!.NextStatus); + response.Status = _mapper.Map(status); + response.NextStatus = _mapper.Map>(nextStatus); response.PaymentMode = _mapper.Map(paymentMode); response.ExpensesType = _mapper.Map(expenseType); @@ -374,7 +370,6 @@ namespace Marco.Pms.Services.Service } catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation { - await transaction.RollbackAsync(); _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("Invalid Request Data.", new { @@ -391,7 +386,6 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { - await transaction.RollbackAsync(); _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("An internal server error occurred.", new { diff --git a/Marco.Pms.Services/appsettings.Production.json b/Marco.Pms.Services/appsettings.Production.json index 0abe3f1..f164fdf 100644 --- a/Marco.Pms.Services/appsettings.Production.json +++ b/Marco.Pms.Services/appsettings.Production.json @@ -1,46 +1,47 @@ { - "Cors": { - "AllowedOrigins": "https://app.marcoaiot.com", - "AllowedMethods": "*", - "AllowedHeaders": "*" - }, - "Environment": { - "Name": "Production", - "Title": "" - }, - "ConnectionStrings": { - "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" - }, - "SmtpSettings": { - "SmtpServer": "smtp.gmail.com", - "Port": 587, - "SenderName": "MarcoAIOT", - "SenderEmail": "marcoioitsoft@gmail.com", - "Password": "qrtq wfuj hwpp fhqr" - }, - "AppSettings": { - "WebFrontendUrl": "https://app.marcoaiot.com", - "ImagesBaseUrl": "https://app.marcoaiot.com" - }, - "Jwt": { - "Issuer": "https://app.marcoaiot.com", - "Audience": "https://app.marcoaiot.com", - "Key": "sworffishhkjfa9dnfdndfu33infnajfj", - "ExpiresInMinutes": 60, - "RefreshTokenExpiresInDays": 7 - }, - "MailingList": { - "RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com", - "ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" - }, - "AWS": { - "AccessKey": "AKIARZDBH3VDMSUUY2FX", - "SecretKey": "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", - "Region": "us-east-1", - "BucketName": "testenv-marco-pms-documents" - }, - "MongoDB": { - "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", - "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches" - } + "Cors": { + "AllowedOrigins": "https://app.marcoaiot.com", + "AllowedMethods": "*", + "AllowedHeaders": "*" + }, + "Environment": { + "Name": "Production", + "Title": "" + }, + "ConnectionStrings": { + "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" + }, + "SmtpSettings": { + "SmtpServer": "smtp.gmail.com", + "Port": 587, + "SenderName": "MarcoAIOT", + "SenderEmail": "marcoioitsoft@gmail.com", + "Password": "qrtq wfuj hwpp fhqr" + }, + "AppSettings": { + "WebFrontendUrl": "https://app.marcoaiot.com", + "ImagesBaseUrl": "https://app.marcoaiot.com" + }, + "Jwt": { + "Issuer": "https://app.marcoaiot.com", + "Audience": "https://app.marcoaiot.com", + "Key": "sworffishhkjfa9dnfdndfu33infnajfj", + "ExpiresInMinutes": 60, + "RefreshTokenExpiresInDays": 7 + }, + "MailingList": { + "RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com", + "ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" + }, + "AWS": { + "AccessKey": "AKIARZDBH3VDMSUUY2FX", + "SecretKey": "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", + "Region": "us-east-1", + "BucketName": "testenv-marco-pms-documents" + }, + "MongoDB": { + "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", + "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches", + "ModificationConnectionString": "mongodb://localhost:27017/ModificationLog?authSource=admin&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" + } } \ No newline at end of file From 2449d2a5182c334e0d0a73aee6fd97a9842d0d42 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 18:50:08 +0530 Subject: [PATCH 020/125] FIxed the database transaction error --- Marco.Pms.Services/Service/ExpensesService.cs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 9411443..9ea150f 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -250,6 +250,8 @@ namespace Marco.Pms.Services.Service public async Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId) { _logger.LogDebug("Starting CreateExpense for Project {ProjectId}", dto.ProjectId); + // The entire operation is wrapped in a transaction to ensure data consistency. + await using var transaction = await _context.Database.BeginTransactionAsync(); try { @@ -299,7 +301,14 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => es.StatusId == Draft && es.Status != null).ToListAsync(); + .Where(es => es.StatusId == Draft && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }) + .FirstOrDefaultAsync(); }); @@ -327,10 +336,11 @@ namespace Marco.Pms.Services.Service if (paidBy == null) validationErrors.Add("Paid by employee not found"); if (expenseType == null) validationErrors.Add("Expense Type not found."); if (paymentMode == null) validationErrors.Add("Payment Mode not found."); - if (!statusMapping.Any()) validationErrors.Add("Default status 'Draft' not found."); + if (statusMapping == null) validationErrors.Add("Default status 'Draft' not found."); if (validationErrors.Any()) { + await transaction.RollbackAsync(); var errorMessage = string.Join(" ", validationErrors); _logger.LogWarning("Expense creation failed due to validation errors: {ValidationErrors}", errorMessage); return ApiResponse.ErrorResponse("Invalid input data.", errorMessage, 400); @@ -355,13 +365,14 @@ namespace Marco.Pms.Services.Service // 5. Database Commit await _context.SaveChangesAsync(); - var status = statusMapping.Select(sm => sm.Status).FirstOrDefault(); - var nextStatus = statusMapping.Select(sm => sm.NextStatus).ToList(); + // 6. Transaction Commit + await transaction.CommitAsync(); + var response = _mapper.Map(expense); response.PaidBy = _mapper.Map(paidBy); response.Project = _mapper.Map(project); - response.Status = _mapper.Map(status); - response.NextStatus = _mapper.Map>(nextStatus); + response.Status = _mapper.Map(statusMapping!.Status); + response.NextStatus = _mapper.Map>(statusMapping.NextStatus); response.PaymentMode = _mapper.Map(paymentMode); response.ExpensesType = _mapper.Map(expenseType); @@ -370,6 +381,7 @@ namespace Marco.Pms.Services.Service } catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation { + await transaction.RollbackAsync(); _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("Invalid Request Data.", new { @@ -386,6 +398,7 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { + await transaction.RollbackAsync(); _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("An internal server error occurred.", new { From 5be154a9f14974354f859053cfd3659aeb55d789 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 22 Jul 2025 09:58:13 +0530 Subject: [PATCH 021/125] Added totalPages , totalEntites and Currect page in response of get expenses list --- .../Data/ApplicationDbContext.cs | 2 +- ...8_Added_Expense_Related_Tables.Designer.cs | 2 +- ...0721124928_Added_Expense_Related_Tables.cs | 5 +- .../ApplicationDbContextModelSnapshot.cs | 2 +- Marco.Pms.Services/Service/ExpensesService.cs | 164 ++---------------- 5 files changed, 20 insertions(+), 155 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 85ea792..82e1e68 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -395,7 +395,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Draft", DisplayName = "Draft", Description = "Expense has been created but not yet submitted.", - Color = "#212529", + Color = "#6c757d", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index ad83f62..27368b8 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1934,7 +1934,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Color = "#212529", + Color = "#6c757d", Description = "Expense has been created but not yet submitted.", DisplayName = "Draft", IsActive = true, diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index 1d1e2f9..22a0444 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -373,7 +372,7 @@ namespace Marco.Pms.DataAccess.Migrations columns: new[] { "Id", "Color", "Description", "DisplayName", "IsActive", "IsSystem", "Name", "TenantId" }, values: new object[,] { - { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#212529", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#6c757d", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#0dcaf0", "Review is completed, waiting for action of approver.", "Approve", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#198754", "Expense has been settled.", "Paid", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#0d6efd", "Reviewer is currently reviewing the expense.", "Review", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index c15054f..242e512 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1931,7 +1931,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Color = "#212529", + Color = "#6c757d", Description = "Expense has been created but not yet submitted.", DisplayName = "Draft", IsActive = true, diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 9ea150f..8d1c974 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -155,6 +155,9 @@ namespace Marco.Pms.Services.Service // 4. --- Apply Ordering and Pagination --- // This should be the last step before executing the query. + + var totalEntites = await expensesQuery.CountAsync(); + var paginatedQuery = expensesQuery .OrderByDescending(e => e.CreatedAt) .Skip((pageNumber - 1) * pageSize) @@ -169,7 +172,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); } - var response = _mapper.Map>(expensesList); + var expenseVM = _mapper.Map>(expensesList); // 6. --- Efficiently Fetch and Append 'Next Status' Information --- var statusIds = expensesList.Select(e => e.StatusId).Distinct().ToList(); @@ -182,7 +185,7 @@ namespace Marco.Pms.Services.Service // Use a Lookup for efficient O(1) mapping. This is much better than repeated `.Where()` in a loop. var statusMapLookup = statusMappings.ToLookup(sm => sm.StatusId); - foreach (var expense in response) + foreach (var expense in expenseVM) { if (expense.Status?.Id != null && statusMapLookup.Contains(expense.Status.Id)) { @@ -197,8 +200,17 @@ namespace Marco.Pms.Services.Service } // 7. --- Return Final Success Response --- - var message = $"{response.Count} expense records fetched successfully."; + var message = $"{expenseVM.Count} expense records fetched successfully."; _logger.LogInfo(message); + var totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); + var response = new + { + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalEntites, + Data = expenseVM, + }; + return ApiResponse.SuccessResponse(response, message, 200); } catch (DbUpdateException dbEx) @@ -415,152 +427,6 @@ namespace Marco.Pms.Services.Service } } - public async Task> ChangeStatus(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId) - { - - var existingExpense = await _context.Expenses - .Include(e => e.ExpensesType) - .Include(e => e.Project) - .Include(e => e.PaidBy) - .ThenInclude(e => e!.JobRole) - .Include(e => e.PaymentMode) - .Include(e => e.Status) - .Include(e => e.CreatedBy) - .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.StatusId != model.StatusId && e.TenantId == tenantId); - - if (existingExpense == null) - { - return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); - } - - var statusMappingTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMapping - .Include(s => s.NextStatus) - .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.NextStatusId == model.StatusId && s.TenantId == tenantId); - }); - var statusPermissionMappingTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.StatusPermissionMapping.Where(sp => sp.StatusId == model.StatusId).ToListAsync(); - }); - - // Await all prerequisite checks at once. - await Task.WhenAll(statusMappingTask, statusPermissionMappingTask); - - var statusMapping = await statusMappingTask; - var statusPermissions = await statusPermissionMappingTask; - if (statusMapping == null) - { - return ApiResponse.ErrorResponse("There is no follow-up status for currect status"); - } - if (statusPermissions.Any()) - { - foreach (var sp in statusPermissions) - { - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - - if (!await permissionService.HasPermission(sp.PermissionId, loggedInEmployee.Id)) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to change status of expense from status {StatusId} to {NextStatusId}", - loggedInEmployee.Id, statusMapping.StatusId, statusMapping.NextStatusId); - return ApiResponse.ErrorResponse("You do not have permission", "Access Denied", 403); - } - } - } - else if (existingExpense.CreatedById != loggedInEmployee.Id) - { - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to change status of expense from status {StatusId} to {NextStatusId}", - loggedInEmployee.Id, statusMapping.StatusId, statusMapping.NextStatusId); - return ApiResponse.ErrorResponse("You do not have permission", "Access Denied", 403); - } - var existingEntity = _updateLogHelper.EntityToBsonDocument(existingExpense); - - existingExpense.StatusId = statusMapping.NextStatusId; - existingExpense.Status = statusMapping.NextStatus; - - _context.ExpenseLogs.Add(new ExpenseLog - { - ExpenseId = existingExpense.Id, - Action = statusMapping.NextStatus!.Name, - UpdatedById = loggedInEmployee.Id, - Comment = model.Comment - }); - - - try - { - await _context.SaveChangesAsync(); - } - catch (DbUpdateConcurrencyException dbEx) - { - _logger.LogError(dbEx, "Error occured while update status of expanse."); - return ApiResponse.ErrorResponse("Error occured while update status of expanse.", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - innerexcption = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); - } - try - { - var updateLog = new UpdateLogsObject - { - EntityId = existingExpense.Id.ToString(), - UpdatedById = loggedInEmployee.Id.ToString(), - OldObject = existingEntity, - UpdatedAt = DateTime.UtcNow - }; - var mongoDBTask = Task.Run(async () => - { - await _updateLogHelper.PushToUpdateLogsAsync(updateLog, Collection); - }); - - var getNextStatusTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMapping - .Include(s => s.NextStatus) - .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId); - }); - - await Task.WhenAll(mongoDBTask, getNextStatusTask); - - var getNextStatus = await getNextStatusTask; - - var response = _mapper.Map(existingExpense); - if (getNextStatus != null) - { - response.NextStatus = _mapper.Map>(getNextStatus.NextStatus); - } - - return ApiResponse.SuccessResponse(response); - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occured while Saving old entity in mongoDb"); - return ApiResponse.ErrorResponse("Error occured while update status of expanse.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - innerexcption = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); - } - } /// /// Changes the status of an expense record, performing validation, permission checks, and logging. /// From cfbfbf2e2b01e60bb5bdaf66d511c0a888968d50 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 22 Jul 2025 10:53:55 +0530 Subject: [PATCH 022/125] Renamed the CacheHelper To Helpers --- .../CacheHelper}/EmployeeCache.cs | 4 +- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 24 +++++ .../CacheHelper}/ProjectCache.cs | 5 +- .../CacheHelper}/ReportCache.cs | 4 +- .../Marco.Pms.Helpers.csproj | 0 .../UpdateLogHelper.cs | 4 +- Marco.Pms.Model/Marco.Pms.Model.csproj | 28 ++--- .../EmployeePermissionMongoDB.cs | 2 +- .../Expenses/ExpenseDetailsMongoDB.cs | 6 ++ .../{ => Masters}/StatusMasterMongoDB.cs | 2 +- .../WorkCategoryMasterMongoDB.cs | 2 +- .../{ => Project}/ActivityMasterMongoDB.cs | 2 +- .../{ => Project}/BuildingMongoDB.cs | 2 +- .../{ => Project}/FloorMongoDB.cs | 2 +- .../{ => Project}/ProjectMongoDB.cs | 4 +- .../{ => Project}/WorkAreaInfoMongoDB.cs | 2 +- .../{ => Project}/WorkAreaMongoDB.cs | 2 +- .../{ => Project}/WorkItemMongoDB.cs | 4 +- .../ProjectReportEmailMongoDB.cs | 2 +- .../{ => Utility}/UpdateLogsObject.cs | 2 +- Marco.Pms.Services/Dockerfile | 2 +- .../Helpers/CacheUpdateHelper.cs | 7 +- Marco.Pms.Services/Helpers/GeneralHelper.cs | 1 + Marco.Pms.Services/Helpers/ReportHelper.cs | 2 +- .../MappingProfiles/MappingProfile.cs | 3 +- Marco.Pms.Services/Marco.Pms.Services.csproj | 90 ++++++++-------- Marco.Pms.Services/Program.cs | 3 +- Marco.Pms.Services/Service/ExpensesService.cs | 102 ++++++++++++++++-- Marco.Pms.Services/Service/ProjectServices.cs | 2 +- marco.pms.api.sln | 2 +- 30 files changed, 220 insertions(+), 97 deletions(-) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/EmployeeCache.cs (98%) create mode 100644 Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/ProjectCache.cs (99%) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers/CacheHelper}/ReportCache.cs (95%) rename Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj => Marco.Pms.Helpers/Marco.Pms.Helpers.csproj (100%) rename {Marco.Pms.CacheHelper => Marco.Pms.Helpers}/UpdateLogHelper.cs (97%) rename Marco.Pms.Model/MongoDBModels/{ => Employees}/EmployeePermissionMongoDB.cs (91%) create mode 100644 Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs rename Marco.Pms.Model/MongoDBModels/{ => Masters}/StatusMasterMongoDB.cs (74%) rename Marco.Pms.Model/MongoDBModels/{ => Masters}/WorkCategoryMasterMongoDB.cs (82%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/ActivityMasterMongoDB.cs (80%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/BuildingMongoDB.cs (94%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/FloorMongoDB.cs (93%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/ProjectMongoDB.cs (88%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkAreaInfoMongoDB.cs (89%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkAreaMongoDB.cs (89%) rename Marco.Pms.Model/MongoDBModels/{ => Project}/WorkItemMongoDB.cs (87%) rename Marco.Pms.Model/MongoDBModels/{ => Utility}/ProjectReportEmailMongoDB.cs (91%) rename Marco.Pms.Model/MongoDBModels/{ => Utility}/UpdateLogsObject.cs (90%) diff --git a/Marco.Pms.CacheHelper/EmployeeCache.cs b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs similarity index 98% rename from Marco.Pms.CacheHelper/EmployeeCache.cs rename to Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs index 7c7f4b4..560748c 100644 --- a/Marco.Pms.CacheHelper/EmployeeCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs @@ -1,9 +1,9 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Employees; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers.CacheHelper { public class EmployeeCache { diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs new file mode 100644 index 0000000..8036c5f --- /dev/null +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -0,0 +1,24 @@ +using Marco.Pms.Model.MongoDBModels.Employees; +using Microsoft.Extensions.Configuration; +using MongoDB.Driver; + +namespace Marco.Pms.Helpers.CacheHelper +{ + public class ExpenseCache + { + private readonly IMongoCollection _collection; + public ExpenseCache(IConfiguration configuration) + { + + var connectionString = configuration["MongoDB:ConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + var mongoDB = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + _collection = mongoDB.GetCollection("Expenses"); + } + public async Task AddExpenseToCacheAsync() + { + + } + } +} diff --git a/Marco.Pms.CacheHelper/ProjectCache.cs b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs similarity index 99% rename from Marco.Pms.CacheHelper/ProjectCache.cs rename to Marco.Pms.Helpers/CacheHelper/ProjectCache.cs index 10eb623..f5721aa 100644 --- a/Marco.Pms.CacheHelper/ProjectCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs @@ -1,13 +1,14 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MongoDB.Bson; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers { public class ProjectCache { diff --git a/Marco.Pms.CacheHelper/ReportCache.cs b/Marco.Pms.Helpers/CacheHelper/ReportCache.cs similarity index 95% rename from Marco.Pms.CacheHelper/ReportCache.cs rename to Marco.Pms.Helpers/CacheHelper/ReportCache.cs index 66611a8..009bdf2 100644 --- a/Marco.Pms.CacheHelper/ReportCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ReportCache.cs @@ -1,8 +1,8 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Microsoft.Extensions.Configuration; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers.CacheHelper { public class ReportCache { diff --git a/Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj b/Marco.Pms.Helpers/Marco.Pms.Helpers.csproj similarity index 100% rename from Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj rename to Marco.Pms.Helpers/Marco.Pms.Helpers.csproj diff --git a/Marco.Pms.CacheHelper/UpdateLogHelper.cs b/Marco.Pms.Helpers/UpdateLogHelper.cs similarity index 97% rename from Marco.Pms.CacheHelper/UpdateLogHelper.cs rename to Marco.Pms.Helpers/UpdateLogHelper.cs index ddea104..5c7595f 100644 --- a/Marco.Pms.CacheHelper/UpdateLogHelper.cs +++ b/Marco.Pms.Helpers/UpdateLogHelper.cs @@ -1,10 +1,10 @@ -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Microsoft.Extensions.Configuration; using MongoDB.Bson; using MongoDB.Driver; using System.Collections; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers { public class UpdateLogHelper { diff --git a/Marco.Pms.Model/Marco.Pms.Model.csproj b/Marco.Pms.Model/Marco.Pms.Model.csproj index a1a21a5..332759a 100644 --- a/Marco.Pms.Model/Marco.Pms.Model.csproj +++ b/Marco.Pms.Model/Marco.Pms.Model.csproj @@ -1,20 +1,20 @@ - + - - net7.0 - enable - enable - + + net7.0 + enable + enable + - + - - - - + + + + - - - + + + diff --git a/Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs similarity index 91% rename from Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs index fab2b84..07da2ef 100644 --- a/Marco.Pms.Model/MongoDBModels/EmployeePermissionMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Employees/EmployeePermissionMongoDB.cs @@ -1,6 +1,6 @@ using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Employees { [BsonIgnoreExtraElements] public class EmployeePermissionMongoDB diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs new file mode 100644 index 0000000..e4a1c5c --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -0,0 +1,6 @@ +namespace Marco.Pms.Model.MongoDBModels.Expenses +{ + public class ExpenseDetailsMongoDB + { + } +} diff --git a/Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs similarity index 74% rename from Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs index 77e8eb5..96a56a6 100644 --- a/Marco.Pms.Model/MongoDBModels/StatusMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/StatusMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Masters { public class StatusMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs similarity index 82% rename from Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs index 4ea4682..4270a25 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkCategoryMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/WorkCategoryMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Masters { public class WorkCategoryMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs similarity index 80% rename from Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs index cc77d96..ecb88c1 100644 --- a/Marco.Pms.Model/MongoDBModels/ActivityMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/ActivityMasterMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class ActivityMasterMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs similarity index 94% rename from Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs index 786ceb5..640be18 100644 --- a/Marco.Pms.Model/MongoDBModels/BuildingMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/BuildingMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class BuildingMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs similarity index 93% rename from Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs index 15d3060..debb663 100644 --- a/Marco.Pms.Model/MongoDBModels/FloorMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/FloorMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class FloorMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs similarity index 88% rename from Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs index aac0e2c..c2600bd 100644 --- a/Marco.Pms.Model/MongoDBModels/ProjectMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs @@ -1,4 +1,6 @@ -namespace Marco.Pms.Model.MongoDBModels +using Marco.Pms.Model.MongoDBModels.Masters; + +namespace Marco.Pms.Model.MongoDBModels.Project { public class ProjectMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs similarity index 89% rename from Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs index da1001b..97da737 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkAreaInfoMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaInfoMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkAreaInfoMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs similarity index 89% rename from Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs index 412c940..d768e3b 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkAreaMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkAreaMongoDB.cs @@ -1,4 +1,4 @@ -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkAreaMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs similarity index 87% rename from Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs index cf798f3..00aa168 100644 --- a/Marco.Pms.Model/MongoDBModels/WorkItemMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/WorkItemMongoDB.cs @@ -1,4 +1,6 @@ -namespace Marco.Pms.Model.MongoDBModels +using Marco.Pms.Model.MongoDBModels.Masters; + +namespace Marco.Pms.Model.MongoDBModels.Project { public class WorkItemMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs similarity index 91% rename from Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs rename to Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs index 519ea4f..928b814 100644 --- a/Marco.Pms.Model/MongoDBModels/ProjectReportEmailMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Utility/ProjectReportEmailMongoDB.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Utility { public class ProjectReportEmailMongoDB { diff --git a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs b/Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs similarity index 90% rename from Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs rename to Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs index 3153c78..30f87d6 100644 --- a/Marco.Pms.Model/MongoDBModels/UpdateLogsObject.cs +++ b/Marco.Pms.Model/MongoDBModels/Utility/UpdateLogsObject.cs @@ -1,7 +1,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; -namespace Marco.Pms.Model.MongoDBModels +namespace Marco.Pms.Model.MongoDBModels.Utility { public class UpdateLogsObject { diff --git a/Marco.Pms.Services/Dockerfile b/Marco.Pms.Services/Dockerfile index 2aa24ea..50b9865 100644 --- a/Marco.Pms.Services/Dockerfile +++ b/Marco.Pms.Services/Dockerfile @@ -19,7 +19,7 @@ COPY ["Marco.Pms.Services/Marco.Pms.Services.csproj", "Marco.Pms.Services/"] COPY ["Marco.Pms.DataAccess/Marco.Pms.DataAccess.csproj", "Marco.Pms.DataAccess/"] COPY ["Marco.Pms.Model/Marco.Pms.Model.csproj", "Marco.Pms.Model/"] COPY ["Marco.Pms.Utility/Marco.Pms.Utility.csproj", "Marco.Pms.Utility/"] -COPY ["Marco.Pms.CacheHelper/Marco.Pms.CacheHelper.csproj", "Marco.Pms.CacheHelper/"] +COPY ["Marco.Pms.Helpers/Marco.Pms.Helpers.csproj", "Marco.Pms.Helpers/"] RUN dotnet restore "./Marco.Pms.Services/Marco.Pms.Services.csproj" COPY . . WORKDIR "/src/Marco.Pms.Services" diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index d942ab1..1c4deb0 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1,7 +1,10 @@ -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; +using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Projects; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index c2f8fe4..b5bf7dc 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -1,5 +1,6 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; diff --git a/Marco.Pms.Services/Helpers/ReportHelper.cs b/Marco.Pms.Services/Helpers/ReportHelper.cs index 35dcf8b..5a174e6 100644 --- a/Marco.Pms.Services/Helpers/ReportHelper.cs +++ b/Marco.Pms.Services/Helpers/ReportHelper.cs @@ -2,7 +2,7 @@ using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Mail; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Report; using MarcoBMS.Services.Service; diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index ea34613..33c64bb 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -5,7 +5,8 @@ using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; diff --git a/Marco.Pms.Services/Marco.Pms.Services.csproj b/Marco.Pms.Services/Marco.Pms.Services.csproj index 2feafaf..5b30ba4 100644 --- a/Marco.Pms.Services/Marco.Pms.Services.csproj +++ b/Marco.Pms.Services/Marco.Pms.Services.csproj @@ -1,52 +1,52 @@ - - net8.0 - enable - enable - True - False - 55935cea-fc40-40f8-be42-da094f06b11f - Linux - + + net8.0 + enable + enable + True + False + 55935cea-fc40-40f8-be42-da094f06b11f + Linux + - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + - - - - - - + + + + + + PreserveNewest diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 6b6bfa5..9e8e736 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,4 +1,5 @@ -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; +using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Entitlements; diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 8d1c974..26f3b21 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1,12 +1,12 @@ using AutoMapper; -using Marco.Pms.CacheHelper; +using Marco.Pms.Helpers; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Expanses; @@ -29,6 +29,7 @@ namespace Marco.Pms.Services.Service private readonly UpdateLogHelper _updateLogHelper; private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); + private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); private static readonly string Collection = "ExpensesModificationLog"; public ExpensesService( IDbContextFactory dbContextFactory, @@ -391,9 +392,25 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Successfully created Expense {ExpenseId} for Project {ProjectId}.", expense.Id, expense.ProjectId); return ApiResponse.SuccessResponse(response, "Expense created successfully.", 201); } - catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation + catch (DbUpdateException dbEx) { await transaction.RollbackAsync(); + _logger.LogError(dbEx, "Databsae Exception occured while adding expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + innerexcption = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation + { _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("Invalid Request Data.", new { @@ -410,7 +427,6 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { - await transaction.RollbackAsync(); _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); return ApiResponse.ErrorResponse("An internal server error occurred.", new { @@ -615,15 +631,29 @@ namespace Marco.Pms.Services.Service } public async Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId) { - var exsitingExpense = await _context.Expenses.FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); + var existingExpense = await _context.Expenses + .Include(e => e.ExpensesType) + .Include(e => e.Project) + .Include(e => e.PaidBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.Status) + .Include(e => e.CreatedBy) + .FirstOrDefaultAsync(e => + e.Id == model.Id && + e.CreatedById == loggedInEmployee.Id && + (e.StatusId == Draft || e.StatusId == Rejected) && + e.TenantId == tenantId); - if (exsitingExpense == null) + if (existingExpense == null) { return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); } - _mapper.Map(model, exsitingExpense); - _context.Entry(exsitingExpense).State = EntityState.Modified; + + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); // Capture state for audit log BEFORE changes + _mapper.Map(model, existingExpense); + _context.Entry(existingExpense).State = EntityState.Modified; try { @@ -637,8 +667,60 @@ namespace Marco.Pms.Services.Service _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); return ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409); } - var response = _mapper.Map(exsitingExpense); - return ApiResponse.SuccessResponse(response); + try + { + // Task to save the detailed audit log to a separate system (e.g., MongoDB). + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + // Task to get all possible next statuses from the *new* current state to help the UI. + // NOTE: This now fetches a list of all possible next states, which is more useful for a UI. + var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(t => + { + var dbContext = t.Result; + return dbContext.ExpensesStatusMapping + .Include(s => s.NextStatus) + .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId) + .Select(s => s.NextStatus) // Select only the status object + .ToListAsync() + .ContinueWith(res => + { + dbContext.Dispose(); // Ensure the context is disposed + return res.Result; + }); + }).Unwrap(); + + await Task.WhenAll(mongoDBTask, getNextStatusesTask); + + var nextPossibleStatuses = await getNextStatusesTask; + + var response = _mapper.Map(existingExpense); + if (nextPossibleStatuses != null) + { + // The response DTO should have a property like: public List NextAvailableStatuses { get; set; } + response.NextStatus = _mapper.Map>(nextPossibleStatuses); + } + + return ApiResponse.SuccessResponse(response); + } + catch (Exception ex) + { + // This catch block handles errors from post-save operations like MongoDB logging. + // The primary update was successful, but we must log this failure. + _logger.LogError(ex, "Error occurred during post-save operations for ExpenseId: {ExpenseId} (e.g., audit logging). The primary status change was successful.", existingExpense.Id); + + // We can still return a success response because the main operation succeeded, + // but we should not block the user for a failed audit log. + // Alternatively, if audit logging is critical, you could return an error. + // Here, we choose to return success but log the ancillary failure. + var response = _mapper.Map(existingExpense); + return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); + } } public void Delete(int id) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 9406ec9..894ba81 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -5,7 +5,7 @@ using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; diff --git a/marco.pms.api.sln b/marco.pms.api.sln index 424b709..cb6aefe 100644 --- a/marco.pms.api.sln +++ b/marco.pms.api.sln @@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marco.Pms.Utility", "Marco. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.Services", "Marco.Pms.Services\Marco.Pms.Services.csproj", "{27A83653-5B7F-4135-9886-01594D54AFAE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.CacheHelper", "Marco.Pms.CacheHelper\Marco.Pms.CacheHelper.csproj", "{1A105C22-4ED7-4F54-8834-6923DDD96852}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marco.Pms.Helpers", "Marco.Pms.Helpers\Marco.Pms.Helpers.csproj", "{1A105C22-4ED7-4F54-8834-6923DDD96852}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From d536b9c99c3ff09a0287dada19fbc676c2eefe27 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 22 Jul 2025 14:23:39 +0530 Subject: [PATCH 023/125] Added proper namespances and changed the getProjectdetails to getProjectDetailsOld --- Marco.Pms.Services/Controllers/ProjectController.cs | 2 +- Marco.Pms.Services/Controllers/ReportController.cs | 2 +- Marco.Pms.Services/Helpers/GeneralHelper.cs | 2 +- Marco.Pms.Services/Program.cs | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 796fd39..2c03d69 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -135,7 +135,7 @@ namespace MarcoBMS.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _projectServices.GetProjectDetailsAsync(id, tenantId, loggedInEmployee); + var response = await _projectServices.GetProjectDetailsOldAsync(id, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Controllers/ReportController.cs b/Marco.Pms.Services/Controllers/ReportController.cs index a46c391..e71061c 100644 --- a/Marco.Pms.Services/Controllers/ReportController.cs +++ b/Marco.Pms.Services/Controllers/ReportController.cs @@ -1,7 +1,7 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Mail; using Marco.Pms.Model.Mail; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Helpers; using MarcoBMS.Services.Helpers; diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index b5bf7dc..8669811 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -1,5 +1,5 @@ using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 9e8e736..a89e16e 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,6 +1,6 @@ +using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers; using Marco.Pms.Helpers.CacheHelper; -using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Utilities; @@ -193,6 +193,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion // Singleton services (one instance for the app's lifetime) From 73cf85a1cc262d7fc5e556c775823b3b41f1ebfc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 09:56:01 +0530 Subject: [PATCH 024/125] Added cache to expenses get list and create expense APIs --- .../CacheHelper/EmployeeCache.cs | 9 +- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 89 +++++- Marco.Pms.Helpers/CacheHelper/ProjectCache.cs | 15 +- .../Dtos/Projects/ProjectAllocationDot.cs | 2 - .../Employees/BasicEmployeeMongoDB.cs | 13 + .../Expenses/ExpenseDetailsMongoDB.cs | 22 ++ .../Masters/ExpensesStatusMasterMongoDB.cs | 13 + .../Masters/ExpensesTypeMasterMongoDB.cs | 11 + .../Masters/PaymentModeMatserMongoDB.cs | 10 + .../Project/ProjectBasicMongoDB.cs | 10 + .../Helpers/CacheUpdateHelper.cs | 188 ++++++++++++- .../MappingProfiles/MappingProfile.cs | 134 +++++++++ Marco.Pms.Services/Service/ExpensesService.cs | 256 +++++++++++------- 13 files changed, 642 insertions(+), 130 deletions(-) create mode 100644 Marco.Pms.Model/MongoDBModels/Employees/BasicEmployeeMongoDB.cs create mode 100644 Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs create mode 100644 Marco.Pms.Model/MongoDBModels/Masters/ExpensesTypeMasterMongoDB.cs create mode 100644 Marco.Pms.Model/MongoDBModels/Masters/PaymentModeMatserMongoDB.cs create mode 100644 Marco.Pms.Model/MongoDBModels/Project/ProjectBasicMongoDB.cs diff --git a/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs index 560748c..3e08484 100644 --- a/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/EmployeeCache.cs @@ -27,6 +27,7 @@ namespace Marco.Pms.Helpers.CacheHelper var update = Builders.Update .AddToSetEach(e => e.ApplicationRoleIds, newRoleIds) + .Set(r => r.ExpireAt, DateTime.UtcNow.Date.AddDays(1)) .AddToSetEach(e => e.PermissionIds, newPermissionIds); var options = new UpdateOptions { IsUpsert = true }; @@ -46,6 +47,7 @@ namespace Marco.Pms.Helpers.CacheHelper var filter = Builders.Filter.Eq(e => e.Id, employeeId.ToString()); var update = Builders.Update + .Set(r => r.ExpireAt, DateTime.UtcNow.Date.AddDays(1)) .AddToSetEach(e => e.ProjectIds, newprojectIds); var result = await _collection.UpdateOneAsync(filter, update, new UpdateOptions { IsUpsert = true }); @@ -187,17 +189,12 @@ namespace Marco.Pms.Helpers.CacheHelper // A private method to handle the one-time setup of the collection's indexes. private async Task InitializeCollectionAsync() { - // 1. Define the TTL (Time-To-Live) index on the 'ExpireAt' field. var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); var indexOptions = new CreateIndexOptions { - // This tells MongoDB to automatically delete documents when their 'ExpireAt' time is reached. - ExpireAfter = TimeSpan.FromSeconds(0) + ExpireAfter = TimeSpan.Zero // required for fixed expiration time }; var indexModel = new CreateIndexModel(indexKeys, indexOptions); - - // 2. Create the index. This is an idempotent operation if the index already exists. - // Use CreateOneAsync since we are only creating a single index. await _collection.Indexes.CreateOneAsync(indexModel); } } diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 8036c5f..5e63178 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -1,4 +1,5 @@ -using Marco.Pms.Model.MongoDBModels.Employees; +using Marco.Pms.Model.MongoDBModels.Expenses; +using Marco.Pms.Model.Utilities; using Microsoft.Extensions.Configuration; using MongoDB.Driver; @@ -6,7 +7,7 @@ namespace Marco.Pms.Helpers.CacheHelper { public class ExpenseCache { - private readonly IMongoCollection _collection; + private readonly IMongoCollection _collection; public ExpenseCache(IConfiguration configuration) { @@ -14,11 +15,91 @@ namespace Marco.Pms.Helpers.CacheHelper var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); // Your MongoDB connection string var mongoDB = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name - _collection = mongoDB.GetCollection("Expenses"); + _collection = mongoDB.GetCollection("Expenses"); } - public async Task AddExpenseToCacheAsync() + public async Task AddExpenseToCacheAsync(ExpenseDetailsMongoDB expense) { + await _collection.InsertOneAsync(expense); + await InitializeCollectionAsync(); + } + public async Task AddExpensesListToCacheAsync(List expenses) + { + // 1. Add a guard clause to avoid an unnecessary database call for an empty list. + if (expenses == null || !expenses.Any()) + { + return; + } + + // 2. Perform the insert operation. This is the only responsibility of this method. + await _collection.InsertManyAsync(expenses); + await InitializeCollectionAsync(); + } + public async Task<(int totalPages, long totalCount, List expenseList)> GetExpenseListFromCacheAsync(Guid tenantId, Guid loggedInEmployeeId, bool viewAll, + bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? expenseFilter) + { + var filterBuilder = Builders.Filter; + var filter = filterBuilder.Empty; + + // Permission-based filter + if (!viewAll && viewSelf) + { + filter &= filterBuilder.Eq(e => e.CreatedById, loggedInEmployeeId.ToString()); + } + + // Apply filters + if (expenseFilter != null) + { + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + { + filter &= filterBuilder.Gte(e => e.CreatedAt, expenseFilter.StartDate.Value.Date) + & filterBuilder.Lte(e => e.CreatedAt, expenseFilter.EndDate.Value.Date.AddDays(1).AddTicks(-1)); + } + + if (expenseFilter.ProjectIds?.Any() == true) + { + filter &= filterBuilder.In(e => e.ProjectId, expenseFilter.ProjectIds.Select(p => p.ToString()).ToList()); + } + + if (expenseFilter.StatusIds?.Any() == true) + { + filter &= filterBuilder.In(e => e.StatusId, expenseFilter.StatusIds.Select(p => p.ToString()).ToList()); + } + + if (expenseFilter.PaidById?.Any() == true) + { + filter &= filterBuilder.In(e => e.PaidById, expenseFilter.PaidById.Select(p => p.ToString()).ToList()); + } + + if (expenseFilter.CreatedByIds?.Any() == true && viewAll) + { + filter &= filterBuilder.In(e => e.CreatedById, expenseFilter.CreatedByIds.Select(p => p.ToString()).ToList()); + } + } + + // Total count + var totalCount = await _collection.CountDocumentsAsync(filter); + var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); + + // Fetch paginated data + var expenses = await _collection + .Find(filter) + .Skip((pageNumber - 1) * pageSize) + .Limit(pageSize) + .SortByDescending(e => e.CreatedAt) + .ToListAsync(); + + return (totalPages, totalCount, expenses); + } + private async Task InitializeCollectionAsync() + { + var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); + var indexOptions = new CreateIndexOptions + { + ExpireAfter = TimeSpan.Zero // required for fixed expiration time + }; + var indexModel = new CreateIndexModel(indexKeys, indexOptions); + await _collection.Indexes.CreateOneAsync(indexModel); } } } diff --git a/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs index f5721aa..bee37af 100644 --- a/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs @@ -30,13 +30,7 @@ namespace Marco.Pms.Helpers { await _projectCollection.InsertOneAsync(projectDetails); - var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); - var indexOptions = new CreateIndexOptions - { - ExpireAfter = TimeSpan.Zero // required for fixed expiration time - }; - var indexModel = new CreateIndexModel(indexKeys, indexOptions); - await _projectCollection.Indexes.CreateOneAsync(indexModel); + await InitializeCollectionAsync(); } public async Task AddProjectDetailsListToCache(List projectDetailsList) @@ -53,17 +47,12 @@ namespace Marco.Pms.Helpers } private async Task InitializeCollectionAsync() { - // 1. Define the TTL (Time-To-Live) index on the 'ExpireAt' field. var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); var indexOptions = new CreateIndexOptions { - // This tells MongoDB to automatically delete documents when their 'ExpireAt' time is reached. - ExpireAfter = TimeSpan.FromSeconds(0) + ExpireAfter = TimeSpan.Zero // required for fixed expiration time }; var indexModel = new CreateIndexModel(indexKeys, indexOptions); - - // 2. Create the index. This is an idempotent operation if the index already exists. - // Use CreateOneAsync since we are only creating a single index. await _projectCollection.Indexes.CreateOneAsync(indexModel); } public async Task UpdateProjectDetailsOnlyToCache(Project project, StatusMaster projectStatus) diff --git a/Marco.Pms.Model/Dtos/Projects/ProjectAllocationDot.cs b/Marco.Pms.Model/Dtos/Projects/ProjectAllocationDot.cs index 7a1fd91..0805e62 100644 --- a/Marco.Pms.Model/Dtos/Projects/ProjectAllocationDot.cs +++ b/Marco.Pms.Model/Dtos/Projects/ProjectAllocationDot.cs @@ -5,7 +5,6 @@ public Guid EmpID { get; set; } public Guid JobRoleId { get; set; } public Guid ProjectId { get; set; } - public bool Status { get; set; } } @@ -14,7 +13,6 @@ { public Guid ProjectId { get; set; } public Guid JobRoleId { get; set; } - public bool Status { get; set; } } } diff --git a/Marco.Pms.Model/MongoDBModels/Employees/BasicEmployeeMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Employees/BasicEmployeeMongoDB.cs new file mode 100644 index 0000000..bff2e62 --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Employees/BasicEmployeeMongoDB.cs @@ -0,0 +1,13 @@ +namespace Marco.Pms.Model.MongoDBModels.Employees +{ + public class BasicEmployeeMongoDB + { + public string Id { get; set; } = string.Empty; + public string? FirstName { get; set; } + public string? LastName { get; set; } + public byte[]? Photo { get; set; } + public string? JobRoleId { get; set; } + public string? JobRoleName { get; set; } + public string TenantId { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs index e4a1c5c..c0ffdd9 100644 --- a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -2,5 +2,27 @@ { public class ExpenseDetailsMongoDB { + public string Id { get; set; } = string.Empty; + public string ProjectId { get; set; } = string.Empty; + public string ExpensesTypeId { get; set; } = string.Empty; + public string PaymentModeId { get; set; } = string.Empty; + public string PaidById { get; set; } = string.Empty; + public string CreatedById { get; set; } = string.Empty; + public DateTime TransactionDate { get; set; } + public DateTime CreatedAt { get; set; } + public DateTime ExpireAt { get; set; } = DateTime.UtcNow.Date.AddDays(1); + public string SupplerName { get; set; } = string.Empty; + public double Amount { get; set; } + public string StatusId { get; set; } = string.Empty; + public bool PreApproved { get; set; } = false; + public string? TransactionId { get; set; } + public string Description { get; set; } = string.Empty; + public string? Location { get; set; } + public List S3Key { get; set; } = new List(); + public List? ThumbS3Key { get; set; } + public string? GSTNumber { get; set; } + public int? NoOfPersons { get; set; } + public bool IsActive { get; set; } = true; + public string TenantId { get; set; } = string.Empty; } } diff --git a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs new file mode 100644 index 0000000..8fe3910 --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs @@ -0,0 +1,13 @@ +namespace Marco.Pms.Model.MongoDBModels.Masters +{ + public class ExpensesStatusMasterMongoDB + { + public string Id { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string? Color { get; set; } + public bool IsSystem { get; set; } = false; + public string TenantId { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesTypeMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesTypeMasterMongoDB.cs new file mode 100644 index 0000000..d4b80ad --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesTypeMasterMongoDB.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.MongoDBModels.Masters +{ + public class ExpensesTypeMasterMongoDB + { + public string Id { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public bool NoOfPersonsRequired { get; set; } + public string Description { get; set; } = string.Empty; + public string TenantId { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/MongoDBModels/Masters/PaymentModeMatserMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/PaymentModeMatserMongoDB.cs new file mode 100644 index 0000000..0d7a74b --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Masters/PaymentModeMatserMongoDB.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.MongoDBModels.Masters +{ + public class PaymentModeMatserMongoDB + { + public string Id { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string TenantId { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/MongoDBModels/Project/ProjectBasicMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ProjectBasicMongoDB.cs new file mode 100644 index 0000000..4d2bd6b --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Project/ProjectBasicMongoDB.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.MongoDBModels.Project +{ + public class ProjectBasicMongoDB + { + public string Id { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public string ShortName { get; set; } = string.Empty; + public string TenantId { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 1c4deb0..bbec308 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1,40 +1,58 @@ -using Marco.Pms.Helpers; -using Marco.Pms.Helpers.CacheHelper; +using AutoMapper; using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers; +using Marco.Pms.Helpers.CacheHelper; +using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; +using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.Utilities; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; +using MongoDB.Driver; using Project = Marco.Pms.Model.Projects.Project; namespace Marco.Pms.Services.Helpers { public class CacheUpdateHelper { + private readonly IDbContextFactory _dbContextFactory; + private readonly ApplicationDbContext _context; + private readonly IMapper _mapper; private readonly ProjectCache _projectCache; private readonly EmployeeCache _employeeCache; private readonly ReportCache _reportCache; + private readonly ExpenseCache _expenseCache; private readonly ILoggingService _logger; - private readonly IDbContextFactory _dbContextFactory; - private readonly ApplicationDbContext _context; private readonly GeneralHelper _generalHelper; + private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); + private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); - public CacheUpdateHelper(ProjectCache projectCache, EmployeeCache employeeCache, ReportCache reportCache, ILoggingService logger, - IDbContextFactory dbContextFactory, ApplicationDbContext context, GeneralHelper generalHelper) + public CacheUpdateHelper( + IMapper mapper, + ProjectCache projectCache, + EmployeeCache employeeCache, + ReportCache reportCache, + ExpenseCache expenseCache, + ILoggingService logger, + IDbContextFactory dbContextFactory, + ApplicationDbContext context, + GeneralHelper generalHelper) { + _mapper = mapper; _projectCache = projectCache; _employeeCache = employeeCache; _reportCache = reportCache; + _expenseCache = expenseCache; _logger = logger; _dbContextFactory = dbContextFactory; _context = context; _generalHelper = generalHelper; } - - // ------------------------------------ Project Details Cache --------------------------------------- + #region ======================================================= Project Details Cache ======================================================= public async Task AddProjectDetails(Project project) { @@ -507,7 +525,9 @@ namespace Marco.Pms.Services.Helpers } } - // ------------------------------------ Project Infrastructure Cache --------------------------------------- + #endregion + + #region ======================================================= Project Infrastructure Cache ======================================================= public async Task AddBuildngInfra(Guid projectId, Building? building = null, Floor? floor = null, WorkArea? workArea = null, Guid? buildingId = null) { @@ -573,7 +593,9 @@ namespace Marco.Pms.Services.Helpers } } - // ------------------------------------------------------- WorkItem ------------------------------------------------------- + #endregion + + #region ======================================================= WorkItem Cache ======================================================= public async Task?> GetWorkItemsByWorkAreaIds(List workAreaIds) { @@ -680,8 +702,10 @@ namespace Marco.Pms.Services.Helpers } } + #endregion + + #region ======================================================= Employee Profile Cache ======================================================= - // ------------------------------------ Employee Profile Cache --------------------------------------- public async Task AddApplicationRole(Guid employeeId, List roleIds) { // 1. Guard Clause: Avoid unnecessary database work if there are no roles to add. @@ -839,8 +863,146 @@ namespace Marco.Pms.Services.Helpers } } + #endregion - // ------------------------------------ Report Cache --------------------------------------- + #region ======================================================= Expenses Cache ======================================================= + public async Task AddExpenseByObjectAsync(Expenses expense) + { + var expenseCache = _mapper.Map(expense); + + try + { + var billAttachments = await _context.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), + ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + }) + .FirstOrDefaultAsync(); ; + if (billAttachments != null) + { + expenseCache.S3Key = billAttachments.S3Keys; + expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); + } + try + { + await _expenseCache.AddExpenseToCacheAsync(expenseCache); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while storing expense related table in cahce"); + } + + } + public async Task AddExpenseByIdAsync(Guid Id, Guid tenantId) + { + var expense = await _context.Expenses.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Id && e.TenantId == tenantId); + var expenseCache = _mapper.Map(expense); + if (expense != null) + { + try + { + var billAttachments = await _context.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), + ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + }) + .FirstOrDefaultAsync(); + if (billAttachments != null) + { + expenseCache.S3Key = billAttachments.S3Keys; + expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); + } + } + try + { + await _expenseCache.AddExpenseToCacheAsync(expenseCache); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while storing expense related table in cahce"); + } + + } + public async Task AddExpensesListToCache(List expenses) + { + var expensesCache = _mapper.Map>(expenses); + var expenseIds = expenses.Select(e => e.Id).ToList(); + try + { + var billAttachments = await _context.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => expenseIds.Contains(ba.ExpensesId) && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + ExpensesId = g.Key, + S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), + ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + }) + .ToListAsync(); + foreach (var expenseCache in expensesCache) + { + expenseCache.S3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.S3Keys).FirstOrDefault() ?? new List(); + expenseCache.ThumbS3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.ThumbS3Keys).FirstOrDefault(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); + } + + try + { + await _expenseCache.AddExpensesListToCacheAsync(expensesCache); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while saving the list of expenses to Cache"); + } + } + + public async Task<(int totalPages, long totalCount, List? expenseList)> GetExpenseListAsync(Guid tenantId, Guid loggedInEmployeeId, bool viewAll, + bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? filter) + { + try + { + var (totalPages, totalCount, expenseList) = await _expenseCache.GetExpenseListFromCacheAsync(tenantId, loggedInEmployeeId, viewAll, viewSelf, pageNumber, pageSize, filter); + if (expenseList.Any()) + { + return (totalPages, totalCount, expenseList); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching the list of expenses to Cache"); + } + return (0, 0, null); + } + + #endregion + + #region ======================================================= Report Cache ======================================================= public async Task?> GetProjectReportMail(bool IsSend) { @@ -866,5 +1028,7 @@ namespace Marco.Pms.Services.Helpers _logger.LogError(ex, "Error occured while adding project report mail bodys"); } } + + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 33c64bb..6e4ca8e 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -5,6 +5,8 @@ using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; +using Marco.Pms.Model.MongoDBModels.Employees; +using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; @@ -36,6 +38,23 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => new Guid(src.Id)) ); + CreateMap() + .ForMember( + dest => dest.Id, + // Explicitly and safely convert Guid Id to string Id + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => new Guid(src.Id))) + .ForMember( + dest => dest.ProjectStatusId, + opt => opt.MapFrom(src => Guid.Empty) + ); + CreateMap() .ForMember( dest => dest.Id, @@ -73,6 +92,27 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.JobRoleName, opt => opt.MapFrom(src => src.JobRole != null ? src.JobRole.Name : "")); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.JobRoleName, + opt => opt.MapFrom(src => src.JobRole != null ? src.JobRole.Name : "")) + .ForMember( + dest => dest.JobRoleId, + opt => opt.MapFrom(src => src.JobRoleId.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))) + .ForMember( + dest => dest.JobRoleId, + opt => opt.MapFrom(src => Guid.Parse(src.JobRoleId ?? ""))); #endregion #region ======================================================= Expenses ======================================================= @@ -80,6 +120,62 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.ProjectId, + opt => opt.MapFrom(src => src.ProjectId.ToString())) + .ForMember( + dest => dest.ExpensesTypeId, + opt => opt.MapFrom(src => src.ExpensesTypeId.ToString())) + .ForMember( + dest => dest.PaymentModeId, + opt => opt.MapFrom(src => src.PaymentModeId.ToString())) + .ForMember( + dest => dest.PaidById, + opt => opt.MapFrom(src => src.PaidById.ToString())) + .ForMember( + dest => dest.CreatedById, + opt => opt.MapFrom(src => src.CreatedById.ToString())) + .ForMember( + dest => dest.StatusId, + opt => opt.MapFrom(src => src.StatusId.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))) + .ForMember( + dest => dest.ProjectId, + opt => opt.MapFrom(src => Guid.Parse(src.ProjectId))) + .ForMember( + dest => dest.ExpensesTypeId, + opt => opt.MapFrom(src => Guid.Parse(src.ExpensesTypeId))) + .ForMember( + dest => dest.PaymentModeId, + opt => opt.MapFrom(src => Guid.Parse(src.PaymentModeId))) + .ForMember( + dest => dest.PaidById, + opt => opt.MapFrom(src => Guid.Parse(src.PaidById))) + .ForMember( + dest => dest.CreatedById, + opt => opt.MapFrom(src => Guid.Parse(src.CreatedById))) + .ForMember( + dest => dest.StatusId, + opt => opt.MapFrom(src => Guid.Parse(src.StatusId))) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => Guid.Parse(src.TenantId))); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))); #endregion @@ -93,6 +189,44 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))); + + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.ToString())) + .ForMember( + dest => dest.TenantId, + opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))); + + #endregion } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 26f3b21..d55b915 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1,7 +1,6 @@ using AutoMapper; -using Marco.Pms.Helpers; using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Helpers; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; @@ -12,10 +11,13 @@ using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Expanses; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; +using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; using System.Text.Json; +using Document = Marco.Pms.Model.DocumentManager.Document; namespace Marco.Pms.Services.Service { @@ -27,6 +29,7 @@ namespace Marco.Pms.Services.Service private readonly S3UploadService _s3Service; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly UpdateLogHelper _updateLogHelper; + private readonly CacheUpdateHelper _cache; private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); @@ -36,6 +39,7 @@ namespace Marco.Pms.Services.Service ApplicationDbContext context, IServiceScopeFactory serviceScopeFactory, UpdateLogHelper updateLogHelper, + CacheUpdateHelper cache, ILoggingService logger, S3UploadService s3Service, IMapper mapper) @@ -43,6 +47,7 @@ namespace Marco.Pms.Services.Service _dbContextFactory = dbContextFactory; _context = context; _logger = logger; + _cache = cache; _serviceScopeFactory = serviceScopeFactory; _updateLogHelper = updateLogHelper; _s3Service = s3Service; @@ -73,7 +78,8 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("User not found or not authenticated.", 403); } Guid loggedInEmployeeId = loggedInEmployee.Id; - + List expenseVM = new List(); + var totalEntites = 0; var hasViewSelfPermissionTask = Task.Run(async () => { using var scope = _serviceScopeFactory.CreateScope(); @@ -90,120 +96,103 @@ namespace Marco.Pms.Services.Service await Task.WhenAll(hasViewSelfPermissionTask, hasViewAllPermissionTask); - // 2. --- Build Base Query and Apply Permissions --- - // Start with a base IQueryable. Filters will be chained onto this. - var expensesQuery = _context.Expenses - .Include(e => e.ExpensesType) - .Include(e => e.Project) - .Include(e => e.PaidBy) - .ThenInclude(e => e!.JobRole) - .Include(e => e.PaymentMode) - .Include(e => e.Status) - .Include(e => e.CreatedBy) - .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. - - // Apply permission-based filtering BEFORE any other filters or pagination. - if (hasViewAllPermissionTask.Result) - { - // User has 'View All' permission, no initial restriction on who created the expense. - _logger.LogInfo("User {EmployeeId} has 'View All' permission.", loggedInEmployeeId); - } - else if (hasViewSelfPermissionTask.Result) - { - // User only has 'View Self' permission, so restrict the query to their own expenses. - _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); - expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); - } - else + if (!hasViewAllPermissionTask.Result && !hasViewSelfPermissionTask.Result) { // User has neither required permission. Deny access. _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployeeId); return ApiResponse.SuccessResponse(new List(), "You do not have permission to view any expenses.", 200); } - // 3. --- Deserialize Filter and Apply --- + + // 2. --- Deserialize Filter and Apply --- ExpensesFilter? expenseFilter = TryDeserializeFilter(filter); - if (expenseFilter != null) + var (totalPages, totalCount, expenseList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, + pageNumber, pageSize, expenseFilter); + + if (expenseList == null) { - // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. - if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + + // 3. --- Build Base Query and Apply Permissions --- + // Start with a base IQueryable. Filters will be chained onto this. + var expensesQuery = _context.Expenses + .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + + await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync()); + + // Apply permission-based filtering BEFORE any other filters or pagination. + + if (!hasViewAllPermissionTask.Result && hasViewSelfPermissionTask.Result) { - expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + // User only has 'View Self' permission, so restrict the query to their own expenses. + _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); } - if (expenseFilter.ProjectIds?.Any() == true) + if (expenseFilter != null) { - expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId)); + // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + { + expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + } + + if (expenseFilter.ProjectIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.ProjectIds.Contains(e.ProjectId)); + } + + if (expenseFilter.StatusIds?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.StatusIds.Contains(e.StatusId)); + } + + if (expenseFilter.PaidById?.Any() == true) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.PaidById.Contains(e.PaidById)); + } + + // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. + if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermissionTask.Result) + { + expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); + } + + + } - if (expenseFilter.StatusIds?.Any() == true) + // 4. --- Apply Ordering and Pagination --- + // This should be the last step before executing the query. + + totalEntites = await expensesQuery.CountAsync(); + + var paginatedQuery = expensesQuery + .OrderByDescending(e => e.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize); + + // 5. --- Execute Query and Map Results --- + var expensesList = await paginatedQuery.ToListAsync(); + + if (!expensesList.Any()) { - expensesQuery = expensesQuery.Where(e => expenseFilter.StatusIds.Contains(e.StatusId)); + _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployeeId); + return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); } - if (expenseFilter.PaidById?.Any() == true) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.PaidById.Contains(e.PaidById)); - } + expenseVM = await GetAllExpnesRelatedTables(expensesList); + - // Only allow filtering by 'CreatedBy' if the user has 'View All' permission. - if (expenseFilter.CreatedByIds?.Any() == true && hasViewAllPermissionTask.Result) - { - expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); - } } - - // 4. --- Apply Ordering and Pagination --- - // This should be the last step before executing the query. - - var totalEntites = await expensesQuery.CountAsync(); - - var paginatedQuery = expensesQuery - .OrderByDescending(e => e.CreatedAt) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize); - - // 5. --- Execute Query and Map Results --- - var expensesList = await paginatedQuery.ToListAsync(); - - if (!expensesList.Any()) + else { - _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployeeId); - return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); + expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList)); + totalEntites = (int)totalCount; } - - var expenseVM = _mapper.Map>(expensesList); - - // 6. --- Efficiently Fetch and Append 'Next Status' Information --- - var statusIds = expensesList.Select(e => e.StatusId).Distinct().ToList(); - - var statusMappings = await _context.ExpensesStatusMapping - .Include(sm => sm.NextStatus) - .Where(sm => statusIds.Contains(sm.StatusId)) - .ToListAsync(); - - // Use a Lookup for efficient O(1) mapping. This is much better than repeated `.Where()` in a loop. - var statusMapLookup = statusMappings.ToLookup(sm => sm.StatusId); - - foreach (var expense in expenseVM) - { - if (expense.Status?.Id != null && statusMapLookup.Contains(expense.Status.Id)) - { - expense.NextStatus = statusMapLookup[expense.Status.Id] - .Select(sm => _mapper.Map(sm.NextStatus)) - .ToList(); - } - else - { - expense.NextStatus = new List(); // Ensure it's never null - } - } - // 7. --- Return Final Success Response --- var message = $"{expenseVM.Count} expense records fetched successfully."; _logger.LogInfo(message); - var totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); var response = new { CurrentPage = pageNumber, @@ -211,7 +200,6 @@ namespace Marco.Pms.Services.Service TotalEntites = totalEntites, Data = expenseVM, }; - return ApiResponse.SuccessResponse(response, message, 200); } catch (DbUpdateException dbEx) @@ -381,6 +369,8 @@ namespace Marco.Pms.Services.Service // 6. Transaction Commit await transaction.CommitAsync(); + await _cache.AddExpenseByObjectAsync(expense); + var response = _mapper.Map(expense); response.PaidBy = _mapper.Map(paidBy); response.Project = _mapper.Map(project); @@ -728,6 +718,86 @@ namespace Marco.Pms.Services.Service } #region =================================================================== Helper Functions =================================================================== + private async Task> GetAllExpnesRelatedTables(List model) + { + List expenseList = new List(); + var projectIds = model.Select(m => m.ProjectId).ToList(); + var statusIds = model.Select(m => m.StatusId).ToList(); + var expensesTypeIds = model.Select(m => m.ExpensesTypeId).ToList(); + var paymentModeIds = model.Select(m => m.PaymentModeId).ToList(); + var createdByIds = model.Select(m => m.CreatedById).ToList(); + var paidByIds = model.Select(m => m.PaidById).ToList(); + + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync(); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync(); + }); + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync(); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync(); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync(); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + StatusId = g.Key, + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }).ToListAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask); + + var projects = await projectTask; + var expenseTypes = await expenseTypeTask; + var paymentModes = await paymentModeTask; + var statusMappings = await statusMappingTask; + var paidBys = await paidByTask; + var createdBys = await createdByTask; + + expenseList = model.Select(m => + { + var response = _mapper.Map(m); + + response.Project = projects.Where(p => p.Id == m.ProjectId).Select(p => _mapper.Map(p)).FirstOrDefault(); + response.PaidBy = paidBys.Where(p => p.Id == m.PaidById).Select(p => _mapper.Map(p)).FirstOrDefault(); + response.CreatedBy = createdBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); + response.Status = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map(s.Status)).FirstOrDefault(); + response.NextStatus = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); + response.PaymentMode = paymentModes.Where(pm => pm.Id == m.PaymentModeId).Select(pm => _mapper.Map(pm)).FirstOrDefault(); + response.ExpensesType = expenseTypes.Where(et => et.Id == m.ExpensesTypeId).Select(et => _mapper.Map(et)).FirstOrDefault(); + + return response; + }).ToList(); + + return expenseList; + } + /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). /// From 3083083148e434a6894b6edc481343aa16808dbf Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 10:51:58 +0530 Subject: [PATCH 025/125] Created the get Expense details API --- .../Data/ApplicationDbContext.cs | 14 +- .../20250501162003_Initmigration.Designer.cs | 2 +- .../20250501162003_Initmigration.cs | 2 +- ...0_Changed_DataType_ApproverdBY.Designer.cs | 2 +- ...0508055854_Added_IsSystem_Flag.Designer.cs | 2 +- ...dded_WorkCategory_Master_Table.Designer.cs | 2 +- ...y_For_WorkCategery_To_WorkItem.Designer.cs | 2 +- ...13_Changed_Freture_Permissions.Designer.cs | 2 +- ...Added_Directory_Related_Tables.Designer.cs | 2 +- ...ed_ContactProjectMapping_Table.Designer.cs | 2 +- ...53019_Fixed_Typo_Of_ColumnName.Designer.cs | 2 +- ...d_Feature_Directory_Management.Designer.cs | 2 +- ...5939_Added_Mail_Related_Tables.Designer.cs | 2 +- ..._Attendance_Feature_Permission.Designer.cs | 2 +- ...02139_Added_OTP_And_MPIN_Table.Designer.cs | 2 +- ...t_And_Removed_From_MailDetails.Designer.cs | 2 +- ...sUsed_FLag_In_OTPDetails_Table.Designer.cs | 2 +- ..._Name_Column_In_Projects_Table.Designer.cs | 2 +- ...43_Added_TaskAttachments_Table.Designer.cs | 2 +- ...ved_By_In_TaskAllocation_Table.Designer.cs | 2 +- ...orkItemForParentId_Description.Designer.cs | 2 +- ..._New_Status_Master_In_Progress.Designer.cs | 2 +- ...ontacts_And_ContactNotes_Table.Designer.cs | 2 +- ...e_Permissiom_View_All_Employee.Designer.cs | 2 +- ..._Permission_To_ViewTeamMembers.Designer.cs | 2 +- ..._ForeginKey_In_Decuments_Table.Designer.cs | 2 +- ...8_Added_Expense_Related_Tables.Designer.cs | 14 +- ...0721124928_Added_Expense_Related_Tables.cs | 12 +- .../ApplicationDbContextModelSnapshot.cs | 16 +-- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 11 ++ .../ViewModels/Expenses/ExpenseDetailsVM.cs | 31 +++++ .../Controllers/ExpenseController.cs | 6 +- .../Helpers/CacheUpdateHelper.cs | 62 +++++---- .../MappingProfiles/MappingProfile.cs | 6 + Marco.Pms.Services/Service/ExpensesService.cs | 122 +++++++++++++++++- .../ServiceInterfaces/IExpensesService.cs | 1 + 36 files changed, 261 insertions(+), 84 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 82e1e68..c01668f 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -215,7 +215,7 @@ namespace Marco.Pms.DataAccess.Data Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), Name = "In Review", Description = "These issues are currently under review", - ColorCode = "#6c757d", + ColorCode = "#8592a3", IsDefault = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") }, @@ -395,7 +395,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Draft", DisplayName = "Draft", Description = "Expense has been created but not yet submitted.", - Color = "#6c757d", + Color = "#8592a3", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -406,7 +406,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Review Pending", DisplayName = "Review", Description = "Reviewer is currently reviewing the expense.", - Color = "#0d6efd", + Color = "#696cff", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -417,7 +417,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Approval Pending", DisplayName = "Approve", Description = "Review is completed, waiting for action of approver.", - Color = "#0dcaf0", + Color = "#03c3ec", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -428,7 +428,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Rejected", DisplayName = "Reject", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", - Color = "#dc3545", + Color = "#ff3e1d", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -439,7 +439,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Process Pending", DisplayName = "Process", Description = "Approved expense is awaiting final payment.", - Color = "#ffc107", + Color = "#ffab00", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") @@ -450,7 +450,7 @@ namespace Marco.Pms.DataAccess.Data Name = "Processed", DisplayName = "Paid", Description = "Expense has been settled.", - Color = "#198754", + Color = "#71dd37", IsSystem = true, IsActive = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") diff --git a/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.Designer.cs index fcb6e0b..331a01e 100644 --- a/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.Designer.cs @@ -1274,7 +1274,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.cs b/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.cs index eb6b5d3..63c4e45 100644 --- a/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.cs +++ b/Marco.Pms.DataAccess/Migrations/20250501162003_Initmigration.cs @@ -1295,7 +1295,7 @@ namespace Marco.Pms.DataAccess.Migrations columns: new[] { "Id", "ColorCode", "Description", "IsDefault", "Name", "TenantId" }, values: new object[,] { - { new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), "#6c757d", "These issues are currently under review", true, "In Review", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), "#8592a3", "These issues are currently under review", true, "In Review", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), "#FFCC99", "This is a newly created issue.", true, "New", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), "#E6FF99", "Assigned to employee or team of employees", true, "Assigned", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), "#99E6FF", "These issues are currently in progress", true, "In Progress", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, diff --git a/Marco.Pms.DataAccess/Migrations/20250505121140_Changed_DataType_ApproverdBY.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250505121140_Changed_DataType_ApproverdBY.Designer.cs index 4ce716b..4f4da8c 100644 --- a/Marco.Pms.DataAccess/Migrations/20250505121140_Changed_DataType_ApproverdBY.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250505121140_Changed_DataType_ApproverdBY.Designer.cs @@ -1216,7 +1216,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250508055854_Added_IsSystem_Flag.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250508055854_Added_IsSystem_Flag.Designer.cs index a43da65..ca6478a 100644 --- a/Marco.Pms.DataAccess/Migrations/20250508055854_Added_IsSystem_Flag.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250508055854_Added_IsSystem_Flag.Designer.cs @@ -1222,7 +1222,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250510074238_Added_WorkCategory_Master_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250510074238_Added_WorkCategory_Master_Table.Designer.cs index 5a16b4c..69834c6 100644 --- a/Marco.Pms.DataAccess/Migrations/20250510074238_Added_WorkCategory_Master_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250510074238_Added_WorkCategory_Master_Table.Designer.cs @@ -1299,7 +1299,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250511170748_Added_Foreign_key_For_WorkCategery_To_WorkItem.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250511170748_Added_Foreign_key_For_WorkCategery_To_WorkItem.Designer.cs index 748eb32..0348ebc 100644 --- a/Marco.Pms.DataAccess/Migrations/20250511170748_Added_Foreign_key_For_WorkCategery_To_WorkItem.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250511170748_Added_Foreign_key_For_WorkCategery_To_WorkItem.Designer.cs @@ -1299,7 +1299,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250513125713_Changed_Freture_Permissions.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250513125713_Changed_Freture_Permissions.Designer.cs index baf9d7f..8db96d1 100644 --- a/Marco.Pms.DataAccess/Migrations/20250513125713_Changed_Freture_Permissions.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250513125713_Changed_Freture_Permissions.Designer.cs @@ -1267,7 +1267,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250514103249_Added_Directory_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250514103249_Added_Directory_Related_Tables.Designer.cs index aad7361..b873cd3 100644 --- a/Marco.Pms.DataAccess/Migrations/20250514103249_Added_Directory_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250514103249_Added_Directory_Related_Tables.Designer.cs @@ -1602,7 +1602,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250517063809_Added_ContactProjectMapping_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250517063809_Added_ContactProjectMapping_Table.Designer.cs index 492cf00..0040f43 100644 --- a/Marco.Pms.DataAccess/Migrations/20250517063809_Added_ContactProjectMapping_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250517063809_Added_ContactProjectMapping_Table.Designer.cs @@ -1626,7 +1626,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250519053019_Fixed_Typo_Of_ColumnName.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250519053019_Fixed_Typo_Of_ColumnName.Designer.cs index 39fe4c3..96a4717 100644 --- a/Marco.Pms.DataAccess/Migrations/20250519053019_Fixed_Typo_Of_ColumnName.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250519053019_Fixed_Typo_Of_ColumnName.Designer.cs @@ -1593,7 +1593,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250524074333_Added_Feature_Directory_Management.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250524074333_Added_Feature_Directory_Management.Designer.cs index 6e2f931..39f365c 100644 --- a/Marco.Pms.DataAccess/Migrations/20250524074333_Added_Feature_Directory_Management.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250524074333_Added_Feature_Directory_Management.Designer.cs @@ -1633,7 +1633,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250530055939_Added_Mail_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250530055939_Added_Mail_Related_Tables.Designer.cs index 09c4047..64dfc97 100644 --- a/Marco.Pms.DataAccess/Migrations/20250530055939_Added_Mail_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250530055939_Added_Mail_Related_Tables.Designer.cs @@ -1358,7 +1358,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250604094759_Added_Self_Attendance_Feature_Permission.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250604094759_Added_Self_Attendance_Feature_Permission.Designer.cs index c80bbc1..fb39591 100644 --- a/Marco.Pms.DataAccess/Migrations/20250604094759_Added_Self_Attendance_Feature_Permission.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250604094759_Added_Self_Attendance_Feature_Permission.Designer.cs @@ -1366,7 +1366,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250605102139_Added_OTP_And_MPIN_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250605102139_Added_OTP_And_MPIN_Table.Designer.cs index 242339f..1269342 100644 --- a/Marco.Pms.DataAccess/Migrations/20250605102139_Added_OTP_And_MPIN_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250605102139_Added_OTP_And_MPIN_Table.Designer.cs @@ -1425,7 +1425,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250606095355_Added_Subject_In_MailingList_And_Removed_From_MailDetails.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250606095355_Added_Subject_In_MailingList_And_Removed_From_MailDetails.Designer.cs index bdf0ba4..53e758a 100644 --- a/Marco.Pms.DataAccess/Migrations/20250606095355_Added_Subject_In_MailingList_And_Removed_From_MailDetails.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250606095355_Added_Subject_In_MailingList_And_Removed_From_MailDetails.Designer.cs @@ -1425,7 +1425,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250607061133_Added_IsUsed_FLag_In_OTPDetails_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250607061133_Added_IsUsed_FLag_In_OTPDetails_Table.Designer.cs index fe82feb..7b5acc1 100644 --- a/Marco.Pms.DataAccess/Migrations/20250607061133_Added_IsUsed_FLag_In_OTPDetails_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250607061133_Added_IsUsed_FLag_In_OTPDetails_Table.Designer.cs @@ -1428,7 +1428,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250610051758_Added_Short_Name_Column_In_Projects_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250610051758_Added_Short_Name_Column_In_Projects_Table.Designer.cs index c50d6d8..63cdcab 100644 --- a/Marco.Pms.DataAccess/Migrations/20250610051758_Added_Short_Name_Column_In_Projects_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250610051758_Added_Short_Name_Column_In_Projects_Table.Designer.cs @@ -1428,7 +1428,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250612094243_Added_TaskAttachments_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250612094243_Added_TaskAttachments_Table.Designer.cs index 1407de2..f601434 100644 --- a/Marco.Pms.DataAccess/Migrations/20250612094243_Added_TaskAttachments_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250612094243_Added_TaskAttachments_Table.Designer.cs @@ -1811,7 +1811,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250616064217_Added_Apporved_By_In_TaskAllocation_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250616064217_Added_Apporved_By_In_TaskAllocation_Table.Designer.cs index a00f9f1..cee5400 100644 --- a/Marco.Pms.DataAccess/Migrations/20250616064217_Added_Apporved_By_In_TaskAllocation_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250616064217_Added_Apporved_By_In_TaskAllocation_Table.Designer.cs @@ -1835,7 +1835,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250618112021_EnhancedWorkItemForParentId_Description.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250618112021_EnhancedWorkItemForParentId_Description.Designer.cs index 4d39cf1..2ce46f8 100644 --- a/Marco.Pms.DataAccess/Migrations/20250618112021_EnhancedWorkItemForParentId_Description.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250618112021_EnhancedWorkItemForParentId_Description.Designer.cs @@ -1835,7 +1835,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250619060620_Added_New_Status_Master_In_Progress.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250619060620_Added_New_Status_Master_In_Progress.Designer.cs index 08ee943..0ea341d 100644 --- a/Marco.Pms.DataAccess/Migrations/20250619060620_Added_New_Status_Master_In_Progress.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250619060620_Added_New_Status_Master_In_Progress.Designer.cs @@ -1817,7 +1817,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250630071352_Added_UpdatedBy_In_Contacts_And_ContactNotes_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250630071352_Added_UpdatedBy_In_Contacts_And_ContactNotes_Table.Designer.cs index 7bc5be3..0a4cef2 100644 --- a/Marco.Pms.DataAccess/Migrations/20250630071352_Added_UpdatedBy_In_Contacts_And_ContactNotes_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250630071352_Added_UpdatedBy_In_Contacts_And_ContactNotes_Table.Designer.cs @@ -1857,7 +1857,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250630073319_Added_New_Feature_Permissiom_View_All_Employee.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250630073319_Added_New_Feature_Permissiom_View_All_Employee.Designer.cs index cfa4dea..43bbdbe 100644 --- a/Marco.Pms.DataAccess/Migrations/20250630073319_Added_New_Feature_Permissiom_View_All_Employee.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250630073319_Added_New_Feature_Permissiom_View_All_Employee.Designer.cs @@ -1857,7 +1857,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250630111659_Changed_Name_Of_Feature_Permission_To_ViewTeamMembers.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250630111659_Changed_Name_Of_Feature_Permission_To_ViewTeamMembers.Designer.cs index 4ddc1f7..a882d1f 100644 --- a/Marco.Pms.DataAccess/Migrations/20250630111659_Changed_Name_Of_Feature_Permission_To_ViewTeamMembers.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250630111659_Changed_Name_Of_Feature_Permission_To_ViewTeamMembers.Designer.cs @@ -1857,7 +1857,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250702042830_Added_UploadedBy_ForeginKey_In_Decuments_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250702042830_Added_UploadedBy_ForeginKey_In_Decuments_Table.Designer.cs index c0c77b8..f18d9be 100644 --- a/Marco.Pms.DataAccess/Migrations/20250702042830_Added_UploadedBy_ForeginKey_In_Decuments_Table.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250702042830_Added_UploadedBy_ForeginKey_In_Decuments_Table.Designer.cs @@ -1862,7 +1862,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index 27368b8..40fe611 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1934,7 +1934,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Color = "#6c757d", + Color = "#8592a3", Description = "Expense has been created but not yet submitted.", DisplayName = "Draft", IsActive = true, @@ -1945,7 +1945,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - Color = "#0d6efd", + Color = "#696cff", Description = "Reviewer is currently reviewing the expense.", DisplayName = "Review", IsActive = true, @@ -1956,7 +1956,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - Color = "#0dcaf0", + Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", DisplayName = "Approve", IsActive = true, @@ -1967,7 +1967,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Color = "#dc3545", + Color = "#ff3e1d", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", DisplayName = "Reject", IsActive = true, @@ -1978,7 +1978,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Color = "#ffc107", + Color = "#ffab00", Description = "Approved expense is awaiting final payment.", DisplayName = "Process", IsActive = true, @@ -1989,7 +1989,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - Color = "#198754", + Color = "#71dd37", Description = "Expense has been settled.", DisplayName = "Paid", IsActive = true, @@ -2535,7 +2535,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index 22a0444..ffc5400 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -372,12 +372,12 @@ namespace Marco.Pms.DataAccess.Migrations columns: new[] { "Id", "Color", "Description", "DisplayName", "IsActive", "IsSystem", "Name", "TenantId" }, values: new object[,] { - { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#6c757d", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#0dcaf0", "Review is completed, waiting for action of approver.", "Approve", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#198754", "Expense has been settled.", "Paid", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#0d6efd", "Reviewer is currently reviewing the expense.", "Review", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#dc3545", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffc107", "Approved expense is awaiting final payment.", "Process", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#8592a3", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Approve", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Paid", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Review", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#ff3e1d", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Process", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); migrationBuilder.InsertData( diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 242e512..3406e12 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -20,7 +20,7 @@ namespace Marco.Pms.DataAccess.Migrations .HasAnnotation("ProductVersion", "8.0.12") .HasAnnotation("Relational:MaxIdentifierLength", 64); - //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => { @@ -1931,7 +1931,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), - Color = "#6c757d", + Color = "#8592a3", Description = "Expense has been created but not yet submitted.", DisplayName = "Draft", IsActive = true, @@ -1942,7 +1942,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - Color = "#0d6efd", + Color = "#696cff", Description = "Reviewer is currently reviewing the expense.", DisplayName = "Review", IsActive = true, @@ -1953,7 +1953,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - Color = "#0dcaf0", + Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", DisplayName = "Approve", IsActive = true, @@ -1964,7 +1964,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Color = "#dc3545", + Color = "#ff3e1d", Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", DisplayName = "Reject", IsActive = true, @@ -1975,7 +1975,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Color = "#ffc107", + Color = "#ffab00", Description = "Approved expense is awaiting final payment.", DisplayName = "Process", IsActive = true, @@ -1986,7 +1986,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - Color = "#198754", + Color = "#71dd37", Description = "Expense has been settled.", DisplayName = "Paid", IsActive = true, @@ -2532,7 +2532,7 @@ namespace Marco.Pms.DataAccess.Migrations new { Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), - ColorCode = "#6c757d", + ColorCode = "#8592a3", Description = "These issues are currently under review", IsDefault = true, Name = "In Review", diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 5e63178..02263e2 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -91,6 +91,17 @@ namespace Marco.Pms.Helpers.CacheHelper return (totalPages, totalCount, expenses); } + + public async Task GetExpenseDetailsByIdAsync(Guid id, Guid tenantId) + { + var filter = Builders.Filter.And( + Builders.Filter.Eq(e => e.Id, id.ToString()), + Builders.Filter.Eq(e => e.TenantId, tenantId.ToString()) + ); + var expense = await _collection.Find(filter).FirstOrDefaultAsync(); + + return expense; + } private async Task InitializeCollectionAsync() { var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs new file mode 100644 index 0000000..e44347a --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -0,0 +1,31 @@ +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Model.ViewModels.Projects; + +namespace Marco.Pms.Model.ViewModels.Expenses +{ + public class ExpenseDetailsVM + { + public Guid Id { get; set; } + public ProjectInfoVM? Project { get; set; } + public ExpensesTypeMasterVM? ExpensesType { get; set; } + public PaymentModeMatserVM? PaymentMode { get; set; } + public BasicEmployeeVM? PaidBy { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + public DateTime TransactionDate { get; set; } + public DateTime CreatedAt { get; set; } + public string SupplerName { get; set; } = string.Empty; + public double Amount { get; set; } + public ExpensesStatusMasterVM? Status { get; set; } + public List? NextStatus { get; set; } + public bool PreApproved { get; set; } = false; + public string? TransactionId { get; set; } + public string Description { get; set; } = string.Empty; + public string? Location { get; set; } + public List S3Key { get; set; } = new List(); + public List? ThumbS3Key { get; set; } + public string? GSTNumber { get; set; } + public int? NoOfPersons { get; set; } + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 8f3351d..5a17d3d 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -47,9 +47,11 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("details/{id}")] - public string Get(int id) + public async Task GetExpenseDetails(Guid id) { - return "value"; + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetExpenseDetailsAsync(id, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); } /// diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index bbec308..13de18a 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -900,39 +900,43 @@ namespace Marco.Pms.Services.Helpers catch (Exception ex) { _logger.LogError(ex, "Error occurd while storing expense related table in cahce"); + return; } + return; } - public async Task AddExpenseByIdAsync(Guid Id, Guid tenantId) + public async Task AddExpenseByIdAsync(Guid Id, Guid tenantId) { var expense = await _context.Expenses.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Id && e.TenantId == tenantId); var expenseCache = _mapper.Map(expense); - if (expense != null) + if (expense == null) { - try + return null; + } + try + { + var billAttachments = await _context.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new { - var billAttachments = await _context.BillAttachments - .Include(ba => ba.Document) - .AsNoTracking() - .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) - .GroupBy(ba => ba.ExpensesId) - .Select(g => new - { - S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), - ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() - }) - .FirstOrDefaultAsync(); - if (billAttachments != null) - { - expenseCache.S3Key = billAttachments.S3Keys; - expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; - } - } - catch (Exception ex) + S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), + ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + }) + .FirstOrDefaultAsync(); + if (billAttachments != null) { - _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); + expenseCache.S3Key = billAttachments.S3Keys; + expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; } } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); + return null; + } try { await _expenseCache.AddExpenseToCacheAsync(expenseCache); @@ -940,8 +944,12 @@ namespace Marco.Pms.Services.Helpers catch (Exception ex) { _logger.LogError(ex, "Error occurd while storing expense related table in cahce"); + return null; } + return expenseCache; + + } public async Task AddExpensesListToCache(List expenses) { @@ -1000,6 +1008,16 @@ namespace Marco.Pms.Services.Helpers return (0, 0, null); } + public async Task GetExpenseDetailsById(Guid id, Guid tenantId) + { + var response = await _expenseCache.GetExpenseDetailsByIdAsync(id, tenantId); + if (response == null || response.Id == string.Empty) + { + return null; + } + return response; + } + #endregion #region ======================================================= Report Cache ======================================================= diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 6e4ca8e..c21b93d 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -13,6 +13,7 @@ using Marco.Pms.Model.Projects; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Expanses; +using Marco.Pms.Model.ViewModels.Expenses; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; @@ -177,6 +178,11 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion #region ======================================================= Master ======================================================= diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d55b915..a8ea7b8 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -5,10 +5,12 @@ using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Expanses; +using Marco.Pms.Model.ViewModels.Expenses; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Services.Helpers; @@ -210,7 +212,7 @@ namespace Marco.Pms.Services.Service Message = dbEx.Message, StackTrace = dbEx.StackTrace, Source = dbEx.Source, - innerexcption = new + InnerException = new { Message = dbEx.InnerException?.Message, StackTrace = dbEx.InnerException?.StackTrace, @@ -226,7 +228,7 @@ namespace Marco.Pms.Services.Service Message = ex.Message, StackTrace = ex.StackTrace, Source = ex.Source, - innerexcption = new + InnerException = new { Message = ex.InnerException?.Message, StackTrace = ex.InnerException?.StackTrace, @@ -236,9 +238,35 @@ namespace Marco.Pms.Services.Service } } - public string Get(int id) + public async Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { - return "value"; + try + { + var expenseDetails = await _cache.GetExpenseDetailsById(id, tenantId); + if (expenseDetails == null) + { + expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId); + } + var vm = GetAllExpnesRelatedTablesFromMongoDB([expenseDetails]); + return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); + + } + catch (Exception ex) + { + _logger.LogError(ex, "An unhandled exception occurred while fetching an expense details {ExpenseId}.", id); + return ApiResponse.ErrorResponse("An internal server error occurred.", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + InnerException = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } } /// @@ -391,7 +419,7 @@ namespace Marco.Pms.Services.Service Message = dbEx.Message, StackTrace = dbEx.StackTrace, Source = dbEx.Source, - innerexcption = new + InnerException = new { Message = dbEx.InnerException?.Message, StackTrace = dbEx.InnerException?.StackTrace, @@ -407,7 +435,7 @@ namespace Marco.Pms.Services.Service Message = ex.Message, StackTrace = ex.StackTrace, Source = ex.Source, - innerexcption = new + InnerException = new { Message = ex.InnerException?.Message, StackTrace = ex.InnerException?.StackTrace, @@ -423,7 +451,7 @@ namespace Marco.Pms.Services.Service Message = ex.Message, StackTrace = ex.StackTrace, Source = ex.Source, - innerexcption = new + InnerException = new { Message = ex.InnerException?.Message, StackTrace = ex.InnerException?.StackTrace, @@ -716,6 +744,7 @@ namespace Marco.Pms.Services.Service public void Delete(int id) { } + #region =================================================================== Helper Functions =================================================================== private async Task> GetAllExpnesRelatedTables(List model) @@ -797,6 +826,85 @@ namespace Marco.Pms.Services.Service return expenseList; } + private async Task> GetAllExpnesRelatedTablesFromMongoDB(List model) + { + List expenseList = new List(); + var projectIds = model.Select(m => Guid.Parse(m.ProjectId)).ToList(); + var statusIds = model.Select(m => Guid.Parse(m.StatusId)).ToList(); + var expensesTypeIds = model.Select(m => Guid.Parse(m.ExpensesTypeId)).ToList(); + var paymentModeIds = model.Select(m => Guid.Parse(m.PaymentModeId)).ToList(); + var createdByIds = model.Select(m => Guid.Parse(m.CreatedById)).ToList(); + var paidByIds = model.Select(m => Guid.Parse(m.PaidById)).ToList(); + + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync(); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync(); + }); + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync(); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync(); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync(); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + StatusId = g.Key, + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }).ToListAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask); + + var projects = await projectTask; + var expenseTypes = await expenseTypeTask; + var paymentModes = await paymentModeTask; + var statusMappings = await statusMappingTask; + var paidBys = await paidByTask; + var createdBys = await createdByTask; + + expenseList = model.Select(m => + { + var response = _mapper.Map(m); + + response.Project = projects.Where(p => p.Id == Guid.Parse(m.ProjectId)).Select(p => _mapper.Map(p)).FirstOrDefault(); + response.PaidBy = paidBys.Where(p => p.Id == Guid.Parse(m.PaidById)).Select(p => _mapper.Map(p)).FirstOrDefault(); + response.CreatedBy = createdBys.Where(e => e.Id == Guid.Parse(m.CreatedById)).Select(e => _mapper.Map(e)).FirstOrDefault(); + response.Status = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map(s.Status)).FirstOrDefault(); + response.NextStatus = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); + response.PaymentMode = paymentModes.Where(pm => pm.Id == Guid.Parse(m.PaymentModeId)).Select(pm => _mapper.Map(pm)).FirstOrDefault(); + response.ExpensesType = expenseTypes.Where(et => et.Id == Guid.Parse(m.ExpensesTypeId)).Select(et => _mapper.Map(et)).FirstOrDefault(); + + return response; + }).ToList(); + + return expenseList; + } /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 2cf2721..75d937a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -7,6 +7,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces public interface IExpensesService { Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber); + Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); From 4a762e4983615f424cd4f49ef880feb71a40bf10 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 10:58:16 +0530 Subject: [PATCH 026/125] commented un wanted code --- .../Migrations/ApplicationDbContextModelSnapshot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 3406e12..ed3710f 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -20,7 +20,7 @@ namespace Marco.Pms.DataAccess.Migrations .HasAnnotation("ProductVersion", "8.0.12") .HasAnnotation("Relational:MaxIdentifierLength", 64); - MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => { From 0095cd54f650f474ad3c4a90facec6e554dc23fa Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 12:50:42 +0530 Subject: [PATCH 027/125] Added persigned Urls in Expesne Details API --- .../MongoDBModels/DocumentMongoDB.cs | 11 +++ .../Expenses/ExpenseDetailsMongoDB.cs | 3 +- .../ViewModels/DocumentManager/DocumentVM.cs | 8 ++ .../ViewModels/Expenses/ExpenseDetailsVM.cs | 4 +- .../Controllers/AttendanceController.cs | 4 +- .../Controllers/ForumController.cs | 16 ++-- .../Controllers/ImageController.cs | 12 +-- .../Controllers/TaskController.cs | 8 +- .../Controllers/WeatherForecastController.cs | 2 +- .../Helpers/CacheUpdateHelper.cs | 44 +++++++---- .../MappingProfiles/MappingProfile.cs | 11 +++ Marco.Pms.Services/Service/ExpensesService.cs | 77 ++++++++++--------- Marco.Pms.Services/Service/S3UploadService.cs | 3 +- 13 files changed, 126 insertions(+), 77 deletions(-) create mode 100644 Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs diff --git a/Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs b/Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs new file mode 100644 index 0000000..d65af2a --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.MongoDBModels +{ + public class DocumentMongoDB + { + public string DocumentId { get; set; } = string.Empty; + public string FileName { get; set; } = string.Empty; + public string ContentType { get; set; } = string.Empty; + public string S3Key { get; set; } = string.Empty; + public string ThumbS3Key { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs index c0ffdd9..c58a22c 100644 --- a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -18,8 +18,7 @@ public string? TransactionId { get; set; } public string Description { get; set; } = string.Empty; public string? Location { get; set; } - public List S3Key { get; set; } = new List(); - public List? ThumbS3Key { get; set; } + public List Documents { get; set; } = new List(); public string? GSTNumber { get; set; } public int? NoOfPersons { get; set; } public bool IsActive { get; set; } = true; diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentVM.cs index 4940600..d971ea4 100644 --- a/Marco.Pms.Model/ViewModels/DocumentManager/DocumentVM.cs +++ b/Marco.Pms.Model/ViewModels/DocumentManager/DocumentVM.cs @@ -11,4 +11,12 @@ public string ContentType { get; set; } = string.Empty; public DateTime UploadedAt { get; set; } } + public class BasicDocumentVM + { + public Guid DocumentId { get; set; } + public string FileName { get; set; } = string.Empty; + public string ContentType { get; set; } = string.Empty; + public string? PreSignedUrl { get; set; } + public string? ThumbPreSignedUrl { get; set; } + } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs index e44347a..34ecc24 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; @@ -22,8 +23,7 @@ namespace Marco.Pms.Model.ViewModels.Expenses public string? TransactionId { get; set; } public string Description { get; set; } = string.Empty; public string? Location { get; set; } - public List S3Key { get; set; } = new List(); - public List? ThumbS3Key { get; set; } + public List Documents { get; set; } = new List(); public string? GSTNumber { get; set; } public int? NoOfPersons { get; set; } public bool IsActive { get; set; } = true; diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 7339966..5af6c67 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -74,7 +74,7 @@ namespace MarcoBMS.Services.Controllers foreach (var attendanceLog in lstAttendance) { string objectKey = attendanceLog.Document != null ? attendanceLog.Document.S3Key : string.Empty; - string preSignedUrl = string.IsNullOrEmpty(objectKey) ? string.Empty : _s3Service.GeneratePreSignedUrlAsync(objectKey); + string preSignedUrl = string.IsNullOrEmpty(objectKey) ? string.Empty : _s3Service.GeneratePreSignedUrl(objectKey); attendanceLogVMs.Add(attendanceLog.ToAttendanceLogVMFromAttendanceLog(preSignedUrl, preSignedUrl)); } _logger.LogInfo("{count} Attendance records fetched successfully", lstAttendance.Count); @@ -708,7 +708,7 @@ namespace MarcoBMS.Services.Controllers var objectKey = $"tenant-{tenantId}/Employee/{recordAttendanceDot.EmployeeID}/Attendance/{fileName}"; await _s3Service.UploadFileAsync(base64, fileType, objectKey); - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(objectKey); + preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); document = new Document { diff --git a/Marco.Pms.Services/Controllers/ForumController.cs b/Marco.Pms.Services/Controllers/ForumController.cs index fb6d0e7..4e3b948 100644 --- a/Marco.Pms.Services/Controllers/ForumController.cs +++ b/Marco.Pms.Services/Controllers/ForumController.cs @@ -129,7 +129,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); } @@ -301,7 +301,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } if (attachment.CommentId == null) { @@ -418,7 +418,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); } @@ -532,7 +532,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl)); } @@ -606,7 +606,7 @@ namespace Marco.Pms.Services.Controllers _context.TicketAttachments.Add(attachment); await _context.SaveChangesAsync(); - string preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + string preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); TicketAttachmentVM attachmentVM = attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl); ticketAttachmentVMs.Add(attachmentVM); @@ -671,7 +671,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } if (attachment.CommentId == null) { @@ -749,7 +749,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } if (attachment.CommentId == null) { @@ -851,7 +851,7 @@ namespace Marco.Pms.Services.Controllers string preSignedUrl = string.Empty; if (document != null) { - preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key); + preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); } if (attachment.CommentId == null) { diff --git a/Marco.Pms.Services/Controllers/ImageController.cs b/Marco.Pms.Services/Controllers/ImageController.cs index 9014171..cf046a8 100644 --- a/Marco.Pms.Services/Controllers/ImageController.cs +++ b/Marco.Pms.Services/Controllers/ImageController.cs @@ -220,8 +220,8 @@ namespace Marco.Pms.Services.Controllers Documents = d.Documents?.Select(x => new { Id = x.Id, - thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null), - Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null, + thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrl(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null), + Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null, UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(), UploadedAt = x.UploadedAt, }).ToList(), @@ -334,8 +334,8 @@ namespace Marco.Pms.Services.Controllers Documents = documents?.Select(x => new { Id = x.Id, - thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null), - Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null, + thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrl(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null), + Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null, UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(), UploadedAt = x.UploadedAt, }).ToList(), @@ -382,11 +382,11 @@ namespace Marco.Pms.Services.Controllers // Step 4: Generate pre-signed URLs for thumbnail and full image (if keys exist) string? thumbnailUrl = document.ThumbS3Key != null - ? _s3Service.GeneratePreSignedUrlAsync(document.ThumbS3Key) + ? _s3Service.GeneratePreSignedUrl(document.ThumbS3Key) : null; string? imageUrl = document.S3Key != null - ? _s3Service.GeneratePreSignedUrlAsync(document.S3Key) + ? _s3Service.GeneratePreSignedUrl(document.S3Key) : null; // Step 5: Prepare the response object diff --git a/Marco.Pms.Services/Controllers/TaskController.cs b/Marco.Pms.Services/Controllers/TaskController.cs index 6a1921b..9f648ac 100644 --- a/Marco.Pms.Services/Controllers/TaskController.cs +++ b/Marco.Pms.Services/Controllers/TaskController.cs @@ -499,7 +499,7 @@ namespace MarcoBMS.Services.Controllers .ToList(); response.ReportedPreSignedUrls = taskDocs - .Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key)) + .Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key)) .ToList(); // Add team members @@ -532,7 +532,7 @@ namespace MarcoBMS.Services.Controllers var commentVm = comment.ToCommentVMFromTaskComment(); commentVm.PreSignedUrls = commentDocs - .Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key)) + .Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key)) .ToList(); commentVMs.Add(commentVm); @@ -649,7 +649,7 @@ namespace MarcoBMS.Services.Controllers .ToList(); taskVM.PreSignedUrls = taskDocuments - .Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key)) + .Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key)) .ToList(); // Construct CommentVM list with document URLs @@ -667,7 +667,7 @@ namespace MarcoBMS.Services.Controllers var commentVM = comment.ToCommentVMFromTaskComment(); commentVM.PreSignedUrls = commentDocs - .Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key)) + .Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key)) .ToList(); return commentVM; diff --git a/Marco.Pms.Services/Controllers/WeatherForecastController.cs b/Marco.Pms.Services/Controllers/WeatherForecastController.cs index fae8c73..2ffd222 100644 --- a/Marco.Pms.Services/Controllers/WeatherForecastController.cs +++ b/Marco.Pms.Services/Controllers/WeatherForecastController.cs @@ -39,7 +39,7 @@ namespace MarcoBMS.Services.Controllers // return BadRequest("Base64 data is missing"); // var objectKey = await _s3Service.UploadFileAsync(Image.Base64Data, 1, "Forum"); // //var objectKey = await _s3Service.UploadFileAsync(Image.FileName, Image.ContentType); - // var preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(objectKey); + // var preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey); // return Ok(new // { diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 13de18a..d7466c6 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -4,6 +4,7 @@ using Marco.Pms.Helpers; using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; +using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; @@ -872,21 +873,26 @@ namespace Marco.Pms.Services.Helpers try { - var billAttachments = await _context.BillAttachments + var billAttachment = await _context.BillAttachments .Include(ba => ba.Document) .AsNoTracking() .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) .GroupBy(ba => ba.ExpensesId) .Select(g => new { - S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), - ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() }) .FirstOrDefaultAsync(); ; - if (billAttachments != null) + if (billAttachment != null) { - expenseCache.S3Key = billAttachments.S3Keys; - expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; + expenseCache.Documents = billAttachment.Documents; } } catch (Exception ex) @@ -922,14 +928,19 @@ namespace Marco.Pms.Services.Helpers .GroupBy(ba => ba.ExpensesId) .Select(g => new { - S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), - ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() }) .FirstOrDefaultAsync(); if (billAttachments != null) { - expenseCache.S3Key = billAttachments.S3Keys; - expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys; + expenseCache.Documents = billAttachments.Documents; } } catch (Exception ex) @@ -965,14 +976,19 @@ namespace Marco.Pms.Services.Helpers .Select(g => new { ExpensesId = g.Key, - S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(), - ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList() + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() }) .ToListAsync(); foreach (var expenseCache in expensesCache) { - expenseCache.S3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.S3Keys).FirstOrDefault() ?? new List(); - expenseCache.ThumbS3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.ThumbS3Keys).FirstOrDefault(); + expenseCache.Documents = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.Documents).FirstOrDefault() ?? new List(); } } catch (Exception ex) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index c21b93d..5db13c1 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -5,12 +5,14 @@ using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; +using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.MongoDBModels.Employees; using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Expanses; using Marco.Pms.Model.ViewModels.Expenses; @@ -234,6 +236,15 @@ namespace Marco.Pms.Services.MappingProfiles #endregion + + #region ======================================================= Document ======================================================= + + CreateMap() + .ForMember( + dest => dest.DocumentId, + opt => opt.MapFrom(src => Guid.Parse(src.DocumentId))); + + #endregion } } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index a8ea7b8..4da381d 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -184,7 +184,7 @@ namespace Marco.Pms.Services.Service } expenseVM = await GetAllExpnesRelatedTables(expensesList); - + totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); } else @@ -246,8 +246,13 @@ namespace Marco.Pms.Services.Service if (expenseDetails == null) { expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId); + if (expenseDetails == null) + { + return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); + } } - var vm = GetAllExpnesRelatedTablesFromMongoDB([expenseDetails]); + var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails); + return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); } @@ -826,40 +831,32 @@ namespace Marco.Pms.Services.Service return expenseList; } - private async Task> GetAllExpnesRelatedTablesFromMongoDB(List model) + private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model) { - List expenseList = new List(); - var projectIds = model.Select(m => Guid.Parse(m.ProjectId)).ToList(); - var statusIds = model.Select(m => Guid.Parse(m.StatusId)).ToList(); - var expensesTypeIds = model.Select(m => Guid.Parse(m.ExpensesTypeId)).ToList(); - var paymentModeIds = model.Select(m => Guid.Parse(m.PaymentModeId)).ToList(); - var createdByIds = model.Select(m => Guid.Parse(m.CreatedById)).ToList(); - var paidByIds = model.Select(m => Guid.Parse(m.PaidById)).ToList(); - var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync(); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId)); }); var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById)); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById)); }); var expenseTypeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId)); }); var paymentModeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId)); }); var statusMappingTask = Task.Run(async () => { @@ -868,44 +865,50 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null) .GroupBy(s => s.StatusId) .Select(g => new { - StatusId = g.Key, Status = g.Select(s => s.Status).FirstOrDefault(), NextStatus = g.Select(s => s.NextStatus).ToList() - }).ToListAsync(); + }).FirstOrDefaultAsync(); }); // Await all prerequisite checks at once. await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask); - var projects = await projectTask; - var expenseTypes = await expenseTypeTask; - var paymentModes = await paymentModeTask; - var statusMappings = await statusMappingTask; - var paidBys = await paidByTask; - var createdBys = await createdByTask; + var project = await projectTask; + var expenseType = await expenseTypeTask; + var paymentMode = await paymentModeTask; + var statusMapping = await statusMappingTask; + var paidBy = await paidByTask; + var createdBy = await createdByTask; - expenseList = model.Select(m => + var response = _mapper.Map(model); + + response.Project = _mapper.Map(project); + response.PaidBy = _mapper.Map(paidBy); + response.CreatedBy = _mapper.Map(createdBy); + response.PaymentMode = _mapper.Map(paymentMode); + response.ExpensesType = _mapper.Map(expenseType); + if (statusMapping != null) { - var response = _mapper.Map(m); + response.Status = _mapper.Map(statusMapping.Status); + response.NextStatus = _mapper.Map>(statusMapping.NextStatus); + } - response.Project = projects.Where(p => p.Id == Guid.Parse(m.ProjectId)).Select(p => _mapper.Map(p)).FirstOrDefault(); - response.PaidBy = paidBys.Where(p => p.Id == Guid.Parse(m.PaidById)).Select(p => _mapper.Map(p)).FirstOrDefault(); - response.CreatedBy = createdBys.Where(e => e.Id == Guid.Parse(m.CreatedById)).Select(e => _mapper.Map(e)).FirstOrDefault(); - response.Status = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map(s.Status)).FirstOrDefault(); - response.NextStatus = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); - response.PaymentMode = paymentModes.Where(pm => pm.Id == Guid.Parse(m.PaymentModeId)).Select(pm => _mapper.Map(pm)).FirstOrDefault(); - response.ExpensesType = expenseTypes.Where(et => et.Id == Guid.Parse(m.ExpensesTypeId)).Select(et => _mapper.Map(et)).FirstOrDefault(); + foreach (var document in model.Documents) + { + var vm = response.Documents.FirstOrDefault(d => d.DocumentId == Guid.Parse(document.DocumentId)); - return response; - }).ToList(); + vm!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); + vm!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); + } - return expenseList; + return response; } + /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). /// diff --git a/Marco.Pms.Services/Service/S3UploadService.cs b/Marco.Pms.Services/Service/S3UploadService.cs index b07093c..57a46fa 100644 --- a/Marco.Pms.Services/Service/S3UploadService.cs +++ b/Marco.Pms.Services/Service/S3UploadService.cs @@ -71,8 +71,9 @@ namespace Marco.Pms.Services.Service } - public string GeneratePreSignedUrlAsync(string objectKey) + public string GeneratePreSignedUrl(string objectKey) { + int expiresInMinutes = 10; var request = new GetPreSignedUrlRequest { From 4370d5a350753d2e9852412195a9c30eab6dc0fc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 16:24:59 +0530 Subject: [PATCH 028/125] Adsing file to delete from S3 in mongoDB while update expenes --- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 10 +++ .../UtilityMongoDBHelper.cs} | 43 +++++++++++- .../MongoDBModels/Utility/S3DeletionObject.cs | 15 ++++ Marco.Pms.Model/Utilities/FileUploadModel.cs | 2 + .../Helpers/CacheUpdateHelper.cs | 45 ++++++++++-- Marco.Pms.Services/Program.cs | 3 +- Marco.Pms.Services/Service/ExpensesService.cs | 69 +++++++++++++++++-- Marco.Pms.Services/Service/S3UploadService.cs | 3 +- 8 files changed, 176 insertions(+), 14 deletions(-) rename Marco.Pms.Helpers/{UpdateLogHelper.cs => Utility/UtilityMongoDBHelper.cs} (63%) create mode 100644 Marco.Pms.Model/MongoDBModels/Utility/S3DeletionObject.cs diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 02263e2..5d29088 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -102,6 +102,16 @@ namespace Marco.Pms.Helpers.CacheHelper return expense; } + + public async Task DeleteExpenseFromCacheAsync(Guid id, Guid tenantId) + { + var filter = Builders.Filter.And( + Builders.Filter.Eq(e => e.Id, id.ToString()), + Builders.Filter.Eq(e => e.TenantId, tenantId.ToString()) + ); + var result = await _collection.DeleteOneAsync(filter); + return result.DeletedCount > 0; + } private async Task InitializeCollectionAsync() { var indexKeys = Builders.IndexKeys.Ascending(x => x.ExpireAt); diff --git a/Marco.Pms.Helpers/UpdateLogHelper.cs b/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs similarity index 63% rename from Marco.Pms.Helpers/UpdateLogHelper.cs rename to Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs index 5c7595f..7159850 100644 --- a/Marco.Pms.Helpers/UpdateLogHelper.cs +++ b/Marco.Pms.Helpers/Utility/UtilityMongoDBHelper.cs @@ -1,21 +1,28 @@ using Marco.Pms.Model.MongoDBModels.Utility; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using MongoDB.Bson; using MongoDB.Driver; using System.Collections; -namespace Marco.Pms.Helpers +namespace Marco.Pms.Helpers.Utility { - public class UpdateLogHelper + public class UtilityMongoDBHelper { private readonly IMongoDatabase _mongoDatabase; - public UpdateLogHelper(IConfiguration configuration) + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + public UtilityMongoDBHelper(IConfiguration configuration, ILogger logger) { + _configuration = configuration; + _logger = logger; var connectionString = configuration["MongoDB:ModificationConnectionString"]; var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); // Your MongoDB connection string _mongoDatabase = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name } + + #region =================================================================== Update Log Helper Functions =================================================================== public async Task PushToUpdateLogsAsync(UpdateLogsObject oldObject, string collectionName) { var collection = _mongoDatabase.GetCollection(collectionName); @@ -87,5 +94,35 @@ namespace Marco.Pms.Helpers return bson; } + #endregion + + #region =================================================================== S3 deletion Helper Functions =================================================================== + + public async Task PushToS3DeletionAsync(List deletionObject) + { + var bucketName = _configuration["AWS:BucketName"]; + if (bucketName != null) + { + deletionObject = deletionObject.Select(d => new S3DeletionObject + { + BucketName = bucketName, + Key = d.Key, + Deleted = false + }).ToList(); + } + _logger.LogInformation("Delection object for bucket {BucketName} added to mongoDB", bucketName); + try + { + var collection = _mongoDatabase.GetCollection("S3Delection"); + await collection.InsertManyAsync(deletionObject); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while saving delection object for S3 to MogoDB"); + } + _logger.LogInformation("Delection Objects added to MongoDB Successfully"); + } + + #endregion } } diff --git a/Marco.Pms.Model/MongoDBModels/Utility/S3DeletionObject.cs b/Marco.Pms.Model/MongoDBModels/Utility/S3DeletionObject.cs new file mode 100644 index 0000000..bb957de --- /dev/null +++ b/Marco.Pms.Model/MongoDBModels/Utility/S3DeletionObject.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.MongoDBModels.Utility +{ + public class S3DeletionObject + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public string BucketName { get; set; } = string.Empty; + public string Key { get; set; } = string.Empty; + public bool Deleted { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Utilities/FileUploadModel.cs b/Marco.Pms.Model/Utilities/FileUploadModel.cs index 93ecb2c..98a6a26 100644 --- a/Marco.Pms.Model/Utilities/FileUploadModel.cs +++ b/Marco.Pms.Model/Utilities/FileUploadModel.cs @@ -2,10 +2,12 @@ { 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 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.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index d7466c6..9acf08f 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1026,12 +1026,49 @@ namespace Marco.Pms.Services.Helpers public async Task GetExpenseDetailsById(Guid id, Guid tenantId) { - var response = await _expenseCache.GetExpenseDetailsByIdAsync(id, tenantId); - if (response == null || response.Id == string.Empty) + try { - return null; + var response = await _expenseCache.GetExpenseDetailsByIdAsync(id, tenantId); + if (response != null && response.Id != string.Empty) + { + return response; + } } - return response; + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching expense details from cache"); + } + return null; + } + + public async Task ReplaceExpenseAsync(Expenses expense) + { + bool response = false; + try + { + response = await _expenseCache.DeleteExpenseFromCacheAsync(expense.Id, expense.TenantId); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while deleting expense from cache"); + } + if (response) + { + await AddExpenseByObjectAsync(expense); + } + + } + public async Task DeleteExpenseAsync(Guid id, Guid tenantId) + { + try + { + var response = await _expenseCache.DeleteExpenseFromCacheAsync(id, tenantId); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while deleting expense from cache"); + } + } #endregion diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index a89e16e..2f8bbac 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,6 +1,7 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers; using Marco.Pms.Helpers.CacheHelper; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Utilities; @@ -186,7 +187,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion #region Cache Services diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 4da381d..d37142f 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1,6 +1,6 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; -using Marco.Pms.Helpers; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; @@ -30,7 +30,7 @@ namespace Marco.Pms.Services.Service private readonly ILoggingService _logger; private readonly S3UploadService _s3Service; private readonly IServiceScopeFactory _serviceScopeFactory; - private readonly UpdateLogHelper _updateLogHelper; + private readonly UtilityMongoDBHelper _updateLogHelper; private readonly CacheUpdateHelper _cache; private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); @@ -40,7 +40,7 @@ namespace Marco.Pms.Services.Service IDbContextFactory dbContextFactory, ApplicationDbContext context, IServiceScopeFactory serviceScopeFactory, - UpdateLogHelper updateLogHelper, + UtilityMongoDBHelper updateLogHelper, CacheUpdateHelper cache, ILoggingService logger, S3UploadService s3Service, @@ -690,6 +690,63 @@ namespace Marco.Pms.Services.Service _logger.LogError(ex, "Concurrency conflict while updating project {ProjectId} ", id); return ApiResponse.ErrorResponse("Conflict occurred.", "This project has been modified by someone else. Please refresh and try again.", 409); } + + if (model.BillAttachments?.Any() ?? false) + { + var newBillAttachments = model.BillAttachments.Where(ba => ba.DocumentId == null && ba.IsActive).ToList(); + if (newBillAttachments.Any()) + { + await ProcessAndUploadAttachmentsAsync(newBillAttachments, existingExpense, loggedInEmployee.Id, tenantId); + await _context.SaveChangesAsync(); + } + var deleteBillAttachments = model.BillAttachments.Where(ba => ba.DocumentId != null && !ba.IsActive).ToList(); + if (deleteBillAttachments.Any()) + { + var documentIds = deleteBillAttachments.Select(d => d.DocumentId).ToList(); + + var attachmentTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + var attachments = await dbContext.BillAttachments.AsNoTracking().Where(ba => documentIds.Contains(ba.DocumentId)).ToListAsync(); + + dbContext.BillAttachments.RemoveRange(attachments); + await dbContext.SaveChangesAsync(); + }); + var documentsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + var documents = await dbContext.Documents.AsNoTracking().Where(ba => documentIds.Contains(ba.Id)).ToListAsync(); + + if (documents.Any()) + { + dbContext.Documents.RemoveRange(documents); + await dbContext.SaveChangesAsync(); + + List deletionObject = new List(); + foreach (var document in documents) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.S3Key + }); + if (!string.IsNullOrWhiteSpace(document.ThumbS3Key) && document.ThumbS3Key != document.S3Key) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.ThumbS3Key + }); + } + } + await _updateLogHelper.PushToS3DeletionAsync(deletionObject); + } + }); + + await Task.WhenAll(attachmentTask, documentsTask); + + } + } + + try { // Task to save the detailed audit log to a separate system (e.g., MongoDB). @@ -718,9 +775,11 @@ namespace Marco.Pms.Services.Service }); }).Unwrap(); - await Task.WhenAll(mongoDBTask, getNextStatusesTask); + var cacheUpdateTask = _cache.ReplaceExpenseAsync(existingExpense); - var nextPossibleStatuses = await getNextStatusesTask; + await Task.WhenAll(mongoDBTask, getNextStatusesTask, cacheUpdateTask); + + var nextPossibleStatuses = getNextStatusesTask.Result; var response = _mapper.Map(existingExpense); if (nextPossibleStatuses != null) diff --git a/Marco.Pms.Services/Service/S3UploadService.cs b/Marco.Pms.Services/Service/S3UploadService.cs index 57a46fa..79c5fa7 100644 --- a/Marco.Pms.Services/Service/S3UploadService.cs +++ b/Marco.Pms.Services/Service/S3UploadService.cs @@ -42,7 +42,8 @@ namespace Marco.Pms.Services.Service if (allowedFilesType == null || !allowedFilesType.Contains(fileType)) { _logger.LogWarning("Unsupported file type. {FileType}", fileType); - throw new InvalidOperationException("Unsupported file type."); + //throw new InvalidOperationException("Unsupported file type."); + return; } fileBytes = Convert.FromBase64String(base64); From b6dfb30f92f8cd3dc3a25dcaff31b2359547a93d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 17:22:19 +0530 Subject: [PATCH 029/125] Create API base for delete expense API --- .../Controllers/ExpenseController.cs | 13 +- Marco.Pms.Services/Service/ExpensesService.cs | 153 +++++++++++++----- .../ServiceInterfaces/IExpensesService.cs | 1 + 3 files changed, 117 insertions(+), 50 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 5a17d3d..a895125 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -54,14 +54,6 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } - /// - /// Creates a new expense entry along with its bill attachments. - /// This operation is transactional and performs validations and file uploads concurrently for optimal performance - /// by leveraging async/await without unnecessary thread-pool switching via Task.Run. - /// - /// The data transfer object containing expense details and attachments. - /// An IActionResult indicating the result of the creation operation. - [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto model) { @@ -92,8 +84,11 @@ namespace Marco.Pms.Services.Controllers } [HttpDelete("delete/{id}")] - public void Delete(int id) + public async Task DeleteExpanse(Guid id) { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.DeleteExpanseAsync(id, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d37142f..94f0cd7 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -702,47 +702,9 @@ namespace Marco.Pms.Services.Service var deleteBillAttachments = model.BillAttachments.Where(ba => ba.DocumentId != null && !ba.IsActive).ToList(); if (deleteBillAttachments.Any()) { - var documentIds = deleteBillAttachments.Select(d => d.DocumentId).ToList(); - - var attachmentTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - var attachments = await dbContext.BillAttachments.AsNoTracking().Where(ba => documentIds.Contains(ba.DocumentId)).ToListAsync(); - - dbContext.BillAttachments.RemoveRange(attachments); - await dbContext.SaveChangesAsync(); - }); - var documentsTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - var documents = await dbContext.Documents.AsNoTracking().Where(ba => documentIds.Contains(ba.Id)).ToListAsync(); - - if (documents.Any()) - { - dbContext.Documents.RemoveRange(documents); - await dbContext.SaveChangesAsync(); - - List deletionObject = new List(); - foreach (var document in documents) - { - deletionObject.Add(new S3DeletionObject - { - Key = document.S3Key - }); - if (!string.IsNullOrWhiteSpace(document.ThumbS3Key) && document.ThumbS3Key != document.S3Key) - { - deletionObject.Add(new S3DeletionObject - { - Key = document.ThumbS3Key - }); - } - } - await _updateLogHelper.PushToS3DeletionAsync(deletionObject); - } - }); - - await Task.WhenAll(attachmentTask, documentsTask); + var documentIds = deleteBillAttachments.Select(d => d.DocumentId!.Value).ToList(); + await DeleteAttachemnts(documentIds); } } @@ -805,8 +767,75 @@ namespace Marco.Pms.Services.Service } } - public void Delete(int id) + public async Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { + var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.CreatedById == loggedInEmployee.Id && e.TenantId == tenantId); + + var hasAprrovePermissionTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ExpenseApprove, loggedInEmployee.Id); + }); + + var hasAprrovePermission = await hasAprrovePermissionTask; + if (!hasAprrovePermission) + { + expenseQuery = expenseQuery.Where(e => e.CreatedById == loggedInEmployee.Id); + } + + var existingExpense = await expenseQuery.FirstOrDefaultAsync(); + if (existingExpense == null) + { + return ApiResponse.ErrorResponse("Expense cannot be deleted", "Expense cannot be deleted", 400); + } + var documentIds = await _context.BillAttachments + .Where(ba => ba.ExpensesId == existingExpense.Id) + .Select(ba => ba.DocumentId) + .ToListAsync(); + + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); + + _context.Expenses.Remove(existingExpense); + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while adding expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + InnerException = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + var attachmentDeletionTask = Task.Run(async () => + { + await DeleteAttachemnts(documentIds); + }); + + var cacheTask = Task.Run(async () => + { + await _cache.DeleteExpenseAsync(id, tenantId); + }); + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); + + await Task.WhenAll(attachmentDeletionTask, cacheTask, mongoDBTask); + return ApiResponse.SuccessResponse("Success", "Expense Deleted Successfully", 200); } #region =================================================================== Helper Functions =================================================================== @@ -1085,6 +1114,48 @@ namespace Marco.Pms.Services.Service return (document, billAttachment); } + private async Task DeleteAttachemnts(List documentIds) + { + var attachmentTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + var attachments = await dbContext.BillAttachments.AsNoTracking().Where(ba => documentIds.Contains(ba.DocumentId)).ToListAsync(); + + dbContext.BillAttachments.RemoveRange(attachments); + await dbContext.SaveChangesAsync(); + }); + var documentsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + var documents = await dbContext.Documents.AsNoTracking().Where(ba => documentIds.Contains(ba.Id)).ToListAsync(); + + if (documents.Any()) + { + dbContext.Documents.RemoveRange(documents); + await dbContext.SaveChangesAsync(); + + List deletionObject = new List(); + foreach (var document in documents) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.S3Key + }); + if (!string.IsNullOrWhiteSpace(document.ThumbS3Key) && document.ThumbS3Key != document.S3Key) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.ThumbS3Key + }); + } + } + await _updateLogHelper.PushToS3DeletionAsync(deletionObject); + } + }); + + await Task.WhenAll(attachmentTask, documentsTask); + } + #endregion } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 75d937a..5d2f7e4 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -11,5 +11,6 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId); } } From ae1222bb962508859f09050b615ea8f7df1367c6 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 17:31:15 +0530 Subject: [PATCH 030/125] Added the API to featch list of suppler names from expenses --- .../Controllers/ExpenseController.cs | 8 ++++++ Marco.Pms.Services/Service/ExpensesService.cs | 28 +++++++++++++++++-- .../ServiceInterfaces/IExpensesService.cs | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index a895125..ee3c36a 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -54,6 +54,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("suppler-name")] + public async Task GetSupplerNameList() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetSupplerNameListAsync(loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto model) { diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 94f0cd7..6276df8 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -237,7 +237,6 @@ namespace Marco.Pms.Services.Service }, 500); } } - public async Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { try @@ -274,6 +273,32 @@ namespace Marco.Pms.Services.Service } } + public async Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId) + { + try + { + var supplerNameList = await _context.Expenses.Where(e => e.TenantId == tenantId).Select(e => e.SupplerName).Distinct().ToListAsync(); + _logger.LogInfo("Employee {EmployeeId} fetched list of organizations in a tenant {TenantId}", loggedInEmployee.Id, tenantId); + return ApiResponse.SuccessResponse(supplerNameList, $"{supplerNameList.Count} records of suppler names fetched from expense", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while fetching suppler name list from expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + InnerException = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + } + /// /// Creates a new expense entry along with its bill attachments. /// This operation is transactional and performs validations and file uploads concurrently for optimal performance @@ -766,7 +791,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); } } - public async Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.CreatedById == loggedInEmployee.Id && e.TenantId == tenantId); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 5d2f7e4..673c26c 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber); Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId); + Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); From 8b5b0aed4c61b32ea011942c261353608d748152 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 18:02:12 +0530 Subject: [PATCH 031/125] Added proper logs to all Expesne APIs --- Marco.Pms.Services/Service/ExpensesService.cs | 174 +++++++++++++++--- 1 file changed, 148 insertions(+), 26 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 6276df8..b7d8370 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -56,6 +56,7 @@ namespace Marco.Pms.Services.Service _mapper = mapper; } + #region =================================================================== Get Functions =================================================================== /// /// Retrieves a paginated list of expenses based on user permissions and optional filters. @@ -159,9 +160,6 @@ namespace Marco.Pms.Services.Service { expensesQuery = expensesQuery.Where(e => expenseFilter.CreatedByIds.Contains(e.CreatedById)); } - - - } // 4. --- Apply Ordering and Pagination --- @@ -247,11 +245,13 @@ namespace Marco.Pms.Services.Service expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId); if (expenseDetails == null) { + _logger.LogWarning("User attempted to fetch expense details with ID {ExpenseId}, but not found in both database and cache", id); return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); } } var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails); + _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); } @@ -272,13 +272,12 @@ namespace Marco.Pms.Services.Service }, 500); } } - public async Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId) { try { var supplerNameList = await _context.Expenses.Where(e => e.TenantId == tenantId).Select(e => e.SupplerName).Distinct().ToListAsync(); - _logger.LogInfo("Employee {EmployeeId} fetched list of organizations in a tenant {TenantId}", loggedInEmployee.Id, tenantId); + _logger.LogInfo("Employee {EmployeeId} fetched list of suppler names from expenses in a tenant {TenantId}", loggedInEmployee.Id, tenantId); return ApiResponse.SuccessResponse(supplerNameList, $"{supplerNameList.Count} records of suppler names fetched from expense", 200); } catch (DbUpdateException dbEx) @@ -299,6 +298,10 @@ namespace Marco.Pms.Services.Service } } + #endregion + + #region =================================================================== Post Functions =================================================================== + /// /// Creates a new expense entry along with its bill attachments. /// This operation is transactional and performs validations and file uploads concurrently for optimal performance @@ -633,6 +636,8 @@ namespace Marco.Pms.Services.Service UpdatedAt = DateTime.UtcNow }, Collection); + var cacheUpdateTask = _cache.ReplaceExpenseAsync(existingExpense); + // Task to get all possible next statuses from the *new* current state to help the UI. // NOTE: This now fetches a list of all possible next states, which is more useful for a UI. var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(t => @@ -650,7 +655,7 @@ namespace Marco.Pms.Services.Service }); }).Unwrap(); - await Task.WhenAll(mongoDBTask, getNextStatusesTask); + await Task.WhenAll(mongoDBTask, getNextStatusesTask, cacheUpdateTask); var nextPossibleStatuses = await getNextStatusesTask; @@ -677,6 +682,11 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); } } + + #endregion + + #region =================================================================== Put Functions =================================================================== + public async Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId) { var existingExpense = await _context.Expenses @@ -696,6 +706,7 @@ namespace Marco.Pms.Services.Service if (existingExpense == null) { + _logger.LogWarning("User attempted to update expense with ID {ExpenseId}, but not found in database", id); return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); } @@ -722,14 +733,73 @@ namespace Marco.Pms.Services.Service if (newBillAttachments.Any()) { await ProcessAndUploadAttachmentsAsync(newBillAttachments, existingExpense, loggedInEmployee.Id, tenantId); - await _context.SaveChangesAsync(); + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("{Count} New attachments added while updating expense {ExpenseId} by employee {EmployeeId}", + newBillAttachments.Count, existingExpense.Id, loggedInEmployee.Id); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while adding new attachments during updating expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + InnerException = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + + } } + var deleteBillAttachments = model.BillAttachments.Where(ba => ba.DocumentId != null && !ba.IsActive).ToList(); if (deleteBillAttachments.Any()) { var documentIds = deleteBillAttachments.Select(d => d.DocumentId!.Value).ToList(); - - await DeleteAttachemnts(documentIds); + try + { + await DeleteAttachemnts(documentIds); + _logger.LogInfo("{Count} Attachments deleted while updating expense {ExpenseId} by employee {EmployeeId}", + deleteBillAttachments.Count, existingExpense.Id, loggedInEmployee.Id); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while deleting attachments during updating expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + InnerException = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while deleting attachments during updating expense"); + return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + InnerException = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } } } @@ -791,6 +861,11 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); } } + + #endregion + + #region =================================================================== Delete Functions =================================================================== + public async Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.CreatedById == loggedInEmployee.Id && e.TenantId == tenantId); @@ -811,7 +886,16 @@ namespace Marco.Pms.Services.Service var existingExpense = await expenseQuery.FirstOrDefaultAsync(); if (existingExpense == null) { - return ApiResponse.ErrorResponse("Expense cannot be deleted", "Expense cannot be deleted", 400); + var message = hasAprrovePermission ? "Expenses not found" : "Expense cannot be deleted"; + if (hasAprrovePermission) + { + _logger.LogWarning("Employee {EmployeeId} attempted to delete expense {ExpenseId}, but not found in database", loggedInEmployee.Id, id); + } + else + { + _logger.LogWarning("Employee {EmployeeId} attempted to delete expense {ExpenseId}, Which is created by another employee", loggedInEmployee.Id, id); + } + return ApiResponse.ErrorResponse(message, message, 400); } var documentIds = await _context.BillAttachments .Where(ba => ba.ExpensesId == existingExpense.Id) @@ -824,10 +908,11 @@ namespace Marco.Pms.Services.Service try { await _context.SaveChangesAsync(); + _logger.LogInfo("Employeee {EmployeeId} successfully deleted the expense {EmpenseId}", loggedInEmployee.Id, id); } catch (DbUpdateException dbEx) { - _logger.LogError(dbEx, "Databsae Exception occured while adding expense"); + _logger.LogError(dbEx, "Databsae Exception occured while deleting expense"); return ApiResponse.ErrorResponse("Databsae Exception", new { Message = dbEx.Message, @@ -841,27 +926,64 @@ namespace Marco.Pms.Services.Service } }, 500); } - var attachmentDeletionTask = Task.Run(async () => + try { - await DeleteAttachemnts(documentIds); - }); + var attachmentDeletionTask = Task.Run(async () => + { + await DeleteAttachemnts(documentIds); + }); - var cacheTask = Task.Run(async () => - { - await _cache.DeleteExpenseAsync(id, tenantId); - }); - var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject - { - EntityId = existingExpense.Id.ToString(), - UpdatedById = loggedInEmployee.Id.ToString(), - OldObject = existingEntityBson, - UpdatedAt = DateTime.UtcNow - }, Collection); + var cacheTask = Task.Run(async () => + { + await _cache.DeleteExpenseAsync(id, tenantId); + }); + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = existingExpense.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, Collection); - await Task.WhenAll(attachmentDeletionTask, cacheTask, mongoDBTask); + await Task.WhenAll(attachmentDeletionTask, cacheTask, mongoDBTask); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while deleting attachments during updating expense"); + return ApiResponse.ErrorResponse("Databsae Exception", new + { + Message = dbEx.Message, + StackTrace = dbEx.StackTrace, + Source = dbEx.Source, + InnerException = new + { + Message = dbEx.InnerException?.Message, + StackTrace = dbEx.InnerException?.StackTrace, + Source = dbEx.InnerException?.Source, + } + }, 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while deleting attachments during updating expense"); + return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", new + { + Message = ex.Message, + StackTrace = ex.StackTrace, + Source = ex.Source, + InnerException = new + { + Message = ex.InnerException?.Message, + StackTrace = ex.InnerException?.StackTrace, + Source = ex.InnerException?.Source, + } + }, 500); + } return ApiResponse.SuccessResponse("Success", "Expense Deleted Successfully", 200); } + #endregion + #region =================================================================== Helper Functions =================================================================== private async Task> GetAllExpnesRelatedTables(List model) From 468bfdf635af0ffcb89abc024813cb00df8cd770 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 18:09:52 +0530 Subject: [PATCH 032/125] Made MPIN to be 4 digit --- 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 429a38b..67dd74a 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -750,7 +750,7 @@ namespace MarcoBMS.Services.Controllers .FirstOrDefaultAsync(e => e.Id == generateMPINDto.EmployeeId && e.TenantId == tenantId); // Validate employee and MPIN input - if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 6 || !generateMPINDto.MPIN.All(char.IsDigit)) + if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 4 || !generateMPINDto.MPIN.All(char.IsDigit)) { _logger.LogWarning("Employee {EmployeeId} provided invalid information to generate MPIN", loggedInEmployee.Id); return BadRequest(ApiResponse.ErrorResponse("Provided invalid information", "Provided invalid information", 400)); From 346f2cebcb34e2335ce87535c699a6e6ee2d8fe6 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 18:11:10 +0530 Subject: [PATCH 033/125] Changed the function from GetProjectDetailsAsync to GetProjectDetailsOldAsync --- Marco.Pms.Services/Controllers/ProjectController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 796fd39..2c03d69 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -135,7 +135,7 @@ namespace MarcoBMS.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _projectServices.GetProjectDetailsAsync(id, tenantId, loggedInEmployee); + var response = await _projectServices.GetProjectDetailsOldAsync(id, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } From 5926ec6655633254f3d6656d4ac8133b45be631a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 12:47:22 +0000 Subject: [PATCH 034/125] will be pushed in another branch revert Changed the function from GetProjectDetailsAsync to GetProjectDetailsOldAsync --- Marco.Pms.Services/Controllers/ProjectController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 2c03d69..796fd39 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -135,7 +135,7 @@ namespace MarcoBMS.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _projectServices.GetProjectDetailsOldAsync(id, tenantId, loggedInEmployee); + var response = await _projectServices.GetProjectDetailsAsync(id, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } From 8cc6584e7cbd6975256f0cf93f818e31d319e8c5 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 23 Jul 2025 12:47:45 +0000 Subject: [PATCH 035/125] will be pushed in another branch revert Made MPIN to be 4 digit --- 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..429a38b 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -750,7 +750,7 @@ namespace MarcoBMS.Services.Controllers .FirstOrDefaultAsync(e => e.Id == generateMPINDto.EmployeeId && e.TenantId == tenantId); // Validate employee and MPIN input - if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 4 || !generateMPINDto.MPIN.All(char.IsDigit)) + if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 6 || !generateMPINDto.MPIN.All(char.IsDigit)) { _logger.LogWarning("Employee {EmployeeId} provided invalid information to generate MPIN", loggedInEmployee.Id); return BadRequest(ApiResponse.ErrorResponse("Provided invalid information", "Provided invalid information", 400)); From a1db851eddc9b504163b6bc356ff728b13f18d70 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 10:15:33 +0530 Subject: [PATCH 036/125] Added peoper return messages and validations in update expesnse API --- Marco.Pms.Services/Service/ExpensesService.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index b7d8370..951e961 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -689,6 +689,11 @@ namespace Marco.Pms.Services.Service public async Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId) { + if (id != model.Id) + { + _logger.LogWarning("Id provided by path parameter and Id from body not matches for employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid Parameters", "Invalid Parameters", 400); + } var existingExpense = await _context.Expenses .Include(e => e.ExpensesType) .Include(e => e.Project) @@ -845,7 +850,7 @@ namespace Marco.Pms.Services.Service response.NextStatus = _mapper.Map>(nextPossibleStatuses); } - return ApiResponse.SuccessResponse(response); + return ApiResponse.SuccessResponse(response, "Expense Updated Successfully", 200); } catch (Exception ex) { From 57d7b4c07b16c53e2824e0ebcd081fcc9da66aca Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 10:38:31 +0530 Subject: [PATCH 037/125] Solved the issue of not showing final status in list and details API of expesne model --- Marco.Pms.Services/Service/ExpensesService.cs | 54 +++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 951e961..ce77f08 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1042,16 +1042,24 @@ namespace Marco.Pms.Services.Service NextStatus = g.Select(s => s.NextStatus).ToList() }).ToListAsync(); }); + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster + .AsNoTracking() + .Where(es => statusIds.Contains(es.Id)) + .ToListAsync(); + }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); - var projects = await projectTask; - var expenseTypes = await expenseTypeTask; - var paymentModes = await paymentModeTask; - var statusMappings = await statusMappingTask; - var paidBys = await paidByTask; - var createdBys = await createdByTask; + var projects = projectTask.Result; + var expenseTypes = expenseTypeTask.Result; + var paymentModes = paymentModeTask.Result; + var statusMappings = statusMappingTask.Result; + var paidBys = paidByTask.Result; + var createdBys = createdByTask.Result; expenseList = model.Select(m => { @@ -1061,6 +1069,11 @@ namespace Marco.Pms.Services.Service response.PaidBy = paidBys.Where(p => p.Id == m.PaidById).Select(p => _mapper.Map(p)).FirstOrDefault(); response.CreatedBy = createdBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); response.Status = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map(s.Status)).FirstOrDefault(); + if (response.Status == null) + { + var status = statusTask.Result; + response.Status = status.Where(s => s.Id == m.StatusId).Select(s => _mapper.Map(s)).FirstOrDefault(); + } response.NextStatus = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); response.PaymentMode = paymentModes.Where(pm => pm.Id == m.PaymentModeId).Select(pm => _mapper.Map(pm)).FirstOrDefault(); response.ExpensesType = expenseTypes.Where(et => et.Id == m.ExpensesTypeId).Select(et => _mapper.Map(et)).FirstOrDefault(); @@ -1112,16 +1125,22 @@ namespace Marco.Pms.Services.Service NextStatus = g.Select(s => s.NextStatus).ToList() }).FirstOrDefaultAsync(); }); - + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster + .AsNoTracking() + .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId)); + }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); - var project = await projectTask; - var expenseType = await expenseTypeTask; - var paymentMode = await paymentModeTask; - var statusMapping = await statusMappingTask; - var paidBy = await paidByTask; - var createdBy = await createdByTask; + var project = projectTask.Result; + var expenseType = expenseTypeTask.Result; + var paymentMode = paymentModeTask.Result; + var statusMapping = statusMappingTask.Result; + var paidBy = paidByTask.Result; + var createdBy = createdByTask.Result; var response = _mapper.Map(model); @@ -1133,6 +1152,11 @@ namespace Marco.Pms.Services.Service if (statusMapping != null) { response.Status = _mapper.Map(statusMapping.Status); + if (response.Status == null) + { + var status = statusTask.Result; + response.Status = _mapper.Map(status); + } response.NextStatus = _mapper.Map>(statusMapping.NextStatus); } From 809d64e29656875b009e75df84f97d6dda802f34 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 16:03:23 +0530 Subject: [PATCH 038/125] Added permission IDs in expesne status master View model --- .../Master/ExpensesStatusMasterVM.cs | 1 + Marco.Pms.Services/Service/ExpensesService.cs | 88 ++++++++++++++----- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs index 73a6487..8f6f02a 100644 --- a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs @@ -6,6 +6,7 @@ public string Name { get; set; } = string.Empty; public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public List? PermissionIds { get; set; } public string? Color { get; set; } public bool IsSystem { get; set; } = false; } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index ce77f08..416ecc3 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -181,13 +181,13 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); } - expenseVM = await GetAllExpnesRelatedTables(expensesList); + expenseVM = await GetAllExpnesRelatedTables(expensesList, tenantId); totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); } else { - expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList)); + expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList), tenantId); totalEntites = (int)totalCount; } // 7. --- Return Final Success Response --- @@ -249,7 +249,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); } } - var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails); + var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails, tenantId); _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); @@ -991,7 +991,7 @@ namespace Marco.Pms.Services.Service #region =================================================================== Helper Functions =================================================================== - private async Task> GetAllExpnesRelatedTables(List model) + private async Task> GetAllExpnesRelatedTables(List model, Guid tenantId) { List expenseList = new List(); var projectIds = model.Select(m => m.ProjectId).ToList(); @@ -1004,27 +1004,27 @@ namespace Marco.Pms.Services.Service var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync(); + return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); }); var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); }); var expenseTypeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id) && et.TenantId == tenantId).ToListAsync(); }); var paymentModeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id) && pm.TenantId == tenantId).ToListAsync(); }); var statusMappingTask = Task.Run(async () => { @@ -1033,7 +1033,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null && es.TenantId == tenantId) .GroupBy(s => s.StatusId) .Select(g => new { @@ -1047,17 +1047,30 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .Where(es => statusIds.Contains(es.Id)) + .Where(es => statusIds.Contains(es.Id) && es.TenantId == tenantId) .ToListAsync(); }); + var permissionStatusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .Where(ps => ps.TenantId == tenantId) + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask); var projects = projectTask.Result; var expenseTypes = expenseTypeTask.Result; var paymentModes = paymentModeTask.Result; var statusMappings = statusMappingTask.Result; + var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBys = paidByTask.Result; var createdBys = createdByTask.Result; @@ -1074,7 +1087,18 @@ namespace Marco.Pms.Services.Service var status = statusTask.Result; response.Status = status.Where(s => s.Id == m.StatusId).Select(s => _mapper.Map(s)).FirstOrDefault(); } + if (response.Status != null) + { + response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == m.StatusId).Select(ps => ps.PermissionIds).FirstOrDefault(); + } response.NextStatus = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); + if (response.NextStatus != null) + { + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } response.PaymentMode = paymentModes.Where(pm => pm.Id == m.PaymentModeId).Select(pm => _mapper.Map(pm)).FirstOrDefault(); response.ExpensesType = expenseTypes.Where(et => et.Id == m.ExpensesTypeId).Select(et => _mapper.Map(et)).FirstOrDefault(); @@ -1083,32 +1107,32 @@ namespace Marco.Pms.Services.Service return expenseList; } - private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model) + private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model, Guid tenantId) { var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId)); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId) && p.TenantId == tenantId); }); var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById)); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById) && e.TenantId == tenantId); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById)); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById) && e.TenantId == tenantId); }); var expenseTypeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId)); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId) && et.TenantId == tenantId); }); var paymentModeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId)); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId) && pm.TenantId == tenantId); }); var statusMappingTask = Task.Run(async () => { @@ -1117,7 +1141,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null) + .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null && es.TenantId == tenantId) .GroupBy(s => s.StatusId) .Select(g => new { @@ -1130,15 +1154,29 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId)); + .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId) && es.TenantId == tenantId); }); + var permissionStatusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .Where(ps => ps.TenantId == tenantId) + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + }); + // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask); var project = projectTask.Result; var expenseType = expenseTypeTask.Result; var paymentMode = paymentModeTask.Result; var statusMapping = statusMappingTask.Result; + var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBy = paidByTask.Result; var createdBy = createdByTask.Result; @@ -1157,7 +1195,15 @@ namespace Marco.Pms.Services.Service var status = statusTask.Result; response.Status = _mapper.Map(status); } + response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == Guid.Parse(model.StatusId)).Select(ps => ps.PermissionIds).FirstOrDefault(); response.NextStatus = _mapper.Map>(statusMapping.NextStatus); + if (response.NextStatus != null) + { + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } } foreach (var document in model.Documents) From c881964ab1359d89437a4134c9da0ecc1f2aa431 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 16:07:39 +0530 Subject: [PATCH 039/125] Added proper validation and logs in get expesne status, expenses type and payment mode APIs --- .../Controllers/MasterController.cs | 64 ++++++--- Marco.Pms.Services/Service/MasterService.cs | 130 +++++++++++++++--- .../ServiceInterfaces/IMasterService.cs | 9 +- 3 files changed, 161 insertions(+), 42 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 608caed..6b059b1 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -29,6 +29,7 @@ namespace Marco.Pms.Services.Controllers 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) { _context = context; @@ -36,9 +37,11 @@ namespace Marco.Pms.Services.Controllers _logger = logger; _masterHelper = masterHelper; _masterService = masterService; + tenantId = userHelper.GetTenantId(); } - // -------------------------------- Activity -------------------------------- + #region =================================================================== Activity APIs =================================================================== + [HttpGet] [Route("activities")] public async Task GetActivitiesMaster() @@ -189,7 +192,9 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(new { }, "Activity Deleted Successfully", 200)); } - // -------------------------------- Industry -------------------------------- + #endregion + + #region =================================================================== Industry APIs =================================================================== [HttpGet] [Route("industries")] @@ -202,7 +207,9 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(industries, System.String.Format("{0} industry records fetched successfully", industries.Count), 200)); } - // -------------------------------- Ticket Status -------------------------------- + #endregion + + #region =================================================================== Ticket Status APIs =================================================================== [HttpGet("ticket-status")] public async Task GetTicketStatusMaster() @@ -289,7 +296,9 @@ namespace Marco.Pms.Services.Controllers } } - // -------------------------------- Ticket Type -------------------------------- + #endregion + + #region =================================================================== Ticket Type APIs =================================================================== [HttpGet("ticket-types")] public async Task GetTicketTypeMaster() @@ -377,7 +386,9 @@ namespace Marco.Pms.Services.Controllers } } - // -------------------------------- Ticket Priority -------------------------------- + #endregion + + #region =================================================================== Ticket Priority APIs =================================================================== [HttpGet("ticket-priorities")] public async Task GetTicketPriorityMaster() @@ -465,7 +476,9 @@ namespace Marco.Pms.Services.Controllers } } - // -------------------------------- Ticket Tag -------------------------------- + #endregion + + #region =================================================================== Ticket Tag APIs =================================================================== [HttpGet("ticket-tags")] public async Task GetTicketTagMaster() @@ -553,7 +566,9 @@ namespace Marco.Pms.Services.Controllers } } - // -------------------------------- Work Category -------------------------------- + #endregion + + #region =================================================================== Work Category APIs =================================================================== [HttpGet("work-categories")] public async Task GetWorkCategoryMasterList() @@ -674,7 +689,9 @@ namespace Marco.Pms.Services.Controllers } } - // -------------------------------- Work Status -------------------------------- + #endregion + + #region =================================================================== Work Status APIs =================================================================== [HttpGet("work-status")] public async Task GetWorkStatusMasterList() @@ -713,7 +730,9 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } - // -------------------------------- Contact Category -------------------------------- + #endregion + + #region =================================================================== Contact Category APIs =================================================================== [HttpGet("contact-categories")] public async Task GetContactCategoryMasterList() @@ -782,7 +801,9 @@ namespace Marco.Pms.Services.Controllers return Ok(response); } - // -------------------------------- Contact Tag -------------------------------- + #endregion + + #region =================================================================== Contact Tag APIs =================================================================== [HttpGet("contact-tags")] public async Task GetContactTagMasterList() @@ -791,12 +812,6 @@ namespace Marco.Pms.Services.Controllers return Ok(response); } - //[HttpGet("contact-tag/{id}")] - //public async Task GetContactTagMaster(Guid id) - //{ - // return Ok(); - //} - [HttpPost("contact-tag")] public async Task CreateContactTagMaster([FromBody] CreateContactTagDto contactTagDto) { @@ -849,27 +864,34 @@ namespace Marco.Pms.Services.Controllers var response = await _masterHelper.DeleteContactTag(id); return Ok(response); } + #endregion + #region =================================================================== Expenses Type APIs =================================================================== + [HttpGet("expenses-types")] public async Task GetExpenseTypeList() { - var response = await _masterService.GetExpenseTypeListAsync(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } [HttpPost("expenses-type")] public async Task CreateExpenseType(ExpensesTypeMasterDto dto) { - var response = await _masterService.GetExpenseTypeListAsync(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } #endregion #region =================================================================== Expenses Status APIs =================================================================== + [HttpGet("expenses-status")] public async Task GetExpenseStatusList() { - var response = await _masterService.GetExpenseStatusListAsync(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetExpenseStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } @@ -877,10 +899,12 @@ namespace Marco.Pms.Services.Controllers #endregion #region =================================================================== Payment mode APIs =================================================================== + [HttpGet("payment-modes")] public async Task GetPaymentModeList() { - var response = await _masterService.GetPaymentModeListAsync(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetPaymentModeListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index bd74bce..2705e43 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1,11 +1,12 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; 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.Utilities; +using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Services.Service.ServiceInterfaces; -using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; @@ -15,36 +16,50 @@ namespace Marco.Pms.Services.Service { private readonly ApplicationDbContext _context; private readonly ILoggingService _logger; - private readonly UserHelper _userHelper; private readonly PermissionServices _permission; private readonly IMapper _mapper; - private readonly Guid tenantId; public MasterService( ApplicationDbContext context, ILoggingService logger, - UserHelper userHelper, PermissionServices permission, IMapper mapper) { _context = context; _logger = logger; - _userHelper = userHelper; _permission = permission; _mapper = mapper; - tenantId = userHelper.GetTenantId(); } #region =================================================================== Expenses Type APIs =================================================================== - public async Task> GetExpenseTypeListAsync() + public async Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId) { - var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync(); - return ApiResponse.SuccessResponse(typeList); + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of expense type from different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Featching the list of Expenses Type. + var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync(); + var response = _mapper.Map>(typeList); + + _logger.LogInfo("{Count} records of expense type have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(response, $"{response.Count} records of expense type have been fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching list of expense type list by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } - public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto) + public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto, Employee loggedInEmployee, Guid tenantId) { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); if (!hasManagePermission) { @@ -52,26 +67,105 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); } var expensesType = _mapper.Map(dto); - return ApiResponse.SuccessResponse(expensesType); + _context.ExpensesTypeMaster.Add(expensesType); + await _context.SaveChangesAsync(); + _logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, "Expense type craeted Successfully", 201); } #endregion #region =================================================================== Expenses Status APIs =================================================================== - public async Task> GetExpenseStatusListAsync() + public async Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId) { - var typeList = await _context.ExpensesStatusMaster.Where(et => et.TenantId == tenantId).ToListAsync(); - return ApiResponse.SuccessResponse(typeList); + + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of expense status from different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Featching the list of Expenses Status. + var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId).ToListAsync(); + var response = _mapper.Map>(statusList); + + var statusIds = statusList.Select(s => s.Id).ToList(); + var permissionStatusMapping = await _context.StatusPermissionMapping + .Where(ps => statusIds.Contains(ps.StatusId)) + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + + foreach (var status in response) + { + status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + + _logger.LogInfo("{Count} records of expense status have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(response, $"{response.Count} records of expense status have been fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching list of expense sattus list by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } } #endregion #region =================================================================== Payment mode APIs =================================================================== - public async Task> GetPaymentModeListAsync() + public async Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId) { - var typeList = await _context.PaymentModeMatser.Where(et => et.TenantId == tenantId).ToListAsync(); - return ApiResponse.SuccessResponse(typeList); + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to fetch the list of payment modes from different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + + // Featching the list of Payment Modes. + var paymentModes = await _context.PaymentModeMatser.Where(pm => pm.TenantId == tenantId).ToListAsync(); + var response = _mapper.Map>(paymentModes); + + _logger.LogInfo("{Count} records of payment modes have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); + return ApiResponse.SuccessResponse(response, $"{response.Count} records of payment modes have been fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while featching list of payment modes list by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured while featching list of payment modes list", ExceptionMapper(ex), 500); + } + } + + + #endregion + + #region =================================================================== Helper Function =================================================================== + 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, + } + }; } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 1b970ca..e427fc4 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -1,11 +1,12 @@ -using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Utilities; namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IMasterService { - Task> GetExpenseTypeListAsync(); - Task> GetExpenseStatusListAsync(); - Task> GetPaymentModeListAsync(); + Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); } } From c2fe726f0c92f742377de20362bf5bfbd49d2f17 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 16:16:30 +0530 Subject: [PATCH 040/125] Added signalR in update expesne API --- Marco.Pms.Services/Controllers/ExpenseController.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index ee3c36a..5bbcf2c 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -88,6 +88,11 @@ namespace Marco.Pms.Services.Controllers { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.UpdateExpanseAsync(id, model, loggedInEmployee, tenantId); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } return StatusCode(response.StatusCode, response); } From 62956d6b12e14e91e2261754f8e24a423960f06d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 17:28:27 +0530 Subject: [PATCH 041/125] solved the mearge error --- Marco.Pms.Services/Helpers/DirectoryHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Helpers/DirectoryHelper.cs b/Marco.Pms.Services/Helpers/DirectoryHelper.cs index 172ded0..cb169a1 100644 --- a/Marco.Pms.Services/Helpers/DirectoryHelper.cs +++ b/Marco.Pms.Services/Helpers/DirectoryHelper.cs @@ -740,7 +740,7 @@ namespace Marco.Pms.Services.Helpers { Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var hasAdminPermission = await _permissionServices.HasPermission(directoryAdmin, LoggedInEmployee.Id); + 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); From e1102c297808c47c3ac0ea46c554c7438abc611f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 10:26:29 +0530 Subject: [PATCH 042/125] Added an API to add new Expense type to master table for that tenant --- .../Controllers/MasterController.cs | 2 +- Marco.Pms.Services/Service/MasterService.cs | 47 ++++++++++++++----- .../ServiceInterfaces/IMasterService.cs | 13 ++++- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 6b059b1..0a5a7a8 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -879,7 +879,7 @@ namespace Marco.Pms.Services.Controllers public async Task CreateExpenseType(ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); + var response = await _masterService.CreateExpenseTypeAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 2705e43..5e816aa 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -58,21 +58,43 @@ namespace Marco.Pms.Services.Service } } - public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto dto, Employee loggedInEmployee, Guid tenantId) + public async Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId) { - var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); - if (!hasManagePermission) + try { - _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPANSES TYPE MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); - } - var expensesType = _mapper.Map(dto); - _context.ExpensesTypeMaster.Add(expensesType); - await _context.SaveChangesAsync(); - _logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to add new expense 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 EXPANSES TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + } + var expensesType = _mapper.Map(model); + expensesType.TenantId = tenantId; - var response = _mapper.Map(expensesType); - return ApiResponse.SuccessResponse(response, "Expense type craeted Successfully", 201); + _context.ExpensesTypeMaster.Add(expensesType); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Expense Type {ExpensesTypeId} was added by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, "Expense type craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new expense 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 expense type by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } } #endregion @@ -148,7 +170,6 @@ namespace Marco.Pms.Services.Service } } - #endregion #region =================================================================== Helper Function =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index e427fc4..13bdcbb 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -1,12 +1,23 @@ -using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Dtos.Master; +using Marco.Pms.Model.Employees; using Marco.Pms.Model.Utilities; namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IMasterService { + #region =================================================================== Expenses Type APIs =================================================================== Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); + + #endregion + #region =================================================================== Expenses Status APIs =================================================================== Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId); + + #endregion + #region =================================================================== Payment mode APIs =================================================================== Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); + + #endregion } } From 1834c103f05b7b931c93fb1b21ed426fddcccdce Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 10:36:57 +0530 Subject: [PATCH 043/125] Added an API to add new payment mode to master table for that tenant --- .../Dtos/Master/PaymentModeMatserDto.cs | 9 ++++ .../Controllers/MasterController.cs | 7 ++++ .../MappingProfiles/MappingProfile.cs | 25 ++++++++++- Marco.Pms.Services/Service/MasterService.cs | 41 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 1 + 5 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs diff --git a/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs b/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs new file mode 100644 index 0000000..fb89b64 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Master +{ + public class PaymentModeMatserDto + { + public Guid? Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 0a5a7a8..d959046 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -908,6 +908,13 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpPost("payment-mode")] + public async Task CreatePaymentMode(PaymentModeMatserDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreatePaymentModeAsync(dto, 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 5db13c1..6453bcd 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -188,6 +188,9 @@ namespace Marco.Pms.Services.MappingProfiles #endregion #region ======================================================= Master ======================================================= + + #region ======================================================= Expenses Type Master ======================================================= + CreateMap() .ForMember( dest => dest.Id, @@ -195,8 +198,6 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) ); CreateMap(); - CreateMap(); - CreateMap(); CreateMap() .ForMember( @@ -205,10 +206,16 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion + + #region ======================================================= Expenses Status Master ======================================================= + + CreateMap(); CreateMap() .ForMember( @@ -217,10 +224,22 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion + + #region ======================================================= Payment Mode Matser ======================================================= + + CreateMap() + .ForMember( + dest => dest.Id, + // Explicitly and safely convert nullable Guid to non-nullable Guid + opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) + ); + CreateMap(); CreateMap() .ForMember( @@ -229,11 +248,13 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion #endregion diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 5e816aa..12ca747 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -169,6 +169,47 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured while featching list of payment modes list", ExceptionMapper(ex), 500); } } + public async Task> CreatePaymentModeAsync(PaymentModeMatserDto 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 payment mode 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 PAYMENT MODE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + + } + // Mapping the DTO to PaymentModeMatser Model + var paymentMode = _mapper.Map(model); + paymentMode.TenantId = tenantId; + + _context.PaymentModeMatser.Add(paymentMode); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Payment Mode {PaymentModeId} was added by employee {EmployeeId}", paymentMode.Id, loggedInEmployee.Id); + + // Mapping the PaymentModeMatser Model to View Model + var response = _mapper.Map(paymentMode); + return ApiResponse.SuccessResponse(response, "Payment Mode craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new payment mode 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 payment mode by employee {EmployeeId}", 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 13bdcbb..fb2e86c 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -17,6 +17,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Payment mode APIs =================================================================== Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); #endregion } From 9cd9bac975e869f33ed1cef339d9b52b52f1acf9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 10:55:25 +0530 Subject: [PATCH 044/125] Added an API to add new Expense status to master table for that tenant --- .../Dtos/Master/ExpensesStatusMasterDto.cs | 12 ++++ .../Controllers/MasterController.cs | 4 +- .../MappingProfiles/MappingProfile.cs | 11 +++- Marco.Pms.Services/Service/MasterService.cs | 56 ++++++++++++++++++- .../ServiceInterfaces/IMasterService.cs | 2 +- 5 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Master/ExpensesStatusMasterDto.cs diff --git a/Marco.Pms.Model/Dtos/Master/ExpensesStatusMasterDto.cs b/Marco.Pms.Model/Dtos/Master/ExpensesStatusMasterDto.cs new file mode 100644 index 0000000..6bff02b --- /dev/null +++ b/Marco.Pms.Model/Dtos/Master/ExpensesStatusMasterDto.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.Dtos.Master +{ + public class ExpensesStatusMasterDto + { + public Guid? Id { get; set; } + public required string Name { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public List? PermissionIds { get; set; } + public required string? Color { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index d959046..4ccd30b 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -888,10 +888,10 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Expenses Status APIs =================================================================== [HttpGet("expenses-status")] - public async Task GetExpenseStatusList() + public async Task GetExpensesStatusList() { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpenseStatusListAsync(loggedInEmployee, tenantId); + var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 6453bcd..2a99028 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -195,7 +195,7 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.Id, // Explicitly and safely convert nullable Guid to non-nullable Guid - opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) + opt => opt.MapFrom(src => src.Id ?? Guid.Empty) ); CreateMap(); @@ -215,6 +215,13 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Expenses Status Master ======================================================= + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id ?? Guid.Empty)) + .ForMember( + dest => dest.DisplayName, + opt => opt.MapFrom(src => string.IsNullOrWhiteSpace(src.DisplayName) ? src.Name : src.DisplayName)); CreateMap(); CreateMap() @@ -237,7 +244,7 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.Id, // Explicitly and safely convert nullable Guid to non-nullable Guid - opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) + opt => opt.MapFrom(src => src.Id ?? Guid.Empty) ); CreateMap(); diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 12ca747..919ccdc 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -3,6 +3,7 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Master; @@ -100,7 +101,7 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Expenses Status APIs =================================================================== - public async Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId) + public async Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId) { try @@ -141,6 +142,59 @@ namespace Marco.Pms.Services.Service } } + public async Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto 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 Expense Status 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 EXPENSE STATUS MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + + } + // Mapping the DTO to ExpensesStatusMaster Model + var expensesStatus = _mapper.Map(model); + expensesStatus.TenantId = tenantId; + + _context.ExpensesStatusMaster.Add(expensesStatus); + + if (model.PermissionIds?.Any() ?? false) + { + var permissionStatusMappings = model.PermissionIds.Select(p => new StatusPermissionMapping + { + PermissionId = p, + StatusId = expensesStatus.Id, + TenantId = tenantId + }).ToList(); + + _context.StatusPermissionMapping.AddRange(permissionStatusMappings); + } + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id); + + // Mapping the ExpensesStatusMaster Model to View Model + var response = _mapper.Map(expensesStatus); + return ApiResponse.SuccessResponse(response, "Expense Status craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new Expense Status 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 Expense Status by employee {EmployeeId}", 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 fb2e86c..8c54850 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -12,7 +12,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Expenses Status APIs =================================================================== - Task> GetExpenseStatusListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Payment mode APIs =================================================================== From cad631ec7aa249bde5f94dc32c9299a8d8f73ce4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 11:07:15 +0530 Subject: [PATCH 045/125] Added the end point for add expenses status API --- Marco.Pms.Services/Controllers/MasterController.cs | 8 +++++++- .../Service/ServiceInterfaces/IMasterService.cs | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 4ccd30b..0f34a05 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -894,7 +894,13 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } - + [HttpPost("expenses-status")] + public async Task CreateExpensesStatus(ExpensesStatusMasterDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreateExpensesStatusAsync(dto, 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 8c54850..7269ee0 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -13,6 +13,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Expenses Status APIs =================================================================== Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); + Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Payment mode APIs =================================================================== From 5b5aa9f77a910af4edaf37195af7681313bd7d49 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 11:52:47 +0530 Subject: [PATCH 046/125] Added an API to update Expense type to master table for that tenant --- .../Controllers/MasterController.cs | 7 ++ Marco.Pms.Services/Service/MasterService.cs | 82 ++++++++++++++++++- .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 0f34a05..3f00d2e 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -882,6 +882,13 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.CreateExpenseTypeAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-type/edit/{id}")] + public async Task UpdateExpenseType(Guid id, ExpensesTypeMasterDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateExpenseTypeAsync(id, dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } #endregion diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 919ccdc..a03c8ef 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1,12 +1,15 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; @@ -19,17 +22,23 @@ namespace Marco.Pms.Services.Service private readonly ILoggingService _logger; private readonly PermissionServices _permission; private readonly IMapper _mapper; + private readonly UtilityMongoDBHelper _updateLogHelper; + private readonly CacheUpdateHelper _cache; public MasterService( ApplicationDbContext context, ILoggingService logger, PermissionServices permission, - IMapper mapper) + IMapper mapper, + UtilityMongoDBHelper updateLogHelper, + CacheUpdateHelper cache) { _context = context; _logger = logger; _permission = permission; _mapper = mapper; + _updateLogHelper = updateLogHelper; + _cache = cache; } #region =================================================================== Expenses Type APIs =================================================================== @@ -97,6 +106,77 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> UpdateExpenseTypeAsync(Guid id, ExpensesTypeMasterDto 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 expense 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 EXPANSES TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 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 expensesType = await _context.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); + + // Checking if expense type exists + if (expensesType == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to update expense type, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Expense Type not found", "Expense Type not found", 404); + } + + // Mapping ExpensesTypeMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesType); + + // Mapping ExpensesTypeMasterDto to ExpensesTypeMaster + _mapper.Map(model, expensesType); + + _context.ExpensesTypeMaster.Update(expensesType); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Expense Type {ExpensesTypeId} was updated by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = expensesType.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "ExpensesTypeMasterModificationLog"); + + // Mapping ExpensesTypeMaster to ExpensesTypeMasterVM + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, "Expense type updated Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while updating expense 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 expense type by employee {EmployeeId}", 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 7269ee0..67217c4 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -9,6 +9,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Expenses Type APIs =================================================================== Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdateExpenseTypeAsync(Guid id, ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Expenses Status APIs =================================================================== From a196906bf9efa97c8d83c33e98818e582c9fb677 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 12:07:16 +0530 Subject: [PATCH 047/125] Added an API to update payment mode to master table for that tenant --- .../Controllers/MasterController.cs | 8 ++ Marco.Pms.Services/Service/MasterService.cs | 82 +++++++++++++++++-- .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 3f00d2e..1571229 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -929,6 +929,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpPut("payment-mode/edit/{id}")] + public async Task UpdatePaymentMode(Guid id, PaymentModeMatserDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdatePaymentModeAsync(id, dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion } } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index a03c8ef..4334370 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -82,7 +82,7 @@ namespace Marco.Pms.Services.Service if (!hasManagePermission) { _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPANSES TYPE MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } var expensesType = _mapper.Map(model); expensesType.TenantId = tenantId; @@ -122,7 +122,7 @@ namespace Marco.Pms.Services.Service if (!hasManagePermission) { _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPANSES TYPE MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } // Validating the prvided data @@ -150,7 +150,7 @@ namespace Marco.Pms.Services.Service _context.ExpensesTypeMaster.Update(expensesType); await _context.SaveChangesAsync(); - _logger.LogInfo("New Expense Type {ExpensesTypeId} was updated by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); + _logger.LogInfo("Expense Type {ExpensesTypeId} was updated by employee {EmployeeId}", expensesType.Id, loggedInEmployee.Id); // Saving the old entity in mongoDB @@ -236,7 +236,7 @@ namespace Marco.Pms.Services.Service if (!hasManagePermission) { _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing EXPENSE STATUS MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } // Mapping the DTO to ExpensesStatusMaster Model @@ -317,7 +317,7 @@ namespace Marco.Pms.Services.Service if (!hasManagePermission) { _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 Upload expenses for this project", 403); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } // Mapping the DTO to PaymentModeMatser Model @@ -345,6 +345,78 @@ namespace Marco.Pms.Services.Service } } + public async Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto 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 Payment Mode 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 PAYMENT MODE 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 paymentMode = await _context.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); + + // Checking if Payment Mode exists + if (paymentMode == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to update Payment Mode, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404); + } + + // Mapping PaymentModeMatser to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(paymentMode); + + // Mapping PaymentModeMatserDto to PaymentModeMatser + _mapper.Map(model, paymentMode); + + _context.PaymentModeMatser.Update(paymentMode); + await _context.SaveChangesAsync(); + + _logger.LogInfo("Payment Mode {PaymentModeId} was updated by employee {EmployeeId}", paymentMode.Id, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = paymentMode.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "PaymentModeMasterModificationLog"); + + // Mapping PaymentModeMatser to PaymentModeMatserVM + var response = _mapper.Map(paymentMode); + return ApiResponse.SuccessResponse(response, "Payment Mode updated Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while updating Payment Mode by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while updating Payment Mode by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } + #endregion #region =================================================================== Helper Function =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 67217c4..e5e869c 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -20,6 +20,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Payment mode APIs =================================================================== Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); #endregion } From 2ad0638d4f3356f9c8a54e1bb07d6467a08b0f09 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 12:26:34 +0530 Subject: [PATCH 048/125] Added applied filters in response --- Marco.Pms.Services/Service/ExpensesService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 416ecc3..6ee264b 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -195,6 +195,7 @@ namespace Marco.Pms.Services.Service _logger.LogInfo(message); var response = new { + Filter = expenseFilter, CurrentPage = pageNumber, TotalPages = totalPages, TotalEntites = totalEntites, From e31e19ed74ab1c87295f261ba5025a852215d9ac Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 12:28:06 +0530 Subject: [PATCH 049/125] Added an API to update expenses status to master table for that tenant --- .../Controllers/MasterController.cs | 7 ++ Marco.Pms.Services/Service/MasterService.cs | 99 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 107 insertions(+) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 1571229..013c890 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -908,6 +908,13 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.CreateExpensesStatusAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-status/edit/{id}")] + public async Task UpdateExpensesStatus(Guid id, ExpensesStatusMasterDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.UpdateExpensesStatusAsync(id, dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } #endregion diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 4334370..294b13c 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -12,12 +12,14 @@ using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; +using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Service { public class MasterService : IMasterService { + private readonly IDbContextFactory _dbContextFactory; private readonly ApplicationDbContext _context; private readonly ILoggingService _logger; private readonly PermissionServices _permission; @@ -26,6 +28,7 @@ namespace Marco.Pms.Services.Service private readonly CacheUpdateHelper _cache; public MasterService( + IDbContextFactory dbContextFactory, ApplicationDbContext context, ILoggingService logger, PermissionServices permission, @@ -33,6 +36,7 @@ namespace Marco.Pms.Services.Service UtilityMongoDBHelper updateLogHelper, CacheUpdateHelper cache) { + _dbContextFactory = dbContextFactory; _context = context; _logger = logger; _permission = permission; @@ -275,6 +279,101 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto 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 Expense Status 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 EXPENSE STATUS 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); + } + // featching expenses status and permissions parallelly + var expensesStatusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster.AsNoTracking() + .FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); + }); + + var permissionStatusMappingsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .AsNoTracking() + .Where(ps => ps.StatusId == model.Id.Value && ps.TenantId == tenantId) + .ToListAsync(); + }); + + await Task.WhenAll(expensesStatusTask, permissionStatusMappingsTask); + var expensesStatus = expensesStatusTask.Result; + + // Checking if Expense Status exists + if (expensesStatus == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to update Expense Status, but not found in database", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Expense Status not found", "Expense Status not found", 404); + } + + // Mapping ExpensesStatusMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus); + + // Mapping ExpensesStatusMasterDto to ExpensesStatusMaster + _mapper.Map(model, expensesStatus); + + _context.ExpensesStatusMaster.Update(expensesStatus); + + var permissionStatusMappings = permissionStatusMappingsTask.Result; + var permissionIds = permissionStatusMappings.Select(ps => ps.PermissionId).ToList(); + if (model.PermissionIds != null) + { + var newPermissionStatusMappings = model.PermissionIds.Where(p => !permissionIds.Contains(p)).Select(p => new StatusPermissionMapping + { + PermissionId = p, + StatusId = expensesStatus.Id, + TenantId = tenantId + }).ToList(); + var deletedPermissionStatusMappings = permissionStatusMappings.Where(ps => !model.PermissionIds.Contains(ps.PermissionId)).ToList(); + + _context.StatusPermissionMapping.AddRange(newPermissionStatusMappings); + _context.StatusPermissionMapping.RemoveRange(deletedPermissionStatusMappings); + + } + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id); + + // Mapping the ExpensesStatusMaster Model to View Model + var response = _mapper.Map(expensesStatus); + return ApiResponse.SuccessResponse(response, "Expense Status craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new Expense Status 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 Expense Status by employee {EmployeeId}", 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 e5e869c..24a26bf 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -15,6 +15,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Expenses Status APIs =================================================================== Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); + Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Payment mode APIs =================================================================== From b4931aafd6b9be2c74be8ee13de51935345dff58 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 12:54:49 +0530 Subject: [PATCH 050/125] Added an API to modify isActive parameter in Expense type master table for that tenant --- .../Controllers/MasterController.cs | 24 +++++-- Marco.Pms.Services/Service/MasterService.cs | 62 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 013c890..411a413 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -875,21 +875,31 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPost("expenses-type")] - public async Task CreateExpenseType(ExpensesTypeMasterDto dto) + public async Task CreateExpenseType([FromBody] ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreateExpenseTypeAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-type/edit/{id}")] - public async Task UpdateExpenseType(Guid id, ExpensesTypeMasterDto dto) + public async Task UpdateExpenseType(Guid id, [FromBody] ExpensesTypeMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdateExpenseTypeAsync(id, dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpDelete("expenses-type/delete/{id}")] + public async Task DeleteExpenseType(Guid id, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteExpenseTypeAsync(id, isActive, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Expenses Status APIs =================================================================== @@ -901,15 +911,17 @@ namespace Marco.Pms.Services.Controllers var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPost("expenses-status")] - public async Task CreateExpensesStatus(ExpensesStatusMasterDto dto) + public async Task CreateExpensesStatus([FromBody] ExpensesStatusMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreateExpensesStatusAsync(dto, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } + [HttpPut("expenses-status/edit/{id}")] - public async Task UpdateExpensesStatus(Guid id, ExpensesStatusMasterDto dto) + public async Task UpdateExpensesStatus(Guid id, [FromBody] ExpensesStatusMasterDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdateExpensesStatusAsync(id, dto, loggedInEmployee, tenantId); @@ -929,7 +941,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPost("payment-mode")] - public async Task CreatePaymentMode(PaymentModeMatserDto dto) + public async Task CreatePaymentMode([FromBody] PaymentModeMatserDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.CreatePaymentModeAsync(dto, loggedInEmployee, tenantId); @@ -937,7 +949,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPut("payment-mode/edit/{id}")] - public async Task UpdatePaymentMode(Guid id, PaymentModeMatserDto dto) + public async Task UpdatePaymentMode(Guid id, [FromBody] PaymentModeMatserDto dto) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _masterService.UpdatePaymentModeAsync(id, dto, loggedInEmployee, tenantId); diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 294b13c..a23a597 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -181,6 +181,68 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + string action = isActive ? "delete" : "restore"; + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to {Action} expense 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 EXPANSES TYPE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var expensesType = await _context.ExpensesTypeMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if expense type exists + if (expensesType == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} expense type, but not found in database", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Expense Type not found", "Expense Type not found", 404); + } + + // Mapping ExpensesTypeMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesType); + + expensesType.IsActive = isActive; + await _context.SaveChangesAsync(); + + _logger.LogInfo("Expense Type {ExpensesTypeId} was {Action}d by employee {EmployeeId}", expensesType.Id, action, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = expensesType.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "ExpensesTypeMasterModificationLog"); + + // Mapping ExpensesTypeMaster to ExpensesTypeMasterVM + var response = _mapper.Map(expensesType); + return ApiResponse.SuccessResponse(response, $"Expense type {action}d Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while {Action}ing expense 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 expense 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 24a26bf..774ac4a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -10,6 +10,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpenseTypeAsync(Guid id, ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Expenses Status APIs =================================================================== From f1e9a8655a9f0aeaffec931ae4efa202b64096bf Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 13:02:13 +0530 Subject: [PATCH 051/125] Added an API to modify isActive parameter in Expense status master table for that tenant --- .../Controllers/MasterController.cs | 8 +++ Marco.Pms.Services/Service/MasterService.cs | 63 ++++++++++++++++++- .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 411a413..a7b441e 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -928,6 +928,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpDelete("expenses-status/delete/{id}")] + public async Task DeleteExpensesStatus(Guid id, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeleteExpensesStatusAsync(id, isActive, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Payment mode APIs =================================================================== diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index a23a597..d264d11 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -287,7 +287,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } - public async Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId) { try @@ -436,6 +435,68 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + string action = isActive ? "delete" : "restore"; + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to {Action} Expense Status 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 EXPENSE STATUS MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if Expense Status exists + if (expensesStatus == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} Expense Status, but not found in database", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Expense Status not found", "Expense Status not found", 404); + } + + // Mapping ExpensesStatusMaster to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus); + + expensesStatus.IsActive = isActive; + await _context.SaveChangesAsync(); + + _logger.LogInfo("Expense Status {ExpensesStatusId} was {Action}d by employee {EmployeeId}", expensesStatus.Id, action, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = expensesStatus.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "ExpensesStatusMasterModificationLog"); + + // Mapping ExpensesStatusMaster to ExpensesStatusMasterVM + var response = _mapper.Map(expensesStatus); + return ApiResponse.SuccessResponse(response, $"Expense Status {action}d Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while {Action}ing Expense Status 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 Expense Status 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 774ac4a..039f5bf 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -17,6 +17,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); + Task> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion #region =================================================================== Payment mode APIs =================================================================== From aa47bfe59c10bea07a1e043fb951e994eab0b725 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 25 Jul 2025 13:06:28 +0530 Subject: [PATCH 052/125] Added an API to modify isActive parameter in Payment mode master table for that tenant --- .../Controllers/MasterController.cs | 8 +++ Marco.Pms.Services/Service/MasterService.cs | 63 ++++++++++++++++++- .../ServiceInterfaces/IMasterService.cs | 1 + 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index a7b441e..2cfc1fe 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -964,6 +964,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpDelete("payment-mode/delete/{id}")] + public async Task DeletePaymentMode(Guid id, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.DeletePaymentModeAsync(id, isActive, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + #endregion } } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index d264d11..e33fc59 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -566,7 +566,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } - public async Task> UpdatePaymentModeAsync(Guid id, PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId) { try @@ -638,6 +637,68 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } + public async Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) + { + string action = isActive ? "delete" : "restore"; + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to {Action} Payment Mode 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 EXPENSE STATUS MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); + } + + var paymentMode = await _context.PaymentModeMatser.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + + // Checking if Payment Mode exists + if (paymentMode == null) + { + _logger.LogWarning("Employee {EmployeeId} tries to {Action} Payment Mode, but not found in database", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse("Payment Mode not found", "Payment Mode not found", 404); + } + + // Mapping PaymentModeMatser to BsonDocument + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(paymentMode); + + paymentMode.IsActive = isActive; + await _context.SaveChangesAsync(); + + _logger.LogInfo("Payment Mode {PaymentModeId} was {Action}d by employee {EmployeeId}", paymentMode.Id, action, loggedInEmployee.Id); + + // Saving the old entity in mongoDB + + var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = paymentMode.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "PaymentModeMatserModificationLog"); + + // Mapping PaymentModeMatser to PaymentModeMatserVM + var response = _mapper.Map(paymentMode); + return ApiResponse.SuccessResponse(response, $"Payment Mode {action}d Successfully", 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while {Action}ing Payment Mode 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 Payment Mode 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 039f5bf..41154a9 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -24,6 +24,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetPaymentModeListAsync(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 } From 57d2b03c02c4990ab02fa69d7f3e55069bc9c417 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 26 Jul 2025 09:11:04 +0530 Subject: [PATCH 053/125] Change the id else logic to show proper message upon deletion or resotation of master entity in expenses module --- Marco.Pms.Services/Service/MasterService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index e33fc59..daa4191 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -183,7 +183,7 @@ namespace Marco.Pms.Services.Service } public async Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) { - string action = isActive ? "delete" : "restore"; + string action = isActive ? "restore" : "delete"; try { // Validation if employee is taking action in same tenant @@ -437,7 +437,7 @@ namespace Marco.Pms.Services.Service } public async Task> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) { - string action = isActive ? "delete" : "restore"; + string action = isActive ? "restore" : "delete"; try { // Validation if employee is taking action in same tenant @@ -639,7 +639,7 @@ namespace Marco.Pms.Services.Service } public async Task> DeletePaymentModeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId) { - string action = isActive ? "delete" : "restore"; + string action = isActive ? "restore" : "delete"; try { // Validation if employee is taking action in same tenant From 7619ce9820ae15a430f344008616495903266bb7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 26 Jul 2025 09:17:26 +0530 Subject: [PATCH 054/125] FIltering the master list by active and inactive --- Marco.Pms.Services/Controllers/MasterController.cs | 12 ++++++------ Marco.Pms.Services/Service/MasterService.cs | 14 +++++++------- .../Service/ServiceInterfaces/IMasterService.cs | 8 +++++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 2cfc1fe..61d9a2e 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -869,10 +869,10 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Expenses Type APIs =================================================================== [HttpGet("expenses-types")] - public async Task GetExpenseTypeList() + public async Task GetExpenseTypeList([FromQuery] bool isActive = true) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId); + var response = await _masterService.GetExpenseTypeListAsync(loggedInEmployee, tenantId, isActive); return StatusCode(response.StatusCode, response); } @@ -905,10 +905,10 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Expenses Status APIs =================================================================== [HttpGet("expenses-status")] - public async Task GetExpensesStatusList() + public async Task GetExpensesStatusList([FromQuery] bool isActive = true) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); + var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId, isActive); return StatusCode(response.StatusCode, response); } @@ -941,10 +941,10 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Payment mode APIs =================================================================== [HttpGet("payment-modes")] - public async Task GetPaymentModeList() + public async Task GetPaymentModeList([FromQuery] bool isActive = true) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetPaymentModeListAsync(loggedInEmployee, tenantId); + var response = await _masterService.GetPaymentModeListAsync(loggedInEmployee, tenantId, isActive); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index daa4191..16d98b2 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -47,7 +47,7 @@ namespace Marco.Pms.Services.Service #region =================================================================== Expenses Type APIs =================================================================== - public async Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId) + public async Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive) { try { @@ -59,7 +59,7 @@ namespace Marco.Pms.Services.Service } // Featching the list of Expenses Type. - var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId).ToListAsync(); + var typeList = await _context.ExpensesTypeMaster.Where(et => et.TenantId == tenantId && et.IsActive == isActive).ToListAsync(); var response = _mapper.Map>(typeList); _logger.LogInfo("{Count} records of expense type have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); @@ -247,7 +247,7 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Expenses Status APIs =================================================================== - public async Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId) + public async Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive) { try @@ -260,7 +260,7 @@ namespace Marco.Pms.Services.Service } // Featching the list of Expenses Status. - var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId).ToListAsync(); + var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId && es.IsActive == isActive).ToListAsync(); var response = _mapper.Map>(statusList); var statusIds = statusList.Select(s => s.Id).ToList(); @@ -455,7 +455,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } - var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); + var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId && !et.IsSystem); // Checking if Expense Status exists if (expensesStatus == null) @@ -501,7 +501,7 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Payment mode APIs =================================================================== - public async Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId) + public async Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive) { try { @@ -513,7 +513,7 @@ namespace Marco.Pms.Services.Service } // Featching the list of Payment Modes. - var paymentModes = await _context.PaymentModeMatser.Where(pm => pm.TenantId == tenantId).ToListAsync(); + var paymentModes = await _context.PaymentModeMatser.Where(pm => pm.TenantId == tenantId && pm.IsActive == isActive).ToListAsync(); var response = _mapper.Map>(paymentModes); _logger.LogInfo("{Count} records of payment modes have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 41154a9..7a64b3a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -7,21 +7,23 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces public interface IMasterService { #region =================================================================== Expenses Type APIs =================================================================== - Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetExpenseTypeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive); Task> CreateExpenseTypeAsync(ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpenseTypeAsync(Guid id, ExpensesTypeMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> DeleteExpenseTypeAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion + #region =================================================================== Expenses Status APIs =================================================================== - Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive); Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); Task> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); #endregion + #region =================================================================== Payment mode APIs =================================================================== - Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive); 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); From 61741331e084176ba50cd4dfcffcc2de0bd4a2bc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 28 Jul 2025 10:37:18 +0530 Subject: [PATCH 055/125] Corrected the feaching logic for expense delete API --- Marco.Pms.Services/Service/ExpensesService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 6ee264b..eadea99 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -874,7 +874,7 @@ namespace Marco.Pms.Services.Service public async Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { - var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.CreatedById == loggedInEmployee.Id && e.TenantId == tenantId); + var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.TenantId == tenantId); var hasAprrovePermissionTask = Task.Run(async () => { From 5b091a8d6f1eb39d61cca378d77331710b451a3a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 28 Jul 2025 11:18:26 +0530 Subject: [PATCH 056/125] Rewrite the uf condiotn in get expense details API --- Marco.Pms.Services/Service/ExpensesService.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index eadea99..c838aab 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1191,12 +1191,7 @@ namespace Marco.Pms.Services.Service if (statusMapping != null) { response.Status = _mapper.Map(statusMapping.Status); - if (response.Status == null) - { - var status = statusTask.Result; - response.Status = _mapper.Map(status); - } - response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == Guid.Parse(model.StatusId)).Select(ps => ps.PermissionIds).FirstOrDefault(); + response.NextStatus = _mapper.Map>(statusMapping.NextStatus); if (response.NextStatus != null) { @@ -1206,6 +1201,12 @@ namespace Marco.Pms.Services.Service } } } + if (response.Status == null) + { + var status = statusTask.Result; + response.Status = _mapper.Map(status); + } + response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == Guid.Parse(model.StatusId)).Select(ps => ps.PermissionIds).FirstOrDefault(); foreach (var document in model.Documents) { From 0b2883af0fd74319baf56d5e5ddc7165917089c6 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 28 Jul 2025 18:00:37 +0530 Subject: [PATCH 057/125] Added proper reponse message in expense APIs --- Marco.Pms.Services/Service/ExpensesService.cs | 227 +++++------------- Marco.Pms.Services/Service/MasterService.cs | 8 +- 2 files changed, 68 insertions(+), 167 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index c838aab..7d30672 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -206,34 +206,12 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while fetching list expenses"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } catch (Exception ex) { _logger.LogError(ex, "Error occured while fetching list expenses"); - return ApiResponse.ErrorResponse("Error Occured", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } public async Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId) @@ -259,18 +237,7 @@ namespace Marco.Pms.Services.Service catch (Exception ex) { _logger.LogError(ex, "An unhandled exception occurred while fetching an expense details {ExpenseId}.", id); - return ApiResponse.ErrorResponse("An internal server error occurred.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); } } public async Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId) @@ -284,18 +251,7 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while fetching suppler name list from expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } } @@ -448,50 +404,17 @@ namespace Marco.Pms.Services.Service { await transaction.RollbackAsync(); _logger.LogError(dbEx, "Databsae Exception occured while adding expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } catch (ArgumentException ex) // Catches bad Base64 from attachment pre-validation { _logger.LogError(ex, "Invalid argument during expense creation for project {ProjectId}.", dto.ProjectId); - return ApiResponse.ErrorResponse("Invalid Request Data.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 400); + return ApiResponse.ErrorResponse("Invalid Request Data.", ExceptionMapper(ex), 400); } catch (Exception ex) // General-purpose catch for unexpected errors (e.g., S3 or DB connection failure) { _logger.LogError(ex, "An unhandled exception occurred while creating an expense for project {ProjectId}.", dto.ProjectId); - return ApiResponse.ErrorResponse("An internal server error occurred.", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); } } @@ -705,8 +628,6 @@ namespace Marco.Pms.Services.Service .Include(e => e.CreatedBy) .FirstOrDefaultAsync(e => e.Id == model.Id && - e.CreatedById == loggedInEmployee.Id && - (e.StatusId == Draft || e.StatusId == Rejected) && e.TenantId == tenantId); @@ -716,6 +637,17 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); } + if (existingExpense.StatusId != Draft && existingExpense.StatusId != Rejected) + { + _logger.LogWarning("User attempted to update expense with ID {ExpenseId}, but donot have status of DRAFT or REJECTED", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Expense connot be updated", "Expense connot be updated", 400); + } + if (existingExpense.CreatedById != loggedInEmployee.Id) + { + _logger.LogWarning("User attempted to update expense with ID {ExpenseId} which not created by them", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You donot have access to update this expense", "You donot have access to update this expense", 400); + } + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); // Capture state for audit log BEFORE changes _mapper.Map(model, existingExpense); _context.Entry(existingExpense).State = EntityState.Modified; @@ -748,18 +680,7 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while adding new attachments during updating expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } } @@ -777,34 +698,12 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while deleting attachments during updating expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } catch (Exception ex) { _logger.LogError(ex, "Exception occured while deleting attachments during updating expense"); - return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", ExceptionMapper(ex), 500); } } } @@ -874,7 +773,11 @@ namespace Marco.Pms.Services.Service public async Task> DeleteExpanseAsync(Guid id, Employee loggedInEmployee, Guid tenantId) { - var expenseQuery = _context.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.TenantId == tenantId); + var expenseTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses.Where(e => e.Id == id && e.StatusId == Draft && e.TenantId == tenantId).FirstOrDefaultAsync(); + }); var hasAprrovePermissionTask = Task.Run(async () => { @@ -883,13 +786,11 @@ namespace Marco.Pms.Services.Service return await permissionService.HasPermission(PermissionsMaster.ExpenseApprove, loggedInEmployee.Id); }); - var hasAprrovePermission = await hasAprrovePermissionTask; - if (!hasAprrovePermission) - { - expenseQuery = expenseQuery.Where(e => e.CreatedById == loggedInEmployee.Id); - } + await Task.WhenAll(expenseTask, hasAprrovePermissionTask); + + var hasAprrovePermission = hasAprrovePermissionTask.Result; + var existingExpense = expenseTask.Result; - var existingExpense = await expenseQuery.FirstOrDefaultAsync(); if (existingExpense == null) { var message = hasAprrovePermission ? "Expenses not found" : "Expense cannot be deleted"; @@ -903,6 +804,19 @@ namespace Marco.Pms.Services.Service } return ApiResponse.ErrorResponse(message, message, 400); } + if (existingExpense.StatusId != Draft) + { + _logger.LogWarning("User attempted to delete expense with ID {ExpenseId}, but donot have status of DRAFT or REJECTED", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Expense connot be deleted", "Expense connot be deleted", 400); + } + + if (!hasAprrovePermission && existingExpense.CreatedById != loggedInEmployee.Id) + { + _logger.LogWarning("User attempted to delete expense with ID {ExpenseId} which not created by them", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You donot have access to delete this expense", "You donot have access to delete this expense", 400); + + } + var documentIds = await _context.BillAttachments .Where(ba => ba.ExpensesId == existingExpense.Id) .Select(ba => ba.DocumentId) @@ -919,18 +833,7 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while deleting expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } try { @@ -956,34 +859,12 @@ namespace Marco.Pms.Services.Service catch (DbUpdateException dbEx) { _logger.LogError(dbEx, "Databsae Exception occured while deleting attachments during updating expense"); - return ApiResponse.ErrorResponse("Databsae Exception", new - { - Message = dbEx.Message, - StackTrace = dbEx.StackTrace, - Source = dbEx.Source, - InnerException = new - { - Message = dbEx.InnerException?.Message, - StackTrace = dbEx.InnerException?.StackTrace, - Source = dbEx.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } catch (Exception ex) { _logger.LogError(ex, "Exception occured while deleting attachments during updating expense"); - return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", new - { - Message = ex.Message, - StackTrace = ex.StackTrace, - Source = ex.Source, - InnerException = new - { - Message = ex.InnerException?.Message, - StackTrace = ex.InnerException?.StackTrace, - Source = ex.InnerException?.Source, - } - }, 500); + return ApiResponse.ErrorResponse("Exception occured while deleting attachments during updating expense ", ExceptionMapper(ex), 500); } return ApiResponse.SuccessResponse("Success", "Expense Deleted Successfully", 200); } @@ -991,7 +872,21 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Helper Functions =================================================================== - + 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, + } + }; + } private async Task> GetAllExpnesRelatedTables(List model, Guid tenantId) { List expenseList = new List(); diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 16d98b2..6d789bb 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -455,7 +455,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); } - var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId && !et.IsSystem); + var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); // Checking if Expense Status exists if (expensesStatus == null) @@ -464,6 +464,12 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense Status not found", "Expense Status not found", 404); } + if (expensesStatus.IsSystem) + { + _logger.LogWarning("Employee {Employee} attempts to {Action} Expense status, but status is system defined", loggedInEmployee.Id, action); + return ApiResponse.ErrorResponse($"Expense Status is system defined cannot able to {action}", $"Expense Status is system defined cannot able to {action}", 400); + } + // Mapping ExpensesStatusMaster to BsonDocument var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus); From 6c32a48095a65b28c56efeda7f49bc2c1686fd68 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 29 Jul 2025 15:47:49 +0530 Subject: [PATCH 058/125] Changed the display names of expense status --- Marco.Pms.DataAccess/Data/ApplicationDbContext.cs | 6 +++--- .../20250721124928_Added_Expense_Related_Tables.Designer.cs | 6 +++--- .../20250721124928_Added_Expense_Related_Tables.cs | 6 +++--- .../Migrations/ApplicationDbContextModelSnapshot.cs | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index c01668f..cc01da9 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -404,7 +404,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), Name = "Review Pending", - DisplayName = "Review", + DisplayName = "Submit", Description = "Reviewer is currently reviewing the expense.", Color = "#696cff", IsSystem = true, @@ -415,7 +415,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Name = "Approval Pending", - DisplayName = "Approve", + DisplayName = "Reviewed", Description = "Review is completed, waiting for action of approver.", Color = "#03c3ec", IsSystem = true, @@ -447,7 +447,7 @@ namespace Marco.Pms.DataAccess.Data new ExpensesStatusMaster { Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), - Name = "Processed", + Name = "Paid", DisplayName = "Paid", Description = "Expense has been settled.", Color = "#71dd37", diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index 40fe611..f359fee 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1947,7 +1947,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), Color = "#696cff", Description = "Reviewer is currently reviewing the expense.", - DisplayName = "Review", + DisplayName = "Submit", IsActive = true, IsSystem = true, Name = "Review Pending", @@ -1958,7 +1958,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", - DisplayName = "Approve", + DisplayName = "Reviewed", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1994,7 +1994,7 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Paid", IsActive = true, IsSystem = true, - Name = "Processed", + Name = "Paid", TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }); }); diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index ffc5400..30ad9ce 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -373,9 +373,9 @@ namespace Marco.Pms.DataAccess.Migrations values: new object[,] { { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#8592a3", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Approve", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Paid", true, true, "Processed", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Review", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Reviewed", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Paid", true, true, "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Submit", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#ff3e1d", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Process", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index ed3710f..83218db 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1944,7 +1944,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), Color = "#696cff", Description = "Reviewer is currently reviewing the expense.", - DisplayName = "Review", + DisplayName = "Submit", IsActive = true, IsSystem = true, Name = "Review Pending", @@ -1955,7 +1955,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", - DisplayName = "Approve", + DisplayName = "Reviewed", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1991,7 +1991,7 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Paid", IsActive = true, IsSystem = true, - Name = "Processed", + Name = "Paid", TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }); }); From ce4e52e69d2a008b5ad5f6bd92510fd8f7f21ef2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 29 Jul 2025 15:59:12 +0530 Subject: [PATCH 059/125] Chnage the name of Prosecc Pending to payment Payment pending --- Marco.Pms.DataAccess/Data/ApplicationDbContext.cs | 4 ++-- .../20250721124928_Added_Expense_Related_Tables.Designer.cs | 4 ++-- .../Migrations/20250721124928_Added_Expense_Related_Tables.cs | 2 +- .../Migrations/ApplicationDbContextModelSnapshot.cs | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index cc01da9..8e7ed83 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -436,8 +436,8 @@ namespace Marco.Pms.DataAccess.Data new ExpensesStatusMaster { Id = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - Name = "Process Pending", - DisplayName = "Process", + Name = "Payment Pending", + DisplayName = "Approved", Description = "Approved expense is awaiting final payment.", Color = "#ffab00", IsSystem = true, diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index f359fee..931ec5b 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1980,10 +1980,10 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Color = "#ffab00", Description = "Approved expense is awaiting final payment.", - DisplayName = "Process", + DisplayName = "Approved", IsActive = true, IsSystem = true, - Name = "Process Pending", + Name = "Payment Pending", TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, new diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index 30ad9ce..f7f74ef 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -377,7 +377,7 @@ namespace Marco.Pms.DataAccess.Migrations { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Paid", true, true, "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Submit", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#ff3e1d", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Process", true, true, "Process Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Approved", true, true, "Payment Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); migrationBuilder.InsertData( diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 83218db..8765c37 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1977,10 +1977,10 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Color = "#ffab00", Description = "Approved expense is awaiting final payment.", - DisplayName = "Process", + DisplayName = "Approved", IsActive = true, IsSystem = true, - Name = "Process Pending", + Name = "Payment Pending", TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, new From f4368ae4e3a1374a1b35bcf1008d643d09d3fdde Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 29 Jul 2025 17:17:57 +0530 Subject: [PATCH 060/125] change display name fo expense status from Paid to Mark as Paid --- Marco.Pms.DataAccess/Data/ApplicationDbContext.cs | 2 +- .../20250721124928_Added_Expense_Related_Tables.Designer.cs | 2 +- .../Migrations/20250721124928_Added_Expense_Related_Tables.cs | 2 +- .../Migrations/ApplicationDbContextModelSnapshot.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 8e7ed83..92a0251 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -448,7 +448,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), Name = "Paid", - DisplayName = "Paid", + DisplayName = "Mark as Paid", Description = "Expense has been settled.", Color = "#71dd37", IsSystem = true, diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index 931ec5b..b370dc4 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1991,7 +1991,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), Color = "#71dd37", Description = "Expense has been settled.", - DisplayName = "Paid", + DisplayName = "Mark as Paid", IsActive = true, IsSystem = true, Name = "Paid", diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index f7f74ef..d4259fa 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -374,7 +374,7 @@ namespace Marco.Pms.DataAccess.Migrations { { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#8592a3", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Reviewed", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Paid", true, true, "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Mark as Paid", true, true, "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Submit", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#ff3e1d", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Approved", true, true, "Payment Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 8765c37..592e88d 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1988,7 +1988,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), Color = "#71dd37", Description = "Expense has been settled.", - DisplayName = "Paid", + DisplayName = "Mark as Paid", IsActive = true, IsSystem = true, Name = "Paid", From 0c1cb98f5b81b74a2223c95bded5500468f2ac2a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 29 Jul 2025 18:11:33 +0530 Subject: [PATCH 061/125] Added the code to save reimbursement in database --- .../Dtos/Expenses/ExpenseRecordDto.cs | 3 ++ .../ViewModels/Expenses/ExpenseDetailsVM.cs | 1 + .../Expenses/ExpensesReimburseVM.cs | 13 ++++++ .../MappingProfiles/MappingProfile.cs | 2 + Marco.Pms.Services/Service/ExpensesService.cs | 41 ++++++++++++++++++- 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 Marco.Pms.Model/ViewModels/Expenses/ExpensesReimburseVM.cs diff --git a/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs index 3731f3b..d59c90e 100644 --- a/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs +++ b/Marco.Pms.Model/Dtos/Expenses/ExpenseRecordDto.cs @@ -5,5 +5,8 @@ public Guid ExpenseId { get; set; } public Guid StatusId { get; set; } public string? Comment { get; set; } + public string? ReimburseTransactionId { get; set; } + public DateTime? ReimburseDate { get; set; } + public Guid? ReimburseById { get; set; } } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs index 34ecc24..b59bd59 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -27,5 +27,6 @@ namespace Marco.Pms.Model.ViewModels.Expenses public string? GSTNumber { get; set; } public int? NoOfPersons { get; set; } public bool IsActive { get; set; } = true; + public List ExpensesReimburse { get; set; } = new List(); } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpensesReimburseVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpensesReimburseVM.cs new file mode 100644 index 0000000..75e04ba --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpensesReimburseVM.cs @@ -0,0 +1,13 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.Expenses +{ + public class ExpensesReimburseVM + { + public Guid Id { get; set; } + public string ReimburseTransactionId { get; set; } = string.Empty; + public DateTime ReimburseDate { get; set; } + public BasicEmployeeVM? ReimburseBy { get; set; } + public string ReimburseNote { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 2a99028..793e94a 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -123,6 +123,8 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + + CreateMap(); CreateMap() .ForMember( dest => dest.Id, diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 7d30672..2ae8c20 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -35,6 +35,7 @@ namespace Marco.Pms.Services.Service private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); + private static readonly Guid PaidStatus = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"); private static readonly string Collection = "ExpensesModificationLog"; public ExpensesService( IDbContextFactory dbContextFactory, @@ -490,6 +491,17 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("This status change is not allowed.", "Invalid Transition", 400); } + if (statusMapping.NextStatusId == PaidStatus && + (string.IsNullOrWhiteSpace(model.ReimburseTransactionId) || + !model.ReimburseDate.HasValue || + model.ReimburseById == null || + model.ReimburseById == Guid.Empty)) + { + _logger.LogWarning("Invalid status transition attempted for ExpenseId: {ExpenseId}. From StatusId: {FromStatusId} to {ToStatusId}", + existingExpense.Id, existingExpense.StatusId, model.StatusId); + return ApiResponse.ErrorResponse("This status change is not allowed.", "Invalid Transition", 400); + } + // Check permissions. The logic is: // 1. If the target status has specific permissions defined, the user must have at least one of them. // 2. If no permissions are defined for the target status, only the original creator of the expense can change it. @@ -527,6 +539,23 @@ namespace Marco.Pms.Services.Service existingExpense.StatusId = statusMapping.NextStatusId; existingExpense.Status = statusMapping.NextStatus; // Assigning the included entity for the response mapping. + var expensesRemburse = new ExpensesReimburse + { + ReimburseTransactionId = model.ReimburseTransactionId!, + ReimburseDate = model.ReimburseDate!.Value, + ReimburseById = model.ReimburseById!.Value, + ReimburseNote = model.Comment ?? string.Empty, + TenantId = tenantId + }; + _context.ExpensesReimburse.Add(expensesRemburse); + + _context.ExpensesReimburseMapping.Add(new ExpensesReimburseMapping + { + ExpensesId = existingExpense.Id, + ExpensesReimburseId = expensesRemburse.Id, + TenantId = tenantId + }); + _context.ExpenseLogs.Add(new ExpenseLog { ExpenseId = existingExpense.Id, @@ -1064,9 +1093,17 @@ namespace Marco.Pms.Services.Service PermissionIds = g.Select(ps => ps.PermissionId).ToList() }).ToListAsync(); }); + var expenseReimburseTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesReimburseMapping + .Include(er => er.ExpensesReimburse) + .Where(er => er.TenantId == tenantId && er.ExpensesId == Guid.Parse(model.Id)) + .Select(er => er.ExpensesReimburse).ToListAsync(); + }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask, expenseReimburseTask); var project = projectTask.Result; var expenseType = expenseTypeTask.Result; @@ -1075,6 +1112,7 @@ namespace Marco.Pms.Services.Service var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBy = paidByTask.Result; var createdBy = createdByTask.Result; + var expensesReimburse = expenseReimburseTask.Result; var response = _mapper.Map(model); @@ -1083,6 +1121,7 @@ namespace Marco.Pms.Services.Service response.CreatedBy = _mapper.Map(createdBy); response.PaymentMode = _mapper.Map(paymentMode); response.ExpensesType = _mapper.Map(expenseType); + response.ExpensesReimburse = _mapper.Map>(expensesReimburse); if (statusMapping != null) { response.Status = _mapper.Map(statusMapping.Status); From 4325dffc065a42c5f5917e4e5b20591fee4df716 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 30 Jul 2025 09:34:16 +0530 Subject: [PATCH 062/125] change ExpensesReimburse from list to single entity in expense details view model --- Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs | 2 +- Marco.Pms.Services/Service/ExpensesService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs index b59bd59..becf685 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -27,6 +27,6 @@ namespace Marco.Pms.Model.ViewModels.Expenses public string? GSTNumber { get; set; } public int? NoOfPersons { get; set; } public bool IsActive { get; set; } = true; - public List ExpensesReimburse { get; set; } = new List(); + public ExpensesReimburseVM ExpensesReimburse { get; set; } = new ExpensesReimburseVM(); } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 2ae8c20..0be0872 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1099,7 +1099,7 @@ namespace Marco.Pms.Services.Service return await dbContext.ExpensesReimburseMapping .Include(er => er.ExpensesReimburse) .Where(er => er.TenantId == tenantId && er.ExpensesId == Guid.Parse(model.Id)) - .Select(er => er.ExpensesReimburse).ToListAsync(); + .Select(er => er.ExpensesReimburse).FirstOrDefaultAsync(); }); // Await all prerequisite checks at once. @@ -1121,7 +1121,7 @@ namespace Marco.Pms.Services.Service response.CreatedBy = _mapper.Map(createdBy); response.PaymentMode = _mapper.Map(paymentMode); response.ExpensesType = _mapper.Map(expenseType); - response.ExpensesReimburse = _mapper.Map>(expensesReimburse); + response.ExpensesReimburse = _mapper.Map(expensesReimburse); if (statusMapping != null) { response.Status = _mapper.Map(statusMapping.Status); From 388979ef823a9753dca4ea9e8ee18737519a3554 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 30 Jul 2025 10:08:26 +0530 Subject: [PATCH 063/125] Chnage Reviewed to Mark as Reviewed in expenses status --- Marco.Pms.DataAccess/Data/ApplicationDbContext.cs | 4 ++-- .../20250721124928_Added_Expense_Related_Tables.Designer.cs | 4 ++-- .../Migrations/20250721124928_Added_Expense_Related_Tables.cs | 4 ++-- .../Migrations/ApplicationDbContextModelSnapshot.cs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 92a0251..d9894f3 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -415,7 +415,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Name = "Approval Pending", - DisplayName = "Reviewed", + DisplayName = "Mark as Reviewed", Description = "Review is completed, waiting for action of approver.", Color = "#03c3ec", IsSystem = true, @@ -437,7 +437,7 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Name = "Payment Pending", - DisplayName = "Approved", + DisplayName = "Mark as Approved", Description = "Approved expense is awaiting final payment.", Color = "#ffab00", IsSystem = true, diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs index b370dc4..495a2a8 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.Designer.cs @@ -1958,7 +1958,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", - DisplayName = "Reviewed", + DisplayName = "Mark as Reviewed", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1980,7 +1980,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Color = "#ffab00", Description = "Approved expense is awaiting final payment.", - DisplayName = "Approved", + DisplayName = "Mark as Approved", IsActive = true, IsSystem = true, Name = "Payment Pending", diff --git a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs index d4259fa..11136ab 100644 --- a/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250721124928_Added_Expense_Related_Tables.cs @@ -373,11 +373,11 @@ namespace Marco.Pms.DataAccess.Migrations values: new object[,] { { new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), "#8592a3", "Expense has been created but not yet submitted.", "Draft", true, true, "Draft", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Reviewed", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), "#03c3ec", "Review is completed, waiting for action of approver.", "Mark as Reviewed", true, true, "Approval Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), "#71dd37", "Expense has been settled.", "Mark as Paid", true, true, "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), "#696cff", "Reviewer is currently reviewing the expense.", "Submit", true, true, "Review Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, { new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), "#ff3e1d", "Expense was declined, often with a reason(either review rejected or approval rejected.", "Reject", true, true, "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, - { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Approved", true, true, "Payment Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + { new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), "#ffab00", "Approved expense is awaiting final payment.", "Mark as Approved", true, true, "Payment Pending", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } }); migrationBuilder.InsertData( diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 592e88d..b2fd07b 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1955,7 +1955,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), Color = "#03c3ec", Description = "Review is completed, waiting for action of approver.", - DisplayName = "Reviewed", + DisplayName = "Mark as Reviewed", IsActive = true, IsSystem = true, Name = "Approval Pending", @@ -1977,7 +1977,7 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), Color = "#ffab00", Description = "Approved expense is awaiting final payment.", - DisplayName = "Approved", + DisplayName = "Mark as Approved", IsActive = true, IsSystem = true, Name = "Payment Pending", From d28f37714fa682bcca117647fb5fce1f1e3ae5b7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 30 Jul 2025 12:24:19 +0530 Subject: [PATCH 064/125] Added new status and change expesne status from tenant scop to system scope --- .../Data/ApplicationDbContext.cs | 123 +- ...penseStatus_To_Be_System_Scope.Designer.cs | 4346 +++++++++++++++++ ...Change_ExpenseStatus_To_Be_System_Scope.cs | 437 ++ .../ApplicationDbContextModelSnapshot.cs | 173 +- Marco.Pms.Model/Expenses/Expenses.cs | 15 + .../Expenses/ExpensesStatusMapping.cs | 3 +- .../Expenses/StatusPermissionMapping.cs | 3 +- Marco.Pms.Model/Master/CurrencyMaster.cs | 11 + .../Master/ExpensesStatusMaster.cs | 6 +- .../Expenses/ExpenseDetailsMongoDB.cs | 3 + .../Masters/ExpensesStatusMasterMongoDB.cs | 1 - Marco.Pms.Model/Utilities/ExpensesFilter.cs | 1 + .../ViewModels/Expenses/ExpenseDetailsVM.cs | 3 + .../ViewModels/Expenses/ExpenseList.cs | 3 + .../Controllers/MasterController.cs | 26 +- .../MappingProfiles/MappingProfile.cs | 23 +- Marco.Pms.Services/Service/ExpensesService.cs | 29 +- Marco.Pms.Services/Service/MasterService.cs | 223 +- .../ServiceInterfaces/IMasterService.cs | 5 +- 19 files changed, 5018 insertions(+), 416 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.cs create mode 100644 Marco.Pms.Model/Master/CurrencyMaster.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index d9894f3..87f5e84 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -397,8 +397,7 @@ namespace Marco.Pms.DataAccess.Data Description = "Expense has been created but not yet submitted.", Color = "#8592a3", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true }, new ExpensesStatusMaster { @@ -408,8 +407,17 @@ namespace Marco.Pms.DataAccess.Data Description = "Reviewer is currently reviewing the expense.", Color = "#696cff", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true + }, + new ExpensesStatusMaster + { + Id = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b"), + Name = "Rejected by Reviewer", + DisplayName = "Reject", + Description = "Expense was declined, often with a reason(review rejected).", + Color = "#ff3e1d", + IsSystem = true, + IsActive = true }, new ExpensesStatusMaster { @@ -419,19 +427,17 @@ namespace Marco.Pms.DataAccess.Data Description = "Review is completed, waiting for action of approver.", Color = "#03c3ec", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true }, new ExpensesStatusMaster { Id = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - Name = "Rejected", + Name = "Rejected by Approver", DisplayName = "Reject", - Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + Description = "Expense was declined, often with a reason(approval rejected).", Color = "#ff3e1d", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true }, new ExpensesStatusMaster { @@ -441,19 +447,17 @@ namespace Marco.Pms.DataAccess.Data Description = "Approved expense is awaiting final payment.", Color = "#ffab00", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true }, new ExpensesStatusMaster { Id = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), - Name = "Paid", - DisplayName = "Mark as Paid", + Name = "Processed", + DisplayName = "Mark as Processed", Description = "Expense has been settled.", Color = "#71dd37", IsSystem = true, - IsActive = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + IsActive = true } ); @@ -463,99 +467,108 @@ namespace Marco.Pms.DataAccess.Data { Id = Guid.Parse("5cf7f1df-9d1f-4289-add0-1775ad614f25"), StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - NextStatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95") }, - // Approve to Rejected + // Rejected by Approver to Review + new ExpensesStatusMapping + { + Id = Guid.Parse("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), + NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + // Approve to Rejected by Approver new ExpensesStatusMapping { Id = Guid.Parse("36c00548-241c-43ec-bc95-cacebedb925c"), StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729") }, // Approve to Process new ExpensesStatusMapping { Id = Guid.Parse("1fca1700-1266-477d-bba4-9ac3753aa33c"), StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27") }, - // Rejected to Review + // Rejected by Reviewer to Review new ExpensesStatusMapping { - Id = Guid.Parse("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), - StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Id = Guid.Parse("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + StatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b"), + NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7") }, - // Review to Rejected + // Review to Rejected by Reviewer new ExpensesStatusMapping { - Id = Guid.Parse("fddaaf20-4ccc-4f4e-a724-dd310272b356"), + Id = Guid.Parse("6b867bec-66e6-42a7-9611-f4595af9b9ce"), StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - NextStatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b") }, // Review to Aprrove new ExpensesStatusMapping { Id = Guid.Parse("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - NextStatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8") }, // Draft to Review new ExpensesStatusMapping { Id = Guid.Parse("af1e4492-98ee-4451-8ab7-fd8323f29c32"), StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"), - NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + NextStatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7") } ); modelBuilder.Entity().HasData( - + // Draft Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = Guid.Parse("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + // Review Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = Guid.Parse("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + // Rejected by Reviewer Permission Mapping + new StatusPermissionMapping + { + Id = Guid.Parse("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b") + }, // Approval Pending Permission Mapping new StatusPermissionMapping { - Id = Guid.Parse("ed893799-1a5f-4311-a077-de93c86ca8fd"), + Id = Guid.Parse("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"), - StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }, - // Rejected Permission Mapping - new StatusPermissionMapping - { - Id = Guid.Parse("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), - PermissionId = Guid.Parse("1f4bda08-1873-449a-bb66-3e8222bd871b"), - StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8") }, + // Rejected by Approver Permission Mapping new StatusPermissionMapping { Id = Guid.Parse("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"), - StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729") }, - // Process Pending Permission Mapping + // Payment Pending Permission Mapping new StatusPermissionMapping { Id = Guid.Parse("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), PermissionId = Guid.Parse("eaafdd76-8aac-45f9-a530-315589c6deca"), - StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27") }, // Processed Permission Mapping new StatusPermissionMapping { Id = Guid.Parse("214354e5-daad-4569-ad69-eb5bf4e87fbc"), PermissionId = Guid.Parse("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), - StatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"), - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95") }); modelBuilder.Entity().HasData( diff --git a/Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.Designer.cs new file mode 100644 index 0000000..7f8875d --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.Designer.cs @@ -0,0 +1,4346 @@ +// +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("20250730063711_Change_ExpenseStatus_To_Be_System_Scope")] + partial class Change_ExpenseStatus_To_Be_System_Scope + { + /// + 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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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("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.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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.cs b/Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.cs new file mode 100644 index 0000000..e8a09c7 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250730063711_Change_ExpenseStatus_To_Be_System_Scope.cs @@ -0,0 +1,437 @@ +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 Change_ExpenseStatus_To_Be_System_Scope : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ExpensesStatusMapping_Tenants_TenantId", + table: "ExpensesStatusMapping"); + + migrationBuilder.DropForeignKey( + name: "FK_ExpensesStatusMaster_Tenants_TenantId", + table: "ExpensesStatusMaster"); + + migrationBuilder.DropForeignKey( + name: "FK_StatusPermissionMapping_Tenants_TenantId", + table: "StatusPermissionMapping"); + + migrationBuilder.DropIndex( + name: "IX_StatusPermissionMapping_TenantId", + table: "StatusPermissionMapping"); + + migrationBuilder.DropIndex( + name: "IX_ExpensesStatusMaster_TenantId", + table: "ExpensesStatusMaster"); + + migrationBuilder.DropIndex( + name: "IX_ExpensesStatusMapping_TenantId", + table: "ExpensesStatusMapping"); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e")); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd")); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "StatusPermissionMapping"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "ExpensesStatusMaster"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "ExpensesStatusMapping"); + + migrationBuilder.AddColumn( + name: "ApprovedById", + table: "Expenses", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "ProcessedById", + table: "Expenses", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "ReviewedById", + table: "Expenses", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.InsertData( + table: "ExpensesStatusMapping", + columns: new[] { "Id", "NextStatusId", "StatusId" }, + values: new object[] { new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") }); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + columns: new[] { "DisplayName", "Name" }, + values: new object[] { "Mark as Processed", "Processed" }); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + columns: new[] { "Description", "Name" }, + values: new object[] { "Expense was declined, often with a reason(approval rejected).", "Rejected by Approver" }); + + migrationBuilder.InsertData( + table: "ExpensesStatusMaster", + columns: new[] { "Id", "Color", "Description", "DisplayName", "IsActive", "IsSystem", "Name" }, + values: new object[] { new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), "#ff3e1d", "Expense was declined, often with a reason(review rejected).", "Reject", true, true, "Rejected by Reviewer" }); + + migrationBuilder.InsertData( + table: "StatusPermissionMapping", + columns: new[] { "Id", "PermissionId", "StatusId" }, + values: new object[,] + { + { new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") }, + { new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") }, + { new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") } + }); + + migrationBuilder.InsertData( + table: "ExpensesStatusMapping", + columns: new[] { "Id", "NextStatusId", "StatusId" }, + values: new object[,] + { + { new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") }, + { new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") } + }); + + migrationBuilder.InsertData( + table: "StatusPermissionMapping", + columns: new[] { "Id", "PermissionId", "StatusId" }, + values: new object[] { new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") }); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_ApprovedById", + table: "Expenses", + column: "ApprovedById"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_ProcessedById", + table: "Expenses", + column: "ProcessedById"); + + migrationBuilder.CreateIndex( + name: "IX_Expenses_ReviewedById", + table: "Expenses", + column: "ReviewedById"); + + migrationBuilder.AddForeignKey( + name: "FK_Expenses_Employees_ApprovedById", + table: "Expenses", + column: "ApprovedById", + principalTable: "Employees", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_Expenses_Employees_ProcessedById", + table: "Expenses", + column: "ProcessedById", + principalTable: "Employees", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_Expenses_Employees_ReviewedById", + table: "Expenses", + column: "ReviewedById", + principalTable: "Employees", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Expenses_Employees_ApprovedById", + table: "Expenses"); + + migrationBuilder.DropForeignKey( + name: "FK_Expenses_Employees_ProcessedById", + table: "Expenses"); + + migrationBuilder.DropForeignKey( + name: "FK_Expenses_Employees_ReviewedById", + table: "Expenses"); + + migrationBuilder.DropIndex( + name: "IX_Expenses_ApprovedById", + table: "Expenses"); + + migrationBuilder.DropIndex( + name: "IX_Expenses_ProcessedById", + table: "Expenses"); + + migrationBuilder.DropIndex( + name: "IX_Expenses_ReviewedById", + table: "Expenses"); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54")); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce")); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d")); + + migrationBuilder.DeleteData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e")); + + migrationBuilder.DeleteData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("965eda62-7907-4963-b4a1-657fb0b2724b")); + + migrationBuilder.DropColumn( + name: "ApprovedById", + table: "Expenses"); + + migrationBuilder.DropColumn( + name: "ProcessedById", + table: "Expenses"); + + migrationBuilder.DropColumn( + name: "ReviewedById", + table: "Expenses"); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "StatusPermissionMapping", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "ExpensesStatusMaster", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "ExpensesStatusMapping", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMapping", + keyColumn: "Id", + keyValue: new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.InsertData( + table: "ExpensesStatusMapping", + columns: new[] { "Id", "NextStatusId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + columns: new[] { "DisplayName", "Name", "TenantId" }, + values: new object[] { "Mark as Paid", "Paid", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + columns: new[] { "Description", "Name", "TenantId" }, + values: new object[] { "Expense was declined, often with a reason(either review rejected or approval rejected.", "Rejected", new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }); + + migrationBuilder.UpdateData( + table: "ExpensesStatusMaster", + keyColumn: "Id", + keyValue: new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusPermissionMapping", + keyColumn: "Id", + keyValue: new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.InsertData( + table: "StatusPermissionMapping", + columns: new[] { "Id", "PermissionId", "StatusId", "TenantId" }, + values: new object[,] + { + { new Guid("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") }, + { new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), new Guid("b3466e83-7e11-464c-b93a-daf047838b26") } + }); + + migrationBuilder.CreateIndex( + name: "IX_StatusPermissionMapping_TenantId", + table: "StatusPermissionMapping", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMaster_TenantId", + table: "ExpensesStatusMaster", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_ExpensesStatusMapping_TenantId", + table: "ExpensesStatusMapping", + column: "TenantId"); + + migrationBuilder.AddForeignKey( + name: "FK_ExpensesStatusMapping_Tenants_TenantId", + table: "ExpensesStatusMapping", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ExpensesStatusMaster_Tenants_TenantId", + table: "ExpensesStatusMaster", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_StatusPermissionMapping_Tenants_TenantId", + table: "StatusPermissionMapping", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index b2fd07b..528e15d 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1330,6 +1330,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("Amount") .HasColumnType("double"); + b.Property("ApprovedById") + .HasColumnType("char(36)"); + b.Property("CreatedAt") .HasColumnType("datetime(6)"); @@ -1364,9 +1367,15 @@ namespace Marco.Pms.DataAccess.Migrations 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)"); @@ -1385,6 +1394,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasKey("Id"); + b.HasIndex("ApprovedById"); + b.HasIndex("CreatedById"); b.HasIndex("ExpensesTypeId"); @@ -1393,8 +1404,12 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("PaymentModeId"); + b.HasIndex("ProcessedById"); + b.HasIndex("ProjectId"); + b.HasIndex("ReviewedById"); + b.HasIndex("StatusId"); b.HasIndex("TenantId"); @@ -1472,17 +1487,12 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("StatusId") .HasColumnType("char(36)"); - b.Property("TenantId") - .HasColumnType("char(36)"); - b.HasKey("Id"); b.HasIndex("NextStatusId"); b.HasIndex("StatusId"); - b.HasIndex("TenantId"); - b.ToTable("ExpensesStatusMapping"); b.HasData( @@ -1490,50 +1500,49 @@ namespace Marco.Pms.DataAccess.Migrations { Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), - StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") }, new { - Id = new Guid("75bbda6a-6a53-47d1-ad71-5f5f9446a11e"), + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") }, new { - Id = new Guid("fddaaf20-4ccc-4f4e-a724-dd310272b356"), - NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), - StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") }); }); @@ -1549,54 +1558,56 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("StatusId") .HasColumnType("char(36)"); - b.Property("TenantId") - .HasColumnType("char(36)"); - b.HasKey("Id"); b.HasIndex("PermissionId"); b.HasIndex("StatusId"); - b.HasIndex("TenantId"); - b.ToTable("StatusPermissionMapping"); b.HasData( new { - Id = new Guid("ed893799-1a5f-4311-a077-de93c86ca8fd"), - PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), - StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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("4652d73f-fc71-4fe1-9f2f-1e48b342d741"), + 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("d1ee5eec-24b6-4364-8673-a8f859c60729"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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"), - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") }); }); @@ -1918,13 +1929,8 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); - b.Property("TenantId") - .HasColumnType("char(36)"); - b.HasKey("Id"); - b.HasIndex("TenantId"); - b.ToTable("ExpensesStatusMaster"); b.HasData( @@ -1936,8 +1942,7 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Draft", IsActive = true, IsSystem = true, - Name = "Draft", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Name = "Draft" }, new { @@ -1947,8 +1952,17 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Submit", IsActive = true, IsSystem = true, - Name = "Review Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + 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 { @@ -1958,19 +1972,17 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Mark as Reviewed", IsActive = true, IsSystem = true, - Name = "Approval Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Name = "Approval Pending" }, new { Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), Color = "#ff3e1d", - Description = "Expense was declined, often with a reason(either review rejected or approval rejected.", + Description = "Expense was declined, often with a reason(approval rejected).", DisplayName = "Reject", IsActive = true, IsSystem = true, - Name = "Rejected", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Name = "Rejected by Approver" }, new { @@ -1980,19 +1992,17 @@ namespace Marco.Pms.DataAccess.Migrations DisplayName = "Mark as Approved", IsActive = true, IsSystem = true, - Name = "Payment Pending", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Name = "Payment Pending" }, new { Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), Color = "#71dd37", Description = "Expense has been settled.", - DisplayName = "Mark as Paid", + DisplayName = "Mark as Processed", IsActive = true, IsSystem = true, - Name = "Paid", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Name = "Processed" }); }); @@ -3790,6 +3800,10 @@ namespace Marco.Pms.DataAccess.Migrations 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") @@ -3814,12 +3828,20 @@ namespace Marco.Pms.DataAccess.Migrations .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") @@ -3832,6 +3854,8 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.Navigation("ApprovedBy"); + b.Navigation("CreatedBy"); b.Navigation("ExpensesType"); @@ -3840,8 +3864,12 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("PaymentMode"); + b.Navigation("ProcessedBy"); + b.Navigation("Project"); + b.Navigation("ReviewedBy"); + b.Navigation("Status"); b.Navigation("Tenant"); @@ -3907,17 +3935,9 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - b.Navigation("NextStatus"); b.Navigation("Status"); - - b.Navigation("Tenant"); }); modelBuilder.Entity("Marco.Pms.Model.Expenses.StatusPermissionMapping", b => @@ -3934,17 +3954,9 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - b.Navigation("Permission"); b.Navigation("Status"); - - b.Navigation("Tenant"); }); modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => @@ -4051,17 +4063,6 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Tenant"); }); - modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => - { - b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.Tenant", "Tenant") diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs index a396715..35e8836 100644 --- a/Marco.Pms.Model/Expenses/Expenses.cs +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -35,6 +35,21 @@ namespace Marco.Pms.Model.Expenses [ValidateNever] [ForeignKey("CreatedById")] public Employee? CreatedBy { get; set; } + public Guid? ReviewedById { get; set; } + + [ValidateNever] + [ForeignKey("ReviewedById")] + public Employee? ReviewedBy { get; set; } + public Guid? ApprovedById { get; set; } + + [ValidateNever] + [ForeignKey("ApprovedById")] + public Employee? ApprovedBy { get; set; } + public Guid? ProcessedById { get; set; } + + [ValidateNever] + [ForeignKey("ProcessedById")] + public Employee? ProcessedBy { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public string? TransactionId { get; set; } diff --git a/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs index 1eb7470..902927d 100644 --- a/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs +++ b/Marco.Pms.Model/Expenses/ExpensesStatusMapping.cs @@ -1,11 +1,10 @@ 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.Expenses { - public class ExpensesStatusMapping : TenantRelation + public class ExpensesStatusMapping { public Guid Id { get; set; } public Guid StatusId { get; set; } diff --git a/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs index 9333412..2fe9334 100644 --- a/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs +++ b/Marco.Pms.Model/Expenses/StatusPermissionMapping.cs @@ -1,12 +1,11 @@ using Marco.Pms.Model.Entitlements; 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.Expenses { - public class StatusPermissionMapping : TenantRelation + public class StatusPermissionMapping { public Guid Id { get; set; } public Guid StatusId { get; set; } diff --git a/Marco.Pms.Model/Master/CurrencyMaster.cs b/Marco.Pms.Model/Master/CurrencyMaster.cs new file mode 100644 index 0000000..62f73d3 --- /dev/null +++ b/Marco.Pms.Model/Master/CurrencyMaster.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.Master +{ + public class CurrencyMaster + { + public Guid Id { get; set; } + public string CurrencyCode { get; set; } = string.Empty; + public string CurrencyName { get; set; } = string.Empty; + public string Symbol { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs index dc393cd..35358c3 100644 --- a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs +++ b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs @@ -1,8 +1,6 @@ -using Marco.Pms.Model.Utilities; - -namespace Marco.Pms.Model.Master +namespace Marco.Pms.Model.Master { - public class ExpensesStatusMaster : TenantRelation + public class ExpensesStatusMaster { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs index c58a22c..9dad1ce 100644 --- a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -8,6 +8,9 @@ public string PaymentModeId { get; set; } = string.Empty; public string PaidById { get; set; } = string.Empty; public string CreatedById { get; set; } = string.Empty; + public string? ReviewedById { get; set; } + public string? ApprovedById { get; set; } + public string? ProcessedById { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public DateTime ExpireAt { get; set; } = DateTime.UtcNow.Date.AddDays(1); diff --git a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs index 8fe3910..3e4a52a 100644 --- a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs @@ -8,6 +8,5 @@ public string Description { get; set; } = string.Empty; public string? Color { get; set; } public bool IsSystem { get; set; } = false; - public string TenantId { get; set; } = string.Empty; } } diff --git a/Marco.Pms.Model/Utilities/ExpensesFilter.cs b/Marco.Pms.Model/Utilities/ExpensesFilter.cs index 7a0c397..bd24ab8 100644 --- a/Marco.Pms.Model/Utilities/ExpensesFilter.cs +++ b/Marco.Pms.Model/Utilities/ExpensesFilter.cs @@ -6,6 +6,7 @@ public List? StatusIds { get; set; } public List? CreatedByIds { get; set; } public List? PaidById { get; set; } + public bool IsTransactionDate { get; set; } = false; public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs index becf685..b777d13 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -13,6 +13,9 @@ namespace Marco.Pms.Model.ViewModels.Expenses public PaymentModeMatserVM? PaymentMode { get; set; } public BasicEmployeeVM? PaidBy { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } + public BasicEmployeeVM? ReviewedBy { get; set; } + public BasicEmployeeVM? ApprovedBy { get; set; } + public BasicEmployeeVM? ProcessedBy { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public string SupplerName { get; set; } = string.Empty; diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs index 198102d..f6ba5ea 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs @@ -12,6 +12,9 @@ namespace Marco.Pms.Model.ViewModels.Expanses public PaymentModeMatserVM? PaymentMode { get; set; } public BasicEmployeeVM? PaidBy { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } + public BasicEmployeeVM? ReviewedBy { get; set; } + public BasicEmployeeVM? ApprovedBy { get; set; } + public BasicEmployeeVM? ProcessedBy { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public string SupplerName { get; set; } = string.Empty; diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 61d9a2e..bcc4264 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -908,31 +908,7 @@ namespace Marco.Pms.Services.Controllers public async Task GetExpensesStatusList([FromQuery] bool isActive = true) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId, isActive); - return StatusCode(response.StatusCode, response); - } - - [HttpPost("expenses-status")] - public async Task CreateExpensesStatus([FromBody] ExpensesStatusMasterDto dto) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.CreateExpensesStatusAsync(dto, loggedInEmployee, tenantId); - return StatusCode(response.StatusCode, response); - } - - [HttpPut("expenses-status/edit/{id}")] - public async Task UpdateExpensesStatus(Guid id, [FromBody] ExpensesStatusMasterDto dto) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.UpdateExpensesStatusAsync(id, dto, loggedInEmployee, tenantId); - return StatusCode(response.StatusCode, response); - } - - [HttpDelete("expenses-status/delete/{id}")] - public async Task DeleteExpensesStatus(Guid id, [FromQuery] bool isActive = false) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.DeleteExpensesStatusAsync(id, isActive, loggedInEmployee, tenantId); + var response = await _masterService.GetExpensesStatusListAsync(loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 793e94a..504e3d2 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -145,6 +145,15 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.CreatedById, opt => opt.MapFrom(src => src.CreatedById.ToString())) .ForMember( + dest => dest.ReviewedById, + opt => opt.MapFrom(src => src.ReviewedById.ToString())) + .ForMember( + dest => dest.ApprovedById, + opt => opt.MapFrom(src => src.ApprovedById.ToString())) + .ForMember( + dest => dest.ProcessedById, + opt => opt.MapFrom(src => src.ProcessedById.ToString())) + .ForMember( dest => dest.StatusId, opt => opt.MapFrom(src => src.StatusId.ToString())) .ForMember( @@ -171,6 +180,15 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.CreatedById, opt => opt.MapFrom(src => Guid.Parse(src.CreatedById))) .ForMember( + dest => dest.ReviewedById, + opt => opt.MapFrom(src => Guid.Parse(src.ReviewedById ?? ""))) + .ForMember( + dest => dest.ApprovedById, + opt => opt.MapFrom(src => Guid.Parse(src.ApprovedById ?? ""))) + .ForMember( + dest => dest.ProcessedById, + opt => opt.MapFrom(src => Guid.Parse(src.ProcessedById ?? ""))) + .ForMember( dest => dest.StatusId, opt => opt.MapFrom(src => Guid.Parse(src.StatusId))) .ForMember( @@ -229,10 +247,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap() .ForMember( dest => dest.Id, - opt => opt.MapFrom(src => src.Id.ToString())) - .ForMember( - dest => dest.TenantId, - opt => opt.MapFrom(src => src.TenantId.ToString())); + opt => opt.MapFrom(src => src.Id.ToString())); CreateMap() .ForMember( diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 0be0872..c8c3c1b 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -135,10 +135,17 @@ namespace Marco.Pms.Services.Service if (expenseFilter != null) { - // CRITICAL FIX: Apply filters cumulatively using multiple `if` statements, not `if-else if`. if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) { - expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + if (expenseFilter.IsTransactionDate) + { + expensesQuery = expensesQuery.Where(e => e.TransactionDate.Date >= expenseFilter.StartDate.Value.Date && e.TransactionDate.Date <= expenseFilter.EndDate.Value.Date); + } + else + { + expensesQuery = expensesQuery.Where(e => e.CreatedAt.Date >= expenseFilter.StartDate.Value.Date && e.CreatedAt.Date <= expenseFilter.EndDate.Value.Date); + } + } if (expenseFilter.ProjectIds?.Any() == true) @@ -464,7 +471,7 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMapping .Include(s => s.NextStatus) - .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId && s.TenantId == tenantId); + .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId); }); // Task to fetch all permissions required for the *target* status. @@ -472,7 +479,7 @@ namespace Marco.Pms.Services.Service { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.StatusPermissionMapping - .Where(sp => sp.StatusId == model.StatusId && sp.TenantId == tenantId) + .Where(sp => sp.StatusId == model.StatusId) .ToListAsync(); }); @@ -598,7 +605,7 @@ namespace Marco.Pms.Services.Service var dbContext = t.Result; return dbContext.ExpensesStatusMapping .Include(s => s.NextStatus) - .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId) + .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null) .Select(s => s.NextStatus) // Select only the status object .ToListAsync() .ContinueWith(res => @@ -756,7 +763,7 @@ namespace Marco.Pms.Services.Service var dbContext = t.Result; return dbContext.ExpensesStatusMapping .Include(s => s.NextStatus) - .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null && s.TenantId == tenantId) + .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null) .Select(s => s.NextStatus) // Select only the status object .ToListAsync() .ContinueWith(res => @@ -958,7 +965,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => statusIds.Contains(es.StatusId) && es.Status != null && es.TenantId == tenantId) + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) .GroupBy(s => s.StatusId) .Select(g => new { @@ -972,14 +979,13 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .Where(es => statusIds.Contains(es.Id) && es.TenantId == tenantId) + .Where(es => statusIds.Contains(es.Id)) .ToListAsync(); }); var permissionStatusMappingTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.StatusPermissionMapping - .Where(ps => ps.TenantId == tenantId) .GroupBy(ps => ps.StatusId) .Select(g => new { @@ -1066,7 +1072,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null && es.TenantId == tenantId) + .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null) .GroupBy(s => s.StatusId) .Select(g => new { @@ -1079,13 +1085,12 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId) && es.TenantId == tenantId); + .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId)); }); var permissionStatusMappingTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.StatusPermissionMapping - .Where(ps => ps.TenantId == tenantId) .GroupBy(ps => ps.StatusId) .Select(g => new { diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 6d789bb..88467d1 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -4,7 +4,6 @@ using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; @@ -247,9 +246,8 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Expenses Status APIs =================================================================== - public async Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive) + public async Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId) { - try { // Validation if employee is taking action in same tenant @@ -260,7 +258,7 @@ namespace Marco.Pms.Services.Service } // Featching the list of Expenses Status. - var statusList = await _context.ExpensesStatusMaster.Where(es => es.TenantId == tenantId && es.IsActive == isActive).ToListAsync(); + var statusList = await _context.ExpensesStatusMaster.ToListAsync(); var response = _mapper.Map>(statusList); var statusIds = statusList.Select(s => s.Id).ToList(); @@ -287,223 +285,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); } } - public async Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto 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 Expense Status 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 EXPENSE STATUS MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); - - } - // Mapping the DTO to ExpensesStatusMaster Model - var expensesStatus = _mapper.Map(model); - expensesStatus.TenantId = tenantId; - - _context.ExpensesStatusMaster.Add(expensesStatus); - - if (model.PermissionIds?.Any() ?? false) - { - var permissionStatusMappings = model.PermissionIds.Select(p => new StatusPermissionMapping - { - PermissionId = p, - StatusId = expensesStatus.Id, - TenantId = tenantId - }).ToList(); - - _context.StatusPermissionMapping.AddRange(permissionStatusMappings); - } - await _context.SaveChangesAsync(); - - _logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id); - - // Mapping the ExpensesStatusMaster Model to View Model - var response = _mapper.Map(expensesStatus); - return ApiResponse.SuccessResponse(response, "Expense Status craeted Successfully", 201); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Database Exception occured while adding new Expense Status 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 Expense Status by employee {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); - } - } - public async Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto 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 Expense Status 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 EXPENSE STATUS 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); - } - // featching expenses status and permissions parallelly - var expensesStatusTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMaster.AsNoTracking() - .FirstOrDefaultAsync(et => et.Id == model.Id.Value && et.TenantId == tenantId); - }); - - var permissionStatusMappingsTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.StatusPermissionMapping - .AsNoTracking() - .Where(ps => ps.StatusId == model.Id.Value && ps.TenantId == tenantId) - .ToListAsync(); - }); - - await Task.WhenAll(expensesStatusTask, permissionStatusMappingsTask); - var expensesStatus = expensesStatusTask.Result; - - // Checking if Expense Status exists - if (expensesStatus == null) - { - _logger.LogWarning("Employee {EmployeeId} tries to update Expense Status, but not found in database", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Expense Status not found", "Expense Status not found", 404); - } - - // Mapping ExpensesStatusMaster to BsonDocument - var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus); - - // Mapping ExpensesStatusMasterDto to ExpensesStatusMaster - _mapper.Map(model, expensesStatus); - - _context.ExpensesStatusMaster.Update(expensesStatus); - - var permissionStatusMappings = permissionStatusMappingsTask.Result; - var permissionIds = permissionStatusMappings.Select(ps => ps.PermissionId).ToList(); - if (model.PermissionIds != null) - { - var newPermissionStatusMappings = model.PermissionIds.Where(p => !permissionIds.Contains(p)).Select(p => new StatusPermissionMapping - { - PermissionId = p, - StatusId = expensesStatus.Id, - TenantId = tenantId - }).ToList(); - var deletedPermissionStatusMappings = permissionStatusMappings.Where(ps => !model.PermissionIds.Contains(ps.PermissionId)).ToList(); - - _context.StatusPermissionMapping.AddRange(newPermissionStatusMappings); - _context.StatusPermissionMapping.RemoveRange(deletedPermissionStatusMappings); - - } - await _context.SaveChangesAsync(); - - _logger.LogInfo("New Expense Status {ExpensesStatusId} was added by employee {EmployeeId}", expensesStatus.Id, loggedInEmployee.Id); - - // Mapping the ExpensesStatusMaster Model to View Model - var response = _mapper.Map(expensesStatus); - return ApiResponse.SuccessResponse(response, "Expense Status craeted Successfully", 201); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Database Exception occured while adding new Expense Status 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 Expense Status by employee {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); - } - } - public async Task> DeleteExpensesStatusAsync(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} Expense Status 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 EXPENSE STATUS MASTER.", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Manage masters", 403); - } - - var expensesStatus = await _context.ExpensesStatusMaster.FirstOrDefaultAsync(et => et.Id == id && et.TenantId == tenantId); - - // Checking if Expense Status exists - if (expensesStatus == null) - { - _logger.LogWarning("Employee {EmployeeId} tries to {Action} Expense Status, but not found in database", loggedInEmployee.Id, action); - return ApiResponse.ErrorResponse("Expense Status not found", "Expense Status not found", 404); - } - - if (expensesStatus.IsSystem) - { - _logger.LogWarning("Employee {Employee} attempts to {Action} Expense status, but status is system defined", loggedInEmployee.Id, action); - return ApiResponse.ErrorResponse($"Expense Status is system defined cannot able to {action}", $"Expense Status is system defined cannot able to {action}", 400); - } - - // Mapping ExpensesStatusMaster to BsonDocument - var existingEntityBson = _updateLogHelper.EntityToBsonDocument(expensesStatus); - - expensesStatus.IsActive = isActive; - await _context.SaveChangesAsync(); - - _logger.LogInfo("Expense Status {ExpensesStatusId} was {Action}d by employee {EmployeeId}", expensesStatus.Id, action, loggedInEmployee.Id); - - // Saving the old entity in mongoDB - - var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject - { - EntityId = expensesStatus.Id.ToString(), - UpdatedById = loggedInEmployee.Id.ToString(), - OldObject = existingEntityBson, - UpdatedAt = DateTime.UtcNow - }, "ExpensesStatusMasterModificationLog"); - - // Mapping ExpensesStatusMaster to ExpensesStatusMasterVM - var response = _mapper.Map(expensesStatus); - return ApiResponse.SuccessResponse(response, $"Expense Status {action}d Successfully", 200); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Database Exception occured while {Action}ing Expense Status 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 Expense Status by employee {EmployeeId}", action, loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); - } - } - #endregion #region =================================================================== Payment mode APIs =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 7a64b3a..2cde277 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -15,10 +15,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Expenses Status APIs =================================================================== - Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId, bool isActive); - Task> CreateExpensesStatusAsync(ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); - Task> UpdateExpensesStatusAsync(Guid id, ExpensesStatusMasterDto model, Employee loggedInEmployee, Guid tenantId); - Task> DeleteExpensesStatusAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); + Task> GetExpensesStatusListAsync(Employee loggedInEmployee, Guid tenantId); #endregion From 1a0641162c118472f0d1c751a315bf720eeaca8f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 30 Jul 2025 15:44:19 +0530 Subject: [PATCH 065/125] Added the currency master table --- .../Data/ApplicationDbContext.cs | 60 + ...549_Added_CurrencyMaster_Table.Designer.cs | 4430 +++++++++++++++++ ...250730070549_Added_CurrencyMaster_Table.cs | 57 + .../ApplicationDbContextModelSnapshot.cs | 84 + .../ViewModels/Expenses/ExpenseList.cs | 6 +- .../MappingProfiles/MappingProfile.cs | 6 +- Marco.Pms.Services/Service/ExpensesService.cs | 347 +- 7 files changed, 4856 insertions(+), 134 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 87f5e84..d9a5653 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -53,6 +53,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet Modules { get; set; } public DbSet Features { get; set; } public DbSet FeaturePermissions { get; set; } + public DbSet CurrencyMaster { get; set; } public DbSet ApplicationRoles { get; set; } public DbSet JobRoles { get; set; } public DbSet RolePermissionMappings { get; set; } @@ -760,6 +761,65 @@ namespace Marco.Pms.DataAccess.Data new FeaturePermission { Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), IsEnabled = true, Name = "Manage", Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules." } ); + + modelBuilder.Entity().HasData( + new CurrencyMaster + { + Id = Guid.Parse("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + Symbol = "₹", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + Symbol = "$", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + Symbol = "€", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + Symbol = "£", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + Symbol = "¥", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + Symbol = "₽", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + Symbol = "¥", + IsActive = true + } + ); } } } diff --git a/Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.Designer.cs new file mode 100644 index 0000000..fd265dd --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.Designer.cs @@ -0,0 +1,4430 @@ +// +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("20250730070549_Added_CurrencyMaster_Table")] + partial class Added_CurrencyMaster_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("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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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("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.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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250730070549_Added_CurrencyMaster_Table.cs b/Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.cs new file mode 100644 index 0000000..d525786 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250730070549_Added_CurrencyMaster_Table.cs @@ -0,0 +1,57 @@ +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_CurrencyMaster_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CurrencyMaster", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CurrencyCode = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CurrencyName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Symbol = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsActive = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CurrencyMaster", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "CurrencyMaster", + columns: new[] { "Id", "CurrencyCode", "CurrencyName", "IsActive", "Symbol" }, + values: new object[,] + { + { new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), "JPY", "Japanese Yen", true, "¥" }, + { new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), "USD", "US Dollar", true, "$" }, + { new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), "GBP", "Pound Sterling", true, "£" }, + { new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), "EUR", "Euro", true, "€" }, + { new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), "INR", "Indian Rupee", true, "₹" }, + { new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), "CNY", "Chinese Yuan (Renminbi)", true, "¥" }, + { new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), "RUB", "Russian Ruble", true, "₽" } + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CurrencyMaster"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 528e15d..4a93185 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1901,6 +1901,90 @@ namespace Marco.Pms.DataAccess.Migrations 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.ExpensesStatusMaster", b => { b.Property("Id") diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs index f6ba5ea..9bc3b08 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs @@ -12,9 +12,9 @@ namespace Marco.Pms.Model.ViewModels.Expanses public PaymentModeMatserVM? PaymentMode { get; set; } public BasicEmployeeVM? PaidBy { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } - public BasicEmployeeVM? ReviewedBy { get; set; } - public BasicEmployeeVM? ApprovedBy { get; set; } - public BasicEmployeeVM? ProcessedBy { get; set; } + //public BasicEmployeeVM? ReviewedBy { get; set; } + //public BasicEmployeeVM? ApprovedBy { get; set; } + //public BasicEmployeeVM? ProcessedBy { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public string SupplerName { get; set; } = string.Empty; diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 504e3d2..7be54f2 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -181,13 +181,13 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => Guid.Parse(src.CreatedById))) .ForMember( dest => dest.ReviewedById, - opt => opt.MapFrom(src => Guid.Parse(src.ReviewedById ?? ""))) + opt => opt.MapFrom(src => src.ReviewedById != null ? Guid.Parse(src.ReviewedById) : Guid.Empty)) .ForMember( dest => dest.ApprovedById, - opt => opt.MapFrom(src => Guid.Parse(src.ApprovedById ?? ""))) + opt => opt.MapFrom(src => src.ApprovedById != null ? Guid.Parse(src.ApprovedById) : Guid.Empty)) .ForMember( dest => dest.ProcessedById, - opt => opt.MapFrom(src => Guid.Parse(src.ProcessedById ?? ""))) + opt => opt.MapFrom(src => src.ProcessedById != null ? Guid.Parse(src.ProcessedById) : Guid.Empty)) .ForMember( dest => dest.StatusId, opt => opt.MapFrom(src => Guid.Parse(src.StatusId))) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index c8c3c1b..5458486 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -34,8 +34,12 @@ namespace Marco.Pms.Services.Service private readonly CacheUpdateHelper _cache; private readonly IMapper _mapper; private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); - private static readonly Guid Rejected = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); - private static readonly Guid PaidStatus = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"); + private static readonly Guid Review = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"); + private static readonly Guid RejectedByReviewer = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b"); + private static readonly Guid Approve = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"); + private static readonly Guid RejectedByApprover = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729"); + private static readonly Guid ProcessPending = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27"); + private static readonly Guid Processed = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95"); private static readonly string Collection = "ExpensesModificationLog"; public ExpensesService( IDbContextFactory dbContextFactory, @@ -201,12 +205,14 @@ namespace Marco.Pms.Services.Service // 7. --- Return Final Success Response --- var message = $"{expenseVM.Count} expense records fetched successfully."; _logger.LogInfo(message); + var defaultFilter = await GetObjectForfilter(tenantId); var response = new { - Filter = expenseFilter, + CurrentFilter = expenseFilter, CurrentPage = pageNumber, TotalPages = totalPages, TotalEntites = totalEntites, + DefaultFilter = defaultFilter, Data = expenseVM, }; return ApiResponse.SuccessResponse(response, message, 200); @@ -435,211 +441,202 @@ namespace Marco.Pms.Services.Service /// An ApiResponse containing the updated expense details or an error. public async Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId) { - // --- 1. Fetch Existing Expense --- - // We include all related entities needed for the final response mapping to avoid multiple database trips. - // The query also ensures we don't process a request if the status is already the one requested. - var existingExpense = await _context.Expenses + // 1. Fetch Existing Expense with Related Entities (Single Query) + var expense = await _context.Expenses .Include(e => e.ExpensesType) .Include(e => e.Project) - .Include(e => e.PaidBy) - .ThenInclude(e => e!.JobRole) + .Include(e => e.PaidBy).ThenInclude(e => e!.JobRole) .Include(e => e.PaymentMode) .Include(e => e.Status) .Include(e => e.CreatedBy) - .FirstOrDefaultAsync(e => e.Id == model.ExpenseId && e.StatusId != model.StatusId && e.TenantId == tenantId); + .Include(e => e.ReviewedBy) + .Include(e => e.ApprovedBy) + .Include(e => e.ProcessedBy) + .FirstOrDefaultAsync(e => + e.Id == model.ExpenseId && + e.StatusId != model.StatusId && + e.TenantId == tenantId + ); - if (existingExpense == null) + if (expense == null) { - // Use structured logging for better searchability. - _logger.LogWarning("Attempted to change status for a non-existent or already-updated expense. ExpenseId: {ExpenseId}, TenantId: {TenantId}", model.ExpenseId, tenantId); + _logger.LogWarning("ChangeStatus: Expense not found or already at target status. ExpenseId={ExpenseId}, TenantId={TenantId}", model.ExpenseId, tenantId); return ApiResponse.ErrorResponse("Expense not found or status is already set.", "Expense not found", 404); } - _logger.LogInfo("Initiating status change for ExpenseId: {ExpenseId} from StatusId: {OldStatusId} to {NewStatusId}", - existingExpense.Id, existingExpense.StatusId, model.StatusId); + _logger.LogInfo("ChangeStatus: Requested status change. ExpenseId={ExpenseId} FromStatus={FromStatusId} ToStatus={ToStatusId}", + expense.Id, expense.StatusId, model.StatusId); - // --- 2. Concurrently Check Prerequisites --- - // We run status validation and permission fetching in parallel for efficiency. - // Using Task.Run with an async lambda is the standard way to start a concurrent, - // CPU- or I/O-bound operation on a background thread. - - // Task to validate if the requested status change is a valid transition. - var statusMappingTask = Task.Run(async () => + // 2. Run Prerequisite Checks in Parallel (Status transition + Permissions) + var statusTransitionTask = Task.Run(async () => { - // 'await using' ensures the DbContext created by the factory is properly disposed - // within the scope of this background task. await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMapping - .Include(s => s.NextStatus) - .FirstOrDefaultAsync(s => s.StatusId == existingExpense.StatusId && s.NextStatusId == model.StatusId); + .Include(m => m.NextStatus) + .FirstOrDefaultAsync(m => m.StatusId == expense.StatusId && m.NextStatusId == model.StatusId); }); - // Task to fetch all permissions required for the *target* status. - var statusPermissionMappingTask = Task.Run(async () => + var targetStatusPermissionsTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.StatusPermissionMapping - .Where(sp => sp.StatusId == model.StatusId) + .Where(spm => spm.StatusId == model.StatusId) .ToListAsync(); }); - // Await both tasks to complete concurrently. - await Task.WhenAll(statusMappingTask, statusPermissionMappingTask); + await Task.WhenAll(statusTransitionTask, targetStatusPermissionsTask); + var statusTransition = await statusTransitionTask; + var requiredPermissions = await targetStatusPermissionsTask; - // Now you can safely get the results. - var statusMapping = await statusMappingTask; - var statusPermissions = await statusPermissionMappingTask; - - // --- 3. Validate Status Transition and Permissions --- - if (statusMapping == null) + // 3. Validate Transition and Required Fields + if (statusTransition == null) { - _logger.LogWarning("Invalid status transition attempted for ExpenseId: {ExpenseId}. From StatusId: {FromStatusId} to {ToStatusId}", - existingExpense.Id, existingExpense.StatusId, model.StatusId); - return ApiResponse.ErrorResponse("This status change is not allowed.", "Invalid Transition", 400); + _logger.LogWarning("ChangeStatus: Invalid status transition. ExpenseId={ExpenseId}, FromStatus={FromStatus}, ToStatus={ToStatus}", + expense.Id, expense.StatusId, model.StatusId); + return ApiResponse.ErrorResponse("Status change is not permitted.", "Invalid Transition", 400); } - if (statusMapping.NextStatusId == PaidStatus && + // Validate special logic for "Processed" + if (statusTransition.NextStatusId == Processed && (string.IsNullOrWhiteSpace(model.ReimburseTransactionId) || - !model.ReimburseDate.HasValue || + !model.ReimburseDate.HasValue || model.ReimburseById == null || model.ReimburseById == Guid.Empty)) { - _logger.LogWarning("Invalid status transition attempted for ExpenseId: {ExpenseId}. From StatusId: {FromStatusId} to {ToStatusId}", - existingExpense.Id, existingExpense.StatusId, model.StatusId); - return ApiResponse.ErrorResponse("This status change is not allowed.", "Invalid Transition", 400); + _logger.LogWarning("ChangeStatus: Missing reimbursement fields for 'Processed'. ExpenseId={ExpenseId}", expense.Id); + return ApiResponse.ErrorResponse("Reimbursement details are missing or invalid.", "Invalid Reimbursement", 400); } - // Check permissions. The logic is: - // 1. If the target status has specific permissions defined, the user must have at least one of them. - // 2. If no permissions are defined for the target status, only the original creator of the expense can change it. + // 4. Permission Check (CreatedBy -> Reviewer bypass, else required permissions) bool hasPermission = false; - if (statusPermissions.Any()) + if (model.StatusId == Review && expense.CreatedById == loggedInEmployee.Id) + { + hasPermission = true; + } + else if (requiredPermissions.Any()) { - // Using a scope to resolve scoped services like PermissionServices. using var scope = _serviceScopeFactory.CreateScope(); var permissionService = scope.ServiceProvider.GetRequiredService(); - foreach (var sp in statusPermissions) + foreach (var permission in requiredPermissions) { - if (await permissionService.HasPermission(sp.PermissionId, loggedInEmployee.Id)) + if (await permissionService.HasPermission(permission.PermissionId, loggedInEmployee.Id)) { hasPermission = true; - break; // User has one of the required permissions, no need to check further. + break; } } } - else if (existingExpense.CreatedById == loggedInEmployee.Id) - { - // Fallback: If no permissions are required for the status, allow the creator to make the change. - hasPermission = true; - } if (!hasPermission) { - _logger.LogWarning("Access DENIED for EmployeeId: {EmployeeId} attempting to change status of ExpenseId: {ExpenseId} to StatusId: {NewStatusId}", - loggedInEmployee.Id, existingExpense.Id, model.StatusId); - return ApiResponse.ErrorResponse("You do not have the required permissions to perform this action.", "Access Denied", 403); + _logger.LogWarning("ChangeStatus: Permission denied. EmployeeId={EmployeeId} ExpenseId={ExpenseId} ToStatus={ToStatusId}", + loggedInEmployee.Id, expense.Id, model.StatusId); + return ApiResponse.ErrorResponse("You do not have permission for this action.", "Access Denied", 403); } - // --- 4. Update Expense and Add Log (in a transaction) --- - var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); // Capture state for audit log BEFORE changes. + // 5. Prepare for update (Audit snapshot) + var expenseStateBeforeChange = _updateLogHelper.EntityToBsonDocument(expense); - existingExpense.StatusId = statusMapping.NextStatusId; - existingExpense.Status = statusMapping.NextStatus; // Assigning the included entity for the response mapping. + // 6. Apply Status Transition + expense.StatusId = statusTransition.NextStatusId; + expense.Status = statusTransition.NextStatus; - var expensesRemburse = new ExpensesReimburse + // Handle reviewer/approver/processor fields based on target StatusId (Guid) + if (model.StatusId == Approve || model.StatusId == RejectedByReviewer) { - ReimburseTransactionId = model.ReimburseTransactionId!, - ReimburseDate = model.ReimburseDate!.Value, - ReimburseById = model.ReimburseById!.Value, - ReimburseNote = model.Comment ?? string.Empty, - TenantId = tenantId - }; - _context.ExpensesReimburse.Add(expensesRemburse); - - _context.ExpensesReimburseMapping.Add(new ExpensesReimburseMapping + expense.ReviewedById = loggedInEmployee.Id; + } + else if (model.StatusId == ProcessPending || model.StatusId == RejectedByApprover) { - ExpensesId = existingExpense.Id, - ExpensesReimburseId = expensesRemburse.Id, - TenantId = tenantId - }); + expense.ApprovedById = loggedInEmployee.Id; + } + else if (model.StatusId == Processed) + { + expense.ProcessedById = loggedInEmployee.Id; + } + // 7. Add Reimbursement if applicable + if (model.StatusId == Processed) + { + var reimbursement = new ExpensesReimburse + { + ReimburseTransactionId = model.ReimburseTransactionId!, + ReimburseDate = model.ReimburseDate!.Value, + ReimburseById = model.ReimburseById!.Value, + ReimburseNote = model.Comment ?? string.Empty, + TenantId = tenantId + }; + _context.ExpensesReimburse.Add(reimbursement); + _context.ExpensesReimburseMapping.Add(new ExpensesReimburseMapping + { + ExpensesId = expense.Id, + ExpensesReimburseId = reimbursement.Id, + TenantId = tenantId + }); + } + + // 8. Add Expense Log Entry _context.ExpenseLogs.Add(new ExpenseLog { - ExpenseId = existingExpense.Id, - Action = $"Status changed to '{statusMapping.NextStatus!.Name}'", + ExpenseId = expense.Id, + Action = $"Status changed to '{statusTransition.NextStatus?.Name}'", UpdatedById = loggedInEmployee.Id, Comment = model.Comment, TenantId = tenantId }); + // 9. Commit database transaction try { await _context.SaveChangesAsync(); - _logger.LogInfo("Successfully updated status for ExpenseId: {ExpenseId} to StatusId: {NewStatusId}", existingExpense.Id, existingExpense.StatusId); + _logger.LogInfo("ChangeStatus: Status updated successfully. ExpenseId={ExpenseId} NewStatus={NewStatusId}", expense.Id, expense.StatusId); } - catch (DbUpdateConcurrencyException dbEx) + catch (DbUpdateConcurrencyException ex) { - // This error occurs if the record was modified by someone else after we fetched it. - _logger.LogError(dbEx, "Concurrency conflict while updating status for ExpenseId: {ExpenseId}. The record may have been modified by another user.", existingExpense.Id); - return ApiResponse.ErrorResponse("The expense was modified by another user. Please refresh and try again.", "Concurrency Error", 409); // 409 Conflict is appropriate + _logger.LogError(ex, "ChangeStatus: Concurrency error. ExpenseId={ExpenseId}", expense.Id); + return ApiResponse.ErrorResponse("Expense was modified by another user. Please refresh and try again.", "Concurrency Error", 409); } - // --- 5. Perform Post-Save Actions (Audit Log and Fetching Next State for UI) --- + // 10. Post-processing (audit log, cache, fetch next states) try { - // Task to save the detailed audit log to a separate system (e.g., MongoDB). - var mongoDBTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + var auditLogTask = _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject { - EntityId = existingExpense.Id.ToString(), + EntityId = expense.Id.ToString(), UpdatedById = loggedInEmployee.Id.ToString(), - OldObject = existingEntityBson, + OldObject = expenseStateBeforeChange, UpdatedAt = DateTime.UtcNow }, Collection); - var cacheUpdateTask = _cache.ReplaceExpenseAsync(existingExpense); + var cacheUpdateTask = _cache.ReplaceExpenseAsync(expense); - // Task to get all possible next statuses from the *new* current state to help the UI. - // NOTE: This now fetches a list of all possible next states, which is more useful for a UI. - var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(t => + var getNextStatusesTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(async t => { var dbContext = t.Result; - return dbContext.ExpensesStatusMapping - .Include(s => s.NextStatus) - .Where(s => s.StatusId == existingExpense.StatusId && s.NextStatus != null) - .Select(s => s.NextStatus) // Select only the status object - .ToListAsync() - .ContinueWith(res => - { - dbContext.Dispose(); // Ensure the context is disposed - return res.Result; - }); + var nextStatuses = await dbContext.ExpensesStatusMapping + .Include(m => m.NextStatus) + .Where(m => m.StatusId == expense.StatusId && m.NextStatus != null) + .Select(m => m.NextStatus) + .ToListAsync(); + await dbContext.DisposeAsync(); + return nextStatuses; }).Unwrap(); - await Task.WhenAll(mongoDBTask, getNextStatusesTask, cacheUpdateTask); + await Task.WhenAll(auditLogTask, getNextStatusesTask, cacheUpdateTask); + // Prepare response with possible next states var nextPossibleStatuses = await getNextStatusesTask; + var responseDto = _mapper.Map(expense); + if (nextPossibleStatuses is { Count: > 0 }) + responseDto.NextStatus = _mapper.Map>(nextPossibleStatuses); - var response = _mapper.Map(existingExpense); - if (nextPossibleStatuses != null) - { - // The response DTO should have a property like: public List NextAvailableStatuses { get; set; } - response.NextStatus = _mapper.Map>(nextPossibleStatuses); - } - - return ApiResponse.SuccessResponse(response); + return ApiResponse.SuccessResponse(responseDto); } catch (Exception ex) { - // This catch block handles errors from post-save operations like MongoDB logging. - // The primary update was successful, but we must log this failure. - _logger.LogError(ex, "Error occurred during post-save operations for ExpenseId: {ExpenseId} (e.g., audit logging). The primary status change was successful.", existingExpense.Id); - - // We can still return a success response because the main operation succeeded, - // but we should not block the user for a failed audit log. - // Alternatively, if audit logging is critical, you could return an error. - // Here, we choose to return success but log the ancillary failure. - var response = _mapper.Map(existingExpense); - return ApiResponse.SuccessResponse(response, "Status updated, but a post-processing error occurred."); + _logger.LogError(ex, "ChangeStatus: Post-operation error (e.g. audit logging). ExpenseId={ExpenseId}", expense.Id); + var responseDto = _mapper.Map(expense); + return ApiResponse.SuccessResponse(responseDto, "Status updated, but audit logging or cache update failed."); } } @@ -662,6 +659,9 @@ namespace Marco.Pms.Services.Service .Include(e => e.PaymentMode) .Include(e => e.Status) .Include(e => e.CreatedBy) + .Include(e => e.ReviewedBy) + .Include(e => e.ApprovedBy) + .Include(e => e.ProcessedBy) .FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); @@ -673,7 +673,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense not found", "Expense not found", 404); } - if (existingExpense.StatusId != Draft && existingExpense.StatusId != Rejected) + if (existingExpense.StatusId != Draft && existingExpense.StatusId != RejectedByReviewer && existingExpense.StatusId != RejectedByApprover) { _logger.LogWarning("User attempted to update expense with ID {ExpenseId}, but donot have status of DRAFT or REJECTED", loggedInEmployee.Id); return ApiResponse.ErrorResponse("Expense connot be updated", "Expense connot be updated", 400); @@ -1040,6 +1040,10 @@ namespace Marco.Pms.Services.Service } private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model, Guid tenantId) { + var reviewedById = model.ReviewedById != null ? Guid.Parse(model.ReviewedById) : Guid.Empty; + var approvedById = model.ApprovedById != null ? Guid.Parse(model.ApprovedById) : Guid.Empty; + var processedById = model.ProcessedById != null ? Guid.Parse(model.ProcessedById) : Guid.Empty; + var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); @@ -1048,12 +1052,27 @@ namespace Marco.Pms.Services.Service var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById) && e.TenantId == tenantId); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById) && e.TenantId == tenantId); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById) && e.TenantId == tenantId); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById) && e.TenantId == tenantId); + }); + var reviewedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == reviewedById && e.TenantId == tenantId); + }); + var approvedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == approvedById && e.TenantId == tenantId); + }); + var processedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == processedById && e.TenantId == tenantId); }); var expenseTypeTask = Task.Run(async () => { @@ -1103,12 +1122,15 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesReimburseMapping .Include(er => er.ExpensesReimburse) + .ThenInclude(er => er!.ReimburseBy) + .ThenInclude(e => e!.JobRole) .Where(er => er.TenantId == tenantId && er.ExpensesId == Guid.Parse(model.Id)) .Select(er => er.ExpensesReimburse).FirstOrDefaultAsync(); }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask, expenseReimburseTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, reviewedByTask, approvedByTask, processedByTask, + statusTask, permissionStatusMappingTask, expenseReimburseTask); var project = projectTask.Result; var expenseType = expenseTypeTask.Result; @@ -1117,6 +1139,9 @@ namespace Marco.Pms.Services.Service var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBy = paidByTask.Result; var createdBy = createdByTask.Result; + var reviewedBy = reviewedByTask.Result; + var approvedBy = approvedByTask.Result; + var processedBy = processedByTask.Result; var expensesReimburse = expenseReimburseTask.Result; var response = _mapper.Map(model); @@ -1124,6 +1149,9 @@ namespace Marco.Pms.Services.Service response.Project = _mapper.Map(project); response.PaidBy = _mapper.Map(paidBy); response.CreatedBy = _mapper.Map(createdBy); + if (reviewedBy != null) response.ReviewedBy = _mapper.Map(reviewedBy); + if (approvedBy != null) response.ApprovedBy = _mapper.Map(approvedBy); + if (processedBy != null) response.ProcessedBy = _mapper.Map(processedBy); response.PaymentMode = _mapper.Map(paymentMode); response.ExpensesType = _mapper.Map(expenseType); response.ExpensesReimburse = _mapper.Map(expensesReimburse); @@ -1158,6 +1186,69 @@ namespace Marco.Pms.Services.Service return response; } + private async Task GetObjectForfilter(Guid tenantId) + { + // Task 1: Get all distinct projects associated with the tenant's expenses. + var projectsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.Project != null) + .Select(e => e.Project!) + .Distinct() + .Select(p => new { p.Id, Name = $"{p.Name}" }) + .ToListAsync(); + }); + + // Task 2: Get all distinct users who paid for the tenant's expenses. + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.PaidBy != null) + .Select(e => e.PaidBy!) + .Distinct() + .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) + .ToListAsync(); + }); + + // Task 3: Get all distinct users who created the tenant's expenses. + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.CreatedBy != null) + .Select(e => e.CreatedBy!) + .Distinct() + .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) + .ToListAsync(); + }); + + // Task 4: Get all distinct statuses associated with the tenant's expenses. + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.Status != null) + .Select(e => e.Status!) + .Distinct() + .Select(s => new { s.Id, s.Name }) + .ToListAsync(); + }); + + // Execute all four queries concurrently. The total wait time will be determined + // by the longest-running query, not the sum of all four. + await Task.WhenAll(projectsTask, paidByTask, createdByTask, statusTask); + + // Construct the final object from the results of the completed tasks. + return new + { + Projects = await projectsTask, + PaidBy = await paidByTask, + CreatedBy = await createdByTask, + Status = await statusTask + }; + } /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). From 1c9008ca627b9f05eb0a3c6c82aad9af68532dbf Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 10:28:45 +0530 Subject: [PATCH 066/125] Added the search funcationality abd chnaged the cache object --- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 51 ++- .../Expenses/ExpenseDetailsMongoDB.cs | 25 +- .../Masters/ExpensesStatusMasterMongoDB.cs | 1 + .../ViewModels/Expenses/ExpenseList.cs | 2 + .../Controllers/ExpenseController.cs | 22 +- .../Helpers/CacheUpdateHelper.cs | 381 +++++++++++++----- .../MappingProfiles/MappingProfile.cs | 54 --- Marco.Pms.Services/Service/ExpensesService.cs | 377 ++++++++--------- .../ServiceInterfaces/IExpensesService.cs | 3 +- 9 files changed, 530 insertions(+), 386 deletions(-) diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 5d29088..fc670d6 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -1,6 +1,7 @@ using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.Utilities; using Microsoft.Extensions.Configuration; +using MongoDB.Bson; using MongoDB.Driver; namespace Marco.Pms.Helpers.CacheHelper @@ -36,7 +37,7 @@ namespace Marco.Pms.Helpers.CacheHelper await InitializeCollectionAsync(); } public async Task<(int totalPages, long totalCount, List expenseList)> GetExpenseListFromCacheAsync(Guid tenantId, Guid loggedInEmployeeId, bool viewAll, - bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? expenseFilter) + bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? expenseFilter, string? searchString) { var filterBuilder = Builders.Filter; var filter = filterBuilder.Empty; @@ -44,10 +45,11 @@ namespace Marco.Pms.Helpers.CacheHelper // Permission-based filter if (!viewAll && viewSelf) { - filter &= filterBuilder.Eq(e => e.CreatedById, loggedInEmployeeId.ToString()); + filter &= filterBuilder.Eq(e => e.CreatedBy.Id, loggedInEmployeeId.ToString()); } // Apply filters + if (expenseFilter != null) { if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) @@ -58,25 +60,62 @@ namespace Marco.Pms.Helpers.CacheHelper if (expenseFilter.ProjectIds?.Any() == true) { - filter &= filterBuilder.In(e => e.ProjectId, expenseFilter.ProjectIds.Select(p => p.ToString()).ToList()); + filter &= filterBuilder.In(e => e.Project.Id, expenseFilter.ProjectIds.Select(p => p.ToString()).ToList()); } if (expenseFilter.StatusIds?.Any() == true) { - filter &= filterBuilder.In(e => e.StatusId, expenseFilter.StatusIds.Select(p => p.ToString()).ToList()); + filter &= filterBuilder.In(e => e.Status.Id, expenseFilter.StatusIds.Select(p => p.ToString()).ToList()); } if (expenseFilter.PaidById?.Any() == true) { - filter &= filterBuilder.In(e => e.PaidById, expenseFilter.PaidById.Select(p => p.ToString()).ToList()); + filter &= filterBuilder.In(e => e.PaidBy.Id, expenseFilter.PaidById.Select(p => p.ToString()).ToList()); } if (expenseFilter.CreatedByIds?.Any() == true && viewAll) { - filter &= filterBuilder.In(e => e.CreatedById, expenseFilter.CreatedByIds.Select(p => p.ToString()).ToList()); + filter &= filterBuilder.In(e => e.CreatedBy.Id, expenseFilter.CreatedByIds.Select(p => p.ToString()).ToList()); } } + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchPattern = new BsonRegularExpression(searchString, "i"); + + // The base text searches remain the same + var searchClauses = new List> + { + filterBuilder.Regex(e => e.Description, searchPattern), + filterBuilder.Regex(e => e.TransactionId, searchPattern) + }; + + // Build the complex filter for PaidBy.FullName + var paidByFilter = new BsonDocument("$expr", + new BsonDocument("$regexMatch", new BsonDocument + { + { "input", new BsonDocument("$concat", new BsonArray { "$PaidBy.FirstName", " ", "$PaidBy.LastName" }) }, + { "regex", searchString }, // BsonRegularExpression can't be used here, pass the string + { "options", "i" } // Case-insensitivity option + }) + ); + searchClauses.Add(paidByFilter); + + // Build the complex filter for CreatedBy.FullName + var createdByFilter = new BsonDocument("$expr", + new BsonDocument("$regexMatch", new BsonDocument + { + { "input", new BsonDocument("$concat", new BsonArray { "$CreatedBy.FirstName", " ", "$CreatedBy.LastName" }) }, + { "regex", searchString }, + { "options", "i" } + }) + ); + searchClauses.Add(createdByFilter); + + // Combine all clauses with an OR + filter &= filterBuilder.Or(searchClauses); + } + // Total count var totalCount = await _collection.CountDocumentsAsync(filter); var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); diff --git a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs index 9dad1ce..c2618b9 100644 --- a/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Expenses/ExpenseDetailsMongoDB.cs @@ -1,22 +1,27 @@ -namespace Marco.Pms.Model.MongoDBModels.Expenses +using Marco.Pms.Model.MongoDBModels.Employees; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; + +namespace Marco.Pms.Model.MongoDBModels.Expenses { public class ExpenseDetailsMongoDB { public string Id { get; set; } = string.Empty; - public string ProjectId { get; set; } = string.Empty; - public string ExpensesTypeId { get; set; } = string.Empty; - public string PaymentModeId { get; set; } = string.Empty; - public string PaidById { get; set; } = string.Empty; - public string CreatedById { get; set; } = string.Empty; - public string? ReviewedById { get; set; } - public string? ApprovedById { get; set; } - public string? ProcessedById { get; set; } + public ProjectBasicMongoDB Project { get; set; } = new ProjectBasicMongoDB(); + public ExpensesTypeMasterMongoDB ExpensesType { get; set; } = new ExpensesTypeMasterMongoDB(); + public PaymentModeMatserMongoDB PaymentMode { get; set; } = new PaymentModeMatserMongoDB(); + public BasicEmployeeMongoDB PaidBy { get; set; } = new BasicEmployeeMongoDB(); + public BasicEmployeeMongoDB CreatedBy { get; set; } = new BasicEmployeeMongoDB(); + public BasicEmployeeMongoDB? ReviewedBy { get; set; } + public BasicEmployeeMongoDB? ApprovedBy { get; set; } + public BasicEmployeeMongoDB? ProcessedBy { get; set; } public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public DateTime ExpireAt { get; set; } = DateTime.UtcNow.Date.AddDays(1); public string SupplerName { get; set; } = string.Empty; public double Amount { get; set; } - public string StatusId { get; set; } = string.Empty; + public ExpensesStatusMasterMongoDB Status { get; set; } = new ExpensesStatusMasterMongoDB(); + public List NextStatus { get; set; } = new List(); public bool PreApproved { get; set; } = false; public string? TransactionId { get; set; } public string Description { get; set; } = string.Empty; diff --git a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs index 3e4a52a..03e512d 100644 --- a/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Masters/ExpensesStatusMasterMongoDB.cs @@ -6,6 +6,7 @@ public string Name { get; set; } = string.Empty; public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + //public List PermissionIds { get; set; } = new List(); public string? Color { get; set; } public bool IsSystem { get; set; } = false; } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs index 9bc3b08..c29b020 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs @@ -18,6 +18,8 @@ namespace Marco.Pms.Model.ViewModels.Expanses public DateTime TransactionDate { get; set; } public DateTime CreatedAt { get; set; } public string SupplerName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string TransactionId { get; set; } = string.Empty; public double Amount { get; set; } public ExpensesStatusMasterVM? Status { get; set; } public List? NextStatus { get; set; } diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index 5bbcf2c..36b0f74 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -39,10 +39,10 @@ namespace Marco.Pms.Services.Controllers /// A paginated list of expenses. [HttpGet("list")] - public async Task GetExpensesList(string? filter, int pageSize = 20, int pageNumber = 1) + public async Task GetExpensesList([FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _expensesService.GetExpensesListAsync(loggedInEmployee, tenantId, filter, pageSize, pageNumber); + var response = await _expensesService.GetExpensesListAsync(loggedInEmployee, tenantId, searchString, filter, pageSize, pageNumber); return StatusCode(response.StatusCode, response); } @@ -62,11 +62,24 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("filter")] + public async Task GetFilterObject() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetFilterObjectAsync(loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } + [HttpPost("create")] public async Task CreateExpense([FromBody] CreateExpensesDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.CreateExpenseAsync(model, loggedInEmployee, tenantId); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } return StatusCode(response.StatusCode, response); } @@ -101,6 +114,11 @@ namespace Marco.Pms.Services.Controllers { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var response = await _expensesService.DeleteExpanseAsync(id, loggedInEmployee, tenantId); + if (response.Success) + { + var notification = new { LoggedInUserId = loggedInEmployee.Id, Keyword = "Expanse", Response = response.Data }; + await _signalR.SendNotificationAsync(notification); + } return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 9acf08f..6aa5305 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -5,6 +5,7 @@ using Marco.Pms.Helpers.CacheHelper; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Employees; using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; @@ -869,36 +870,8 @@ namespace Marco.Pms.Services.Helpers #region ======================================================= Expenses Cache ======================================================= public async Task AddExpenseByObjectAsync(Expenses expense) { - var expenseCache = _mapper.Map(expense); + var expenseCache = await GetAllExpnesRelatedTablesForSingle(expense, expense.TenantId); - try - { - var billAttachment = await _context.BillAttachments - .Include(ba => ba.Document) - .AsNoTracking() - .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) - .GroupBy(ba => ba.ExpensesId) - .Select(g => new - { - Documents = g.Select(ba => new DocumentMongoDB - { - DocumentId = ba.Document!.Id.ToString(), - FileName = ba.Document.FileName, - ContentType = ba.Document.ContentType, - S3Key = ba.Document.S3Key, - ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key - }).ToList() - }) - .FirstOrDefaultAsync(); ; - if (billAttachment != null) - { - expenseCache.Documents = billAttachment.Documents; - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); - } try { await _expenseCache.AddExpenseToCacheAsync(expenseCache); @@ -914,40 +887,13 @@ namespace Marco.Pms.Services.Helpers public async Task AddExpenseByIdAsync(Guid Id, Guid tenantId) { var expense = await _context.Expenses.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Id && e.TenantId == tenantId); - var expenseCache = _mapper.Map(expense); + if (expense == null) { return null; } - try - { - var billAttachments = await _context.BillAttachments - .Include(ba => ba.Document) - .AsNoTracking() - .Where(ba => ba.ExpensesId == expense.Id && ba.Document != null) - .GroupBy(ba => ba.ExpensesId) - .Select(g => new - { - Documents = g.Select(ba => new DocumentMongoDB - { - DocumentId = ba.Document!.Id.ToString(), - FileName = ba.Document.FileName, - ContentType = ba.Document.ContentType, - S3Key = ba.Document.S3Key, - ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key - }).ToList() - }) - .FirstOrDefaultAsync(); - if (billAttachments != null) - { - expenseCache.Documents = billAttachments.Documents; - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); - return null; - } + var expenseCache = await GetAllExpnesRelatedTablesForSingle(expense, expense.TenantId); + try { await _expenseCache.AddExpenseToCacheAsync(expenseCache); @@ -962,39 +908,9 @@ namespace Marco.Pms.Services.Helpers } - public async Task AddExpensesListToCache(List expenses) + public async Task AddExpensesListToCache(List expenses, Guid tenantId) { - var expensesCache = _mapper.Map>(expenses); - var expenseIds = expenses.Select(e => e.Id).ToList(); - try - { - var billAttachments = await _context.BillAttachments - .Include(ba => ba.Document) - .AsNoTracking() - .Where(ba => expenseIds.Contains(ba.ExpensesId) && ba.Document != null) - .GroupBy(ba => ba.ExpensesId) - .Select(g => new - { - ExpensesId = g.Key, - Documents = g.Select(ba => new DocumentMongoDB - { - DocumentId = ba.Document!.Id.ToString(), - FileName = ba.Document.FileName, - ContentType = ba.Document.ContentType, - S3Key = ba.Document.S3Key, - ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key - }).ToList() - }) - .ToListAsync(); - foreach (var expenseCache in expensesCache) - { - expenseCache.Documents = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.Documents).FirstOrDefault() ?? new List(); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurd while fetched expense related tables to save in cahce"); - } + var expensesCache = await GetAllExpnesRelatedTablesForList(expenses, tenantId); try { @@ -1007,15 +923,18 @@ namespace Marco.Pms.Services.Helpers } public async Task<(int totalPages, long totalCount, List? expenseList)> GetExpenseListAsync(Guid tenantId, Guid loggedInEmployeeId, bool viewAll, - bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? filter) + bool viewSelf, int pageNumber, int pageSize, ExpensesFilter? filter, string? searchString) { try { - var (totalPages, totalCount, expenseList) = await _expenseCache.GetExpenseListFromCacheAsync(tenantId, loggedInEmployeeId, viewAll, viewSelf, pageNumber, pageSize, filter); + var (totalPages, totalCount, expenseList) = await _expenseCache.GetExpenseListFromCacheAsync(tenantId, loggedInEmployeeId, viewAll, viewSelf, pageNumber, pageSize, filter, searchString); if (expenseList.Any()) { + + return (totalPages, totalCount, expenseList); } + } catch (Exception ex) { @@ -1101,5 +1020,281 @@ namespace Marco.Pms.Services.Helpers } #endregion + + + #region ======================================================= Helper Functions ======================================================= + private async Task> GetAllExpnesRelatedTablesForList(List model, Guid tenantId) + { + List expenseList = new List(); + var expenseIds = model.Select(m => m.Id).ToList(); + var projectIds = model.Select(m => m.ProjectId).ToList(); + var statusIds = model.Select(m => m.StatusId).ToList(); + var expensesTypeIds = model.Select(m => m.ExpensesTypeId).ToList(); + var paymentModeIds = model.Select(m => m.PaymentModeId).ToList(); + var createdByIds = model.Select(m => m.CreatedById).ToList(); + var reviewedByIds = model.Select(m => m.ReviewedById).ToList(); + var approvedByIds = model.Select(m => m.ApprovedById).ToList(); + var processedByIds = model.Select(m => m.ProcessedById).ToList(); + var paidByIds = model.Select(m => m.PaidById).ToList(); + + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().Where(e => paidByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); + }); + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().Where(e => createdByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); + }); + var reviewedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().Where(e => reviewedByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); + }); + var approvedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().Where(e => approvedByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); + }); + var processedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().Where(e => processedByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id) && et.TenantId == tenantId).ToListAsync(); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id) && pm.TenantId == tenantId).ToListAsync(); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + StatusId = g.Key, + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }).ToListAsync(); + }); + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster + .AsNoTracking() + .Where(es => statusIds.Contains(es.Id)) + .ToListAsync(); + }); + var billAttachmentsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => expenseIds.Contains(ba.ExpensesId) && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + ExpensesId = g.Key, + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() + }) + .ToListAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, reviewedByTask, approvedByTask, + processedByTask, statusTask, billAttachmentsTask); + + var projects = projectTask.Result; + var expenseTypes = expenseTypeTask.Result; + var paymentModes = paymentModeTask.Result; + var statusMappings = statusMappingTask.Result; + var paidBys = paidByTask.Result; + var createdBys = createdByTask.Result; + var reviewedBys = reviewedByTask.Result; + var approvedBys = approvedByTask.Result; + var processedBy = processedByTask.Result; + var billAttachments = billAttachmentsTask.Result; + + expenseList = model.Select(m => + { + var response = _mapper.Map(m); + + response.Project = projects.Where(p => p.Id == m.ProjectId).Select(p => _mapper.Map(p)).FirstOrDefault() ?? new ProjectBasicMongoDB(); + response.PaidBy = paidBys.Where(p => p.Id == m.PaidById).Select(p => _mapper.Map(p)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.CreatedBy = createdBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.ReviewedBy = reviewedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.ApprovedBy = approvedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.ProcessedBy = processedBy.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.Status = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map(s.Status)).FirstOrDefault() ?? new ExpensesStatusMasterMongoDB(); + if (response.Status.Id == string.Empty) + { + var status = statusTask.Result; + response.Status = status.Where(s => s.Id == m.StatusId).Select(s => _mapper.Map(s)).FirstOrDefault() ?? new ExpensesStatusMasterMongoDB(); + } + + response.NextStatus = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault() ?? new List(); + response.PaymentMode = paymentModes.Where(pm => pm.Id == m.PaymentModeId).Select(pm => _mapper.Map(pm)).FirstOrDefault() ?? new PaymentModeMatserMongoDB(); + response.ExpensesType = expenseTypes.Where(et => et.Id == m.ExpensesTypeId).Select(et => _mapper.Map(et)).FirstOrDefault() ?? new ExpensesTypeMasterMongoDB(); + response.Documents = billAttachments.Where(ba => ba.ExpensesId == m.Id).Select(ba => ba.Documents).FirstOrDefault() ?? new List(); + return response; + }).ToList(); + + return expenseList; + } + private async Task GetAllExpnesRelatedTablesForSingle(Expenses model, Guid tenantId) + { + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.PaidById && e.TenantId == tenantId); + }); + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.CreatedById && e.TenantId == tenantId); + }); + var reviewedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ReviewedById && e.TenantId == tenantId); + }); + var approvedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ApprovedById && e.TenantId == tenantId); + }); + var processedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ProcessedById && e.TenantId == tenantId); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.ExpensesTypeId && et.TenantId == tenantId); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == model.PaymentModeId && pm.TenantId == tenantId); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .Where(es => es.StatusId == model.StatusId && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + StatusId = g.Key, + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }).FirstOrDefaultAsync(); + }); + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster + .AsNoTracking() + .FirstOrDefaultAsync(es => es.Id == model.StatusId); + }); + var billAttachmentsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => ba.ExpensesId == model.Id && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + ExpensesId = g.Key, + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() + }) + .FirstOrDefaultAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, reviewedByTask, approvedByTask, + processedByTask, statusTask, billAttachmentsTask); + + var project = projectTask.Result; + var expenseType = expenseTypeTask.Result; + var paymentMode = paymentModeTask.Result; + var statusMapping = statusMappingTask.Result; + var paidBy = paidByTask.Result; + var createdBy = createdByTask.Result; + var reviewedBy = reviewedByTask.Result; + var approvedBy = approvedByTask.Result; + var processedBy = processedByTask.Result; + var billAttachment = billAttachmentsTask.Result; + + + var response = _mapper.Map(model); + + response.Project = _mapper.Map(project); + response.PaidBy = _mapper.Map(paidBy); + response.CreatedBy = _mapper.Map(createdBy); + response.ReviewedBy = _mapper.Map(reviewedBy); + response.ApprovedBy = _mapper.Map(approvedBy); + response.ProcessedBy = _mapper.Map(processedBy); + if (statusMapping != null) + { + response.Status = _mapper.Map(statusMapping.Status); + response.NextStatus = _mapper.Map>(statusMapping.NextStatus); + } + if (response.Status == null) + { + var status = statusTask.Result; + response.Status = _mapper.Map(status); + } + response.PaymentMode = _mapper.Map(paymentMode); + response.ExpensesType = _mapper.Map(expenseType); + if (billAttachment != null) response.Documents = billAttachment.Documents; + + return response; + + } + + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 7be54f2..a4c58b3 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -130,33 +130,6 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Id, opt => opt.MapFrom(src => src.Id.ToString())) .ForMember( - dest => dest.ProjectId, - opt => opt.MapFrom(src => src.ProjectId.ToString())) - .ForMember( - dest => dest.ExpensesTypeId, - opt => opt.MapFrom(src => src.ExpensesTypeId.ToString())) - .ForMember( - dest => dest.PaymentModeId, - opt => opt.MapFrom(src => src.PaymentModeId.ToString())) - .ForMember( - dest => dest.PaidById, - opt => opt.MapFrom(src => src.PaidById.ToString())) - .ForMember( - dest => dest.CreatedById, - opt => opt.MapFrom(src => src.CreatedById.ToString())) - .ForMember( - dest => dest.ReviewedById, - opt => opt.MapFrom(src => src.ReviewedById.ToString())) - .ForMember( - dest => dest.ApprovedById, - opt => opt.MapFrom(src => src.ApprovedById.ToString())) - .ForMember( - dest => dest.ProcessedById, - opt => opt.MapFrom(src => src.ProcessedById.ToString())) - .ForMember( - dest => dest.StatusId, - opt => opt.MapFrom(src => src.StatusId.ToString())) - .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); @@ -165,33 +138,6 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))) .ForMember( - dest => dest.ProjectId, - opt => opt.MapFrom(src => Guid.Parse(src.ProjectId))) - .ForMember( - dest => dest.ExpensesTypeId, - opt => opt.MapFrom(src => Guid.Parse(src.ExpensesTypeId))) - .ForMember( - dest => dest.PaymentModeId, - opt => opt.MapFrom(src => Guid.Parse(src.PaymentModeId))) - .ForMember( - dest => dest.PaidById, - opt => opt.MapFrom(src => Guid.Parse(src.PaidById))) - .ForMember( - dest => dest.CreatedById, - opt => opt.MapFrom(src => Guid.Parse(src.CreatedById))) - .ForMember( - dest => dest.ReviewedById, - opt => opt.MapFrom(src => src.ReviewedById != null ? Guid.Parse(src.ReviewedById) : Guid.Empty)) - .ForMember( - dest => dest.ApprovedById, - opt => opt.MapFrom(src => src.ApprovedById != null ? Guid.Parse(src.ApprovedById) : Guid.Empty)) - .ForMember( - dest => dest.ProcessedById, - opt => opt.MapFrom(src => src.ProcessedById != null ? Guid.Parse(src.ProcessedById) : Guid.Empty)) - .ForMember( - dest => dest.StatusId, - opt => opt.MapFrom(src => Guid.Parse(src.StatusId))) - .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => Guid.Parse(src.TenantId))); diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 5458486..871059a 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -5,7 +5,6 @@ using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; -using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; @@ -70,7 +69,7 @@ namespace Marco.Pms.Services.Service /// The number of records to return per page. /// The page number to retrieve. /// A paginated list of expenses. - public async Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber) + public async Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber) { try { @@ -115,10 +114,10 @@ namespace Marco.Pms.Services.Service // 2. --- Deserialize Filter and Apply --- ExpensesFilter? expenseFilter = TryDeserializeFilter(filter); - var (totalPages, totalCount, expenseList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, - pageNumber, pageSize, expenseFilter); + var (totalPages, totalCount, cacheList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, + pageNumber, pageSize, expenseFilter, searchString); - if (expenseList == null) + if (cacheList == null) { // 3. --- Build Base Query and Apply Permissions --- @@ -126,7 +125,7 @@ namespace Marco.Pms.Services.Service var expensesQuery = _context.Expenses .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. - await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync()); + await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); // Apply permission-based filtering BEFORE any other filters or pagination. @@ -174,6 +173,16 @@ namespace Marco.Pms.Services.Service } } + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchStringLower = searchString.ToLower(); + expensesQuery = expensesQuery.Include(e => e.PaidBy).Include(e => e.CreatedBy) + .Where(e => e.Description.ToLower().Contains(searchStringLower) || + (e.TransactionId != null && e.TransactionId.ToLower().Contains(searchStringLower)) || + (e.PaidBy != null && (e.PaidBy.FirstName + " " + e.PaidBy.LastName).ToLower().Contains(searchStringLower)) || + (e.CreatedBy != null && (e.CreatedBy.FirstName + " " + e.CreatedBy.LastName).ToLower().Contains(searchStringLower))); + } + // 4. --- Apply Ordering and Pagination --- // This should be the last step before executing the query. @@ -199,20 +208,40 @@ namespace Marco.Pms.Services.Service } else { - expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList), tenantId); + var permissionStatusMapping = await _context.StatusPermissionMapping + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + + expenseVM = cacheList.Select(m => + { + var response = _mapper.Map(m); + if (response.Status != null && (response.NextStatus?.Any() ?? false)) + { + response.Status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == Guid.Parse(m.Status.Id)).Select(ps => ps.PermissionIds).FirstOrDefault(); + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } + return response; + }).ToList(); totalEntites = (int)totalCount; } // 7. --- Return Final Success Response --- var message = $"{expenseVM.Count} expense records fetched successfully."; _logger.LogInfo(message); - var defaultFilter = await GetObjectForfilter(tenantId); + + var response = new { CurrentFilter = expenseFilter, CurrentPage = pageNumber, TotalPages = totalPages, TotalEntites = totalEntites, - DefaultFilter = defaultFilter, Data = expenseVM, }; return ApiResponse.SuccessResponse(response, message, 200); @@ -242,7 +271,50 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); } } - var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails, tenantId); + var vm = _mapper.Map(expenseDetails); + + var permissionStatusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + }); + var expenseReimburseTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesReimburseMapping + .Include(er => er.ExpensesReimburse) + .ThenInclude(er => er!.ReimburseBy) + .ThenInclude(e => e!.JobRole) + .Where(er => er.TenantId == tenantId && er.ExpensesId == vm.Id) + .Select(er => er.ExpensesReimburse).FirstOrDefaultAsync(); + }); + var permissionStatusMappings = permissionStatusMappingTask.Result; + var expensesReimburse = expenseReimburseTask.Result; + + if (vm.Status != null && (vm.NextStatus?.Any() ?? false)) + { + vm.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == vm.Status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + foreach (var status in vm.NextStatus) + { + status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } + vm.ExpensesReimburse = _mapper.Map(expensesReimburse); + + foreach (var document in expenseDetails.Documents) + { + var response = vm.Documents.FirstOrDefault(d => d.DocumentId == Guid.Parse(document.DocumentId)); + + response!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); + response!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); + } + _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); @@ -268,6 +340,81 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); } } + public async Task> GetFilterObjectAsync(Employee loggedInEmployee, Guid tenantId) + { + try + { + using var scope = _serviceScopeFactory.CreateScope(); + var projectHelper = scope.ServiceProvider.GetRequiredService(); + var projectIds = await projectHelper.GetMyProjectIdsAsync(tenantId, loggedInEmployee); + + // Task 1: Get all distinct projects associated with the tenant's expenses. + var projectsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.Project != null && projectIds.Contains(e.ProjectId)) + .Select(e => e.Project!) + .Distinct() + .Select(p => new { p.Id, Name = $"{p.Name}" }) + .ToListAsync(); + }); + + // Task 2: Get all distinct users who paid for the tenant's expenses. + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.PaidBy != null) + .Select(e => e.PaidBy!) + .Distinct() + .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) + .ToListAsync(); + }); + + // Task 3: Get all distinct users who created the tenant's expenses. + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.CreatedBy != null) + .Select(e => e.CreatedBy!) + .Distinct() + .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) + .ToListAsync(); + }); + + // Task 4: Get all distinct statuses associated with the tenant's expenses. + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Expenses + .Where(e => e.TenantId == tenantId && e.Status != null) + .Select(e => e.Status!) + .Distinct() + .Select(s => new { s.Id, s.Name }) + .ToListAsync(); + }); + + // Execute all four queries concurrently. The total wait time will be determined + // by the longest-running query, not the sum of all four. + await Task.WhenAll(projectsTask, paidByTask, createdByTask, statusTask); + + // Construct the final object from the results of the completed tasks. + return ApiResponse.SuccessResponse(new + { + Projects = await projectsTask, + PaidBy = await paidByTask, + CreatedBy = await createdByTask, + Status = await statusTask + }, "Successfully fetched the filter list", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while fetching the list filters for expenses"); + return ApiResponse.ErrorResponse("Internal Exception Occured", ExceptionMapper(ex), 500); + } + } #endregion @@ -1038,217 +1185,7 @@ namespace Marco.Pms.Services.Service return expenseList; } - private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model, Guid tenantId) - { - var reviewedById = model.ReviewedById != null ? Guid.Parse(model.ReviewedById) : Guid.Empty; - var approvedById = model.ApprovedById != null ? Guid.Parse(model.ApprovedById) : Guid.Empty; - var processedById = model.ProcessedById != null ? Guid.Parse(model.ProcessedById) : Guid.Empty; - var projectTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId) && p.TenantId == tenantId); - }); - var paidByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById) && e.TenantId == tenantId); - }); - var createdByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById) && e.TenantId == tenantId); - }); - var reviewedByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == reviewedById && e.TenantId == tenantId); - }); - var approvedByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == approvedById && e.TenantId == tenantId); - }); - var processedByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == processedById && e.TenantId == tenantId); - }); - var expenseTypeTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId) && et.TenantId == tenantId); - }); - var paymentModeTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId) && pm.TenantId == tenantId); - }); - var statusMappingTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMapping - .Include(s => s.Status) - .Include(s => s.NextStatus) - .AsNoTracking() - .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null) - .GroupBy(s => s.StatusId) - .Select(g => new - { - Status = g.Select(s => s.Status).FirstOrDefault(), - NextStatus = g.Select(s => s.NextStatus).ToList() - }).FirstOrDefaultAsync(); - }); - var statusTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesStatusMaster - .AsNoTracking() - .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId)); - }); - var permissionStatusMappingTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.StatusPermissionMapping - .GroupBy(ps => ps.StatusId) - .Select(g => new - { - StatusId = g.Key, - PermissionIds = g.Select(ps => ps.PermissionId).ToList() - }).ToListAsync(); - }); - var expenseReimburseTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesReimburseMapping - .Include(er => er.ExpensesReimburse) - .ThenInclude(er => er!.ReimburseBy) - .ThenInclude(e => e!.JobRole) - .Where(er => er.TenantId == tenantId && er.ExpensesId == Guid.Parse(model.Id)) - .Select(er => er.ExpensesReimburse).FirstOrDefaultAsync(); - }); - - // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, reviewedByTask, approvedByTask, processedByTask, - statusTask, permissionStatusMappingTask, expenseReimburseTask); - - var project = projectTask.Result; - var expenseType = expenseTypeTask.Result; - var paymentMode = paymentModeTask.Result; - var statusMapping = statusMappingTask.Result; - var permissionStatusMappings = permissionStatusMappingTask.Result; - var paidBy = paidByTask.Result; - var createdBy = createdByTask.Result; - var reviewedBy = reviewedByTask.Result; - var approvedBy = approvedByTask.Result; - var processedBy = processedByTask.Result; - var expensesReimburse = expenseReimburseTask.Result; - - var response = _mapper.Map(model); - - response.Project = _mapper.Map(project); - response.PaidBy = _mapper.Map(paidBy); - response.CreatedBy = _mapper.Map(createdBy); - if (reviewedBy != null) response.ReviewedBy = _mapper.Map(reviewedBy); - if (approvedBy != null) response.ApprovedBy = _mapper.Map(approvedBy); - if (processedBy != null) response.ProcessedBy = _mapper.Map(processedBy); - response.PaymentMode = _mapper.Map(paymentMode); - response.ExpensesType = _mapper.Map(expenseType); - response.ExpensesReimburse = _mapper.Map(expensesReimburse); - if (statusMapping != null) - { - response.Status = _mapper.Map(statusMapping.Status); - - response.NextStatus = _mapper.Map>(statusMapping.NextStatus); - if (response.NextStatus != null) - { - foreach (var status in response.NextStatus) - { - status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); - } - } - } - if (response.Status == null) - { - var status = statusTask.Result; - response.Status = _mapper.Map(status); - } - response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == Guid.Parse(model.StatusId)).Select(ps => ps.PermissionIds).FirstOrDefault(); - - foreach (var document in model.Documents) - { - var vm = response.Documents.FirstOrDefault(d => d.DocumentId == Guid.Parse(document.DocumentId)); - - vm!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); - vm!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); - } - - return response; - } - - private async Task GetObjectForfilter(Guid tenantId) - { - // Task 1: Get all distinct projects associated with the tenant's expenses. - var projectsTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Expenses - .Where(e => e.TenantId == tenantId && e.Project != null) - .Select(e => e.Project!) - .Distinct() - .Select(p => new { p.Id, Name = $"{p.Name}" }) - .ToListAsync(); - }); - - // Task 2: Get all distinct users who paid for the tenant's expenses. - var paidByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Expenses - .Where(e => e.TenantId == tenantId && e.PaidBy != null) - .Select(e => e.PaidBy!) - .Distinct() - .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) - .ToListAsync(); - }); - - // Task 3: Get all distinct users who created the tenant's expenses. - var createdByTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Expenses - .Where(e => e.TenantId == tenantId && e.CreatedBy != null) - .Select(e => e.CreatedBy!) - .Distinct() - .Select(u => new { u.Id, Name = $"{u.FirstName} {u.LastName}" }) - .ToListAsync(); - }); - - // Task 4: Get all distinct statuses associated with the tenant's expenses. - var statusTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Expenses - .Where(e => e.TenantId == tenantId && e.Status != null) - .Select(e => e.Status!) - .Distinct() - .Select(s => new { s.Id, s.Name }) - .ToListAsync(); - }); - - // Execute all four queries concurrently. The total wait time will be determined - // by the longest-running query, not the sum of all four. - await Task.WhenAll(projectsTask, paidByTask, createdByTask, statusTask); - - // Construct the final object from the results of the completed tasks. - return new - { - Projects = await projectsTask, - PaidBy = await paidByTask, - CreatedBy = await createdByTask, - Status = await statusTask - }; - } /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 673c26c..5d84eab 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -6,9 +6,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IExpensesService { - Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? filter, int pageSize, int pageNumber); + Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); Task> GetExpenseDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId); Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId); + Task> GetFilterObjectAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); Task> ChangeStatusAsync(ExpenseRecordDto model, Employee loggedInEmployee, Guid tenantId); Task> UpdateExpanseAsync(Guid id, UpdateExpensesDto model, Employee loggedInEmployee, Guid tenantId); From 36db35d90eec0210d910c8daf218644e2c5defef Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 11:15:37 +0530 Subject: [PATCH 067/125] Sending every project exists in expense table --- Marco.Pms.Services/Service/ExpensesService.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 871059a..03a22f6 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -344,16 +344,12 @@ namespace Marco.Pms.Services.Service { try { - using var scope = _serviceScopeFactory.CreateScope(); - var projectHelper = scope.ServiceProvider.GetRequiredService(); - var projectIds = await projectHelper.GetMyProjectIdsAsync(tenantId, loggedInEmployee); - // Task 1: Get all distinct projects associated with the tenant's expenses. var projectsTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.Expenses - .Where(e => e.TenantId == tenantId && e.Project != null && projectIds.Contains(e.ProjectId)) + .Where(e => e.TenantId == tenantId && e.Project != null) .Select(e => e.Project!) .Distinct() .Select(p => new { p.Id, Name = $"{p.Name}" }) From b7d770716aed699cfa1c4da7de5fa36052fab09e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 16:54:06 +0530 Subject: [PATCH 068/125] Created the API ot Create new Tenant --- .../Data/ApplicationDbContext.cs | 105 +- ...New_Parameters_In_Tenant_Table.Designer.cs | 3547 +++++++++++++++++ ...59_Added_New_Parameters_In_Tenant_Table.cs | 294 ++ .../ApplicationDbContextModelSnapshot.cs | 119 +- .../Dtos/Tenant/CreateTenantDto.cs | 20 + Marco.Pms.Model/Entitlements/Client.cs | 25 - .../Entitlements/PermissionsMaster.cs | 3 + Marco.Pms.Model/Entitlements/Tenant.cs | 37 + Marco.Pms.Model/Master/TenantStatus.cs | 8 + Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs | 28 + .../Controllers/TenantController.cs | 242 ++ .../MappingProfiles/MappingProfile.cs | 10 +- .../Service/StartupDataSeeder.cs | 285 +- 13 files changed, 4543 insertions(+), 180 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs delete mode 100644 Marco.Pms.Model/Entitlements/Client.cs create mode 100644 Marco.Pms.Model/Entitlements/Tenant.cs create mode 100644 Marco.Pms.Model/Master/TenantStatus.cs create mode 100644 Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs create mode 100644 Marco.Pms.Services/Controllers/TenantController.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 7601e60..6a2de2b 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -1,5 +1,4 @@ -using System.Globalization; -using Marco.Pms.Model.Activities; +using Marco.Pms.Model.Activities; using Marco.Pms.Model.AttendanceModule; using Marco.Pms.Model.Authentication; using Marco.Pms.Model.Directory; @@ -16,6 +15,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; +using System.Globalization; namespace Marco.Pms.DataAccess.Data { @@ -30,6 +30,7 @@ namespace Marco.Pms.DataAccess.Data } public DbSet RefreshTokens { get; set; } + public DbSet TenantStatus { get; set; } public DbSet Tenants { get; set; } public DbSet ApplicationUsers { get; set; } public DbSet ActivityMasters { get; set; } @@ -97,48 +98,7 @@ namespace Marco.Pms.DataAccess.Data ManageApplicationStructure(modelBuilder); - //modelBuilder.Entity().HasData( - // new ApplicationRole - // { - // Id = new Guid("2c8d0808-c421-11ef-9b93-0242ac110002"), - // Role = "Super User", - // Description = "Super User", - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("62e0918d-c421-11ef-9b93-0242ac110002"), - // Role = "Welder", - // Description = "", - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("68823f1f-c421-11ef-9b93-0242ac110002"), - // Role = "Helper", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, - // new ApplicationRole - // { - // Id = new Guid("6d3a7c72-c421-11ef-9b93-0242ac110002"), - // Role = "Site Engineer", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // , - // new ApplicationRole - // { - // Id = new Guid("6d3aad72-c421-11ef-9b93-0242ac110002"), - // Role = "Project Manager", - // Description = "", - - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // ); modelBuilder.Entity(entity => { @@ -148,9 +108,43 @@ namespace Marco.Pms.DataAccess.Data .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); }); + modelBuilder.Entity().HasData( + new TenantStatus + { + Id = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new TenantStatus + { + Id = Guid.Parse("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new TenantStatus + { + Id = Guid.Parse("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + } + ); modelBuilder.Entity().HasData( - new Tenant { Id = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), OragnizationSize = "100-200", Name = "MarcoBMS", ContactName = "Admin", ContactNumber = "123456789", Description = "", DomainName = "www.marcobms.org", IndustryId = Guid.Parse("15436ee3-a650-469e-bfc2-59993f7514bb"), OnBoardingDate = DateTime.MinValue } + new Tenant + { + Id = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), + OragnizationSize = "100-200", + Email = "admin@marcoaiot.com", + Name = "MarcoBMS", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + TenantStatusId = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"), + IndustryId = Guid.Parse("15436ee3-a650-469e-bfc2-59993f7514bb"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + OnBoardingDate = DateTime.MinValue, + IsSuperTenant = true, + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==", + Reference = "Root Tenant" + } ); modelBuilder.Entity().HasData( @@ -494,18 +488,27 @@ namespace Marco.Pms.DataAccess.Data Name = "Project", Description = "Project Module", Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02" - }, new Module + }, + new Module { Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), Name = "Employee", Description = "Employee Module", Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637" - }, new Module + }, + new Module { Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), Name = "Masters", Description = "Masters Module", Key = "504ec132-e6a9-422f-8f85-050602cfce05" + }, + new Module + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant", + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05" }); @@ -518,13 +521,17 @@ namespace Marco.Pms.DataAccess.Data 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("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 } + 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 }, - //new Feature { Id = new Guid("660131a4-788c-4739-a082-cbbf7879cbf2"), Description = "Tenant Masters", Name = "Tenant Masters", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true } + new Feature { Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), Description = "Managing all tenant related rights", Name = "Tenant Management", ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), IsActive = true } ); modelBuilder.Entity().HasData( + new FeaturePermission { Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), IsEnabled = true, Name = "Manage Tenants", Description = "Able add, modify and suspend any tenant." }, + new FeaturePermission { Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), IsEnabled = true, Name = "Modify Tenant", Description = "Modify only his tenant." }, + new FeaturePermission { Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), IsEnabled = true, Name = "View Tenant", Description = "Asscess information related to tenant." }, + new FeaturePermission { Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "View Project", Description = "Access all information related to the project." }, new FeaturePermission { Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Project", Description = "Potentially edit the project name, description, start/end dates, or status." }, new FeaturePermission { Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), IsEnabled = true, Name = "Manage Team", Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects." }, diff --git a/Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.Designer.cs new file mode 100644 index 0000000..9630dc3 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.Designer.cs @@ -0,0 +1,3547 @@ +// +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("20250731100859_Added_New_Parameters_In_Tenant_Table")] + partial class Added_New_Parameters_In_Tenant_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.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.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("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" + }); + }); + + 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.Entitlements.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("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .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), + OragnizationSize = "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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250731100859_Added_New_Parameters_In_Tenant_Table.cs b/Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.cs new file mode 100644 index 0000000..e64b38d --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250731100859_Added_New_Parameters_In_Tenant_Table.cs @@ -0,0 +1,294 @@ +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_New_Parameters_In_Tenant_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "Tenants", + keyColumn: "Name", + keyValue: null, + column: "Name", + value: ""); + + migrationBuilder.AlterColumn( + name: "Name", + table: "Tenants", + type: "longtext", + nullable: false, + oldClrType: typeof(string), + oldType: "longtext", + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.UpdateData( + table: "Tenants", + keyColumn: "ContactNumber", + keyValue: null, + column: "ContactNumber", + value: ""); + + migrationBuilder.AlterColumn( + name: "ContactNumber", + table: "Tenants", + type: "longtext", + nullable: false, + oldClrType: typeof(string), + oldType: "longtext", + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.UpdateData( + table: "Tenants", + keyColumn: "ContactName", + keyValue: null, + column: "ContactName", + value: ""); + + migrationBuilder.AlterColumn( + name: "ContactName", + table: "Tenants", + type: "longtext", + nullable: false, + oldClrType: typeof(string), + oldType: "longtext", + oldNullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "BillingAddress", + table: "Tenants", + type: "longtext", + nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "CreatedById", + table: "Tenants", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "Email", + table: "Tenants", + type: "longtext", + nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "IsSuperTenant", + table: "Tenants", + type: "tinyint(1)", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "Reference", + table: "Tenants", + type: "longtext", + nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "TaxId", + table: "Tenants", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "TenantStatusId", + table: "Tenants", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "logoImage", + table: "Tenants", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "TenantStatus", + 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") + }, + constraints: table => + { + table.PrimaryKey("PK_TenantStatus", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "Modules", + columns: new[] { "Id", "Description", "Key", "Name" }, + values: new object[] { new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), "Tenant Module", "504ec132-e6a9-422f-8f85-050602cfce05", "Tenant" }); + + migrationBuilder.InsertData( + table: "TenantStatus", + columns: new[] { "Id", "Name" }, + values: new object[,] + { + { new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), "Suspended" }, + { new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), "Active" }, + { new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), "In Active" } + }); + + migrationBuilder.UpdateData( + table: "Tenants", + keyColumn: "Id", + keyValue: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + columns: new[] { "BillingAddress", "CreatedById", "Email", "IsSuperTenant", "Reference", "TaxId", "TenantStatusId", "logoImage" }, + values: new object[] { "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", null, "admin@marcoaiot.com", true, "Root Tenant", null, new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" }); + + migrationBuilder.InsertData( + table: "Features", + columns: new[] { "Id", "Description", "IsActive", "ModuleId", "Name" }, + values: new object[] { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), "Managing all tenant related rights", true, new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), "Tenant Management" }); + + migrationBuilder.InsertData( + table: "FeaturePermissions", + columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, + values: new object[,] + { + { new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), "Modify only his tenant.", new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), true, "Modify Tenant" }, + { new Guid("647145c6-2108-4c98-aab4-178602236e55"), "Asscess information related to tenant.", new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), true, "View Tenant" }, + { new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), "Able add, modify and suspend any tenant.", new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), true, "Manage Tenants" } + }); + + migrationBuilder.CreateIndex( + name: "IX_Tenants_TenantStatusId", + table: "Tenants", + column: "TenantStatusId"); + + migrationBuilder.AddForeignKey( + name: "FK_Tenants_TenantStatus_TenantStatusId", + table: "Tenants", + column: "TenantStatusId", + principalTable: "TenantStatus", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tenants_TenantStatus_TenantStatusId", + table: "Tenants"); + + migrationBuilder.DropTable( + name: "TenantStatus"); + + migrationBuilder.DropIndex( + name: "IX_Tenants_TenantStatusId", + table: "Tenants"); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("647145c6-2108-4c98-aab4-178602236e55")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b")); + + migrationBuilder.DeleteData( + table: "Features", + keyColumn: "Id", + keyValue: new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d")); + + migrationBuilder.DeleteData( + table: "Modules", + keyColumn: "Id", + keyValue: new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9")); + + migrationBuilder.DropColumn( + name: "BillingAddress", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "CreatedById", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "Email", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "IsSuperTenant", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "Reference", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "TaxId", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "TenantStatusId", + table: "Tenants"); + + migrationBuilder.DropColumn( + name: "logoImage", + table: "Tenants"); + + migrationBuilder.AlterColumn( + name: "Name", + table: "Tenants", + type: "longtext", + nullable: true, + oldClrType: typeof(string), + oldType: "longtext") + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "ContactNumber", + table: "Tenants", + type: "longtext", + nullable: true, + oldClrType: typeof(string), + oldType: "longtext") + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AlterColumn( + name: "ContactName", + table: "Tenants", + type: "longtext", + nullable: true, + oldClrType: typeof(string), + oldType: "longtext") + .Annotation("MySql:CharSet", "utf8mb4") + .OldAnnotation("MySql:CharSet", "utf8mb4"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 15273ce..bdb6cd2 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -970,6 +970,30 @@ namespace Marco.Pms.DataAccess.Migrations 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"), @@ -1161,25 +1185,42 @@ namespace Marco.Pms.DataAccess.Migrations .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("OnBoardingDate") @@ -1188,25 +1229,46 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("OragnizationSize") .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), - OragnizationSize = "100-200" + OragnizationSize = "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==" }); }); @@ -1572,6 +1634,14 @@ namespace Marco.Pms.DataAccess.Migrations 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" }); }); @@ -1678,6 +1748,13 @@ namespace Marco.Pms.DataAccess.Migrations 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" }); }); @@ -1732,6 +1809,38 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + 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") @@ -3062,7 +3171,15 @@ namespace Marco.Pms.DataAccess.Migrations .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.Forum.TicketAttachment", b => diff --git a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs new file mode 100644 index 0000000..0d85b83 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs @@ -0,0 +1,20 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class CreateTenantDto + { + public required string FirstName { get; set; } + public required string LastName { get; set; } + public required string Email { get; set; } + public string? Description { get; set; } + public string? DomainName { get; set; } + public required string BillingAddress { get; set; } + public string? TaxId { get; set; } + public string? logoImage { get; set; } + public required string OragnizationName { get; set; } + public required string ContactNumber { get; set; } + public required DateTime OnBoardingDate { get; set; } + public required string OragnizationSize { get; set; } + public required Guid IndustryId { get; set; } + public required string Reference { get; set; } + } +} diff --git a/Marco.Pms.Model/Entitlements/Client.cs b/Marco.Pms.Model/Entitlements/Client.cs deleted file mode 100644 index 44944f8..0000000 --- a/Marco.Pms.Model/Entitlements/Client.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.ComponentModel.DataAnnotations.Schema; -using Marco.Pms.Model.Master; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; - -namespace Marco.Pms.Model.Entitlements -{ - public class Tenant - { - public Guid Id { get; set; } - public string? Name { get; set; } - public string? Description { get; set; } - public string? DomainName { get; set; } - public string? ContactName { get; set; } - public string? ContactNumber { get; set; } - public DateTime OnBoardingDate { get; set; } - public string? OragnizationSize { get; set; } - public Guid? IndustryId { get; set; } - - [ForeignKey("IndustryId")] - [ValidateNever] - public Industry? Industry { get; set; } - - public bool IsActive { get; set; } = true; - } -} diff --git a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs index d0bef58..080b3a8 100644 --- a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs +++ b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs @@ -2,6 +2,9 @@ { public static class PermissionsMaster { + public static readonly Guid ManageTenants = Guid.Parse("d032cb1a-3f30-462c-bef0-7ace73a71c0b"); + public static readonly Guid ModifyTenant = Guid.Parse("00e20637-ce8d-4417-bec4-9b31b5e65092"); + public static readonly Guid ViewTenant = Guid.Parse("647145c6-2108-4c98-aab4-178602236e55"); public static readonly Guid DirectoryAdmin = Guid.Parse("4286a13b-bb40-4879-8c6d-18e9e393beda"); public static readonly Guid DirectoryManager = Guid.Parse("62668630-13ce-4f52-a0f0-db38af2230c5"); public static readonly Guid DirectoryUser = Guid.Parse("0f919170-92d4-4337-abd3-49b66fc871bb"); diff --git a/Marco.Pms.Model/Entitlements/Tenant.cs b/Marco.Pms.Model/Entitlements/Tenant.cs new file mode 100644 index 0000000..55b6c93 --- /dev/null +++ b/Marco.Pms.Model/Entitlements/Tenant.cs @@ -0,0 +1,37 @@ +using Marco.Pms.Model.Master; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.Entitlements +{ + public class Tenant + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string? Description { get; set; } + public string? DomainName { get; set; } + public string ContactName { get; set; } = string.Empty; + public string ContactNumber { get; set; } = string.Empty; + public string BillingAddress { get; set; } = string.Empty; + public string? TaxId { get; set; } + public string? logoImage { get; set; } // Base64 + public DateTime OnBoardingDate { get; set; } + public string? OragnizationSize { get; set; } + public Guid? IndustryId { get; set; } + + [ForeignKey("IndustryId")] + [ValidateNever] + public Industry? Industry { get; set; } + public Guid? CreatedById { get; set; } // EmployeeId + public Guid TenantStatusId { get; set; } + + [ForeignKey("TenantStatusId")] + [ValidateNever] + public TenantStatus? TenantStatus { get; set; } + public string Reference { get; set; } = string.Empty; + + public bool IsActive { get; set; } = true; + public bool IsSuperTenant { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Master/TenantStatus.cs b/Marco.Pms.Model/Master/TenantStatus.cs new file mode 100644 index 0000000..2af62b1 --- /dev/null +++ b/Marco.Pms.Model/Master/TenantStatus.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Master +{ + public class TenantStatus + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs new file mode 100644 index 0000000..017ed1d --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs @@ -0,0 +1,28 @@ +using Marco.Pms.Model.Master; +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.Tenant +{ + public class TenantVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string? Description { get; set; } + public string? DomainName { get; set; } + public string ContactName { get; set; } = string.Empty; + public string ContactNumber { get; set; } = string.Empty; + public string BillingAddress { get; set; } = string.Empty; + public string? TaxId { get; set; } + public string? logoImage { get; set; } // Base64 + public DateTime OnBoardingDate { get; set; } + public string? OragnizationSize { get; set; } + public Industry? Industry { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } // EmployeeId + public TenantStatus? TenantStatus { get; set; } + public string Reference { get; set; } = string.Empty; + + public bool IsActive { get; set; } = true; + public bool IsSuperTenant { get; set; } = false; + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs new file mode 100644 index 0000000..0d177d3 --- /dev/null +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -0,0 +1,242 @@ +using AutoMapper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.Dtos.Tenant; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Roles; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Tenant; +using Marco.Pms.Services.Service; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using System.Net; +using System.Text.RegularExpressions; + +// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 + +namespace Marco.Pms.Services.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class TenantController : ControllerBase + { + private readonly IDbContextFactory _dbContextFactory; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly ILoggingService _logger; + private readonly UserManager _userManager; + private readonly IMapper _mapper; + private readonly static Guid activeStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); + public TenantController(IDbContextFactory dbContextFactory, + IServiceScopeFactory serviceScopeFactory, + ILoggingService logger, + UserManager userManager, + IMapper mapper) + { + _dbContextFactory = dbContextFactory; + _serviceScopeFactory = serviceScopeFactory; + _logger = logger; + _userManager = userManager; + _mapper = mapper; + } + // GET: api/ + [HttpGet] + public IEnumerable Get() + { + return new string[] { "value1", "value2" }; + } + + // GET api//5 + [HttpGet("{id}")] + public string Get(int id) + { + return "value"; + } + + // POST api/ + [HttpPost("create")] + public async Task Post([FromBody] CreateTenantDto model) + { + using var scope = _serviceScopeFactory.CreateScope(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + var _configuration = scope.ServiceProvider.GetRequiredService(); + var _emailSender = scope.ServiceProvider.GetRequiredService(); + + var userHelper = scope.ServiceProvider.GetRequiredService(); + var loggedInEmployee = await userHelper.GetCurrentEmployeeAsync(); + + var permissionService = scope.ServiceProvider.GetRequiredService(); + var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + if (!hasPermission || !(loggedInEmployee.ApplicationUser?.IsRootUser ?? false)) + { + _logger.LogWarning("User {EmployeeId} attmpted to create new tenant but not have permissions", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User don't have rights for this action", 403)); + } + + var existingUser = await _userManager.FindByEmailAsync(model.Email); + if (existingUser != null) + { + _logger.LogWarning("User {EmployeeId} attempted to create tenant with email {Email} but already exists in database", loggedInEmployee.Id, model.Email); + return StatusCode(409, ApiResponse.ErrorResponse("Tenant can't be created", "User with same email already exists", 409)); + } + var isTenantExists = await _context.Tenants.AnyAsync(t => t.TaxId != null && t.TaxId == model.TaxId); + if (isTenantExists) + { + _logger.LogWarning("User {EmployeeId} attempted to create tenant with duplicate taxId", loggedInEmployee.Id); + return StatusCode(409, ApiResponse.ErrorResponse("Tenant can't be created", "User with same taxId already exists", 409)); + } + if (!string.IsNullOrWhiteSpace(model.logoImage) && !IsBase64String(model.logoImage)) + { + _logger.LogWarning("User {EmployeeId} attempted to create tenant with Invalid logoImage", loggedInEmployee.Id); + return StatusCode(400, ApiResponse.ErrorResponse("Tenant can't be created", "User with same taxId already exists", 400)); + } + await using var transaction = await _context.Database.BeginTransactionAsync(); + try + { + var tenant = new Tenant + { + Name = model.OragnizationName, + ContactName = $"{model.FirstName} {model.LastName}", + ContactNumber = model.ContactNumber, + Email = model.Email, + IndustryId = model.IndustryId, + TenantStatusId = activeStatus, + Description = model.Description, + OnBoardingDate = model.OnBoardingDate, + OragnizationSize = model.OragnizationSize, + Reference = model.Reference, + CreatedById = loggedInEmployee.Id, + BillingAddress = model.BillingAddress, + TaxId = model.TaxId, + logoImage = model.logoImage, + DomainName = model.DomainName, + IsSuperTenant = false + }; + + _context.Tenants.Add(tenant); + + await _context.SaveChangesAsync(); + var designation = new JobRole + { + Name = "Admin", + Description = "Root degination for tenant only", + TenantId = tenant.Id + }; + var applicationUser = new ApplicationUser + { + Email = model.Email, + UserName = model.Email, + IsRootUser = true, + EmailConfirmed = true, + TenantId = tenant.Id + }; + _context.JobRoles.Add(designation); + + var result = await _userManager.CreateAsync(applicationUser, "User@123"); + if (!result.Succeeded) + return BadRequest(ApiResponse.ErrorResponse("Failed to create user", result.Errors, 400)); + + await _context.SaveChangesAsync(); + + var employeeUser = new Employee + { + FirstName = model.FirstName, + LastName = model.LastName, + Email = model.Email, + PhoneNumber = model.ContactNumber, + ApplicationUserId = applicationUser.Id, + JobRole = designation, + CurrentAddress = model.BillingAddress, + TenantId = tenant.Id + }; + + await _context.SaveChangesAsync(); + + var token = await _userManager.GeneratePasswordResetTokenAsync(applicationUser); + var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}"; + if (employeeUser.FirstName != null) + { + await _emailSender.SendResetPasswordEmailOnRegister(applicationUser.Email, employeeUser.FirstName, resetLink); + } + var vm = _mapper.Map(tenant); + vm.CreatedBy = _mapper.Map(loggedInEmployee); + return Ok(tenant); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while creating tenant"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while creating tenant"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + } + + // PUT api//5 + [HttpPut("{id}")] + public void Put(int id, [FromBody] string value) + { + } + + // DELETE api//5 + [HttpDelete("{id}")] + public void Delete(int id) + { + } + + + + 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, + } + }; + } + private bool IsBase64String(string? input) + { + if (string.IsNullOrWhiteSpace(input)) + return false; + + // Normalize string + input = input.Trim(); + + // Length must be multiple of 4 + if (input.Length % 4 != 0) + return false; + + // Valid Base64 characters with correct padding + var base64Regex = new Regex(@"^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); + if (!base64Regex.IsMatch(input)) + return false; + + try + { + // Decode and re-encode to confirm validity + var bytes = Convert.FromBase64String(input); + var reEncoded = Convert.ToBase64String(bytes); + return input == reEncoded; + } + catch + { + return false; + } + } + } +} diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index bf3777c..244c2d8 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -1,11 +1,14 @@ using AutoMapper; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; 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.Employee; using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Model.ViewModels.Tenant; namespace Marco.Pms.Services.MappingProfiles { @@ -13,6 +16,10 @@ namespace Marco.Pms.Services.MappingProfiles { public MappingProfile() { + #region ======================================================= Employees ======================================================= + CreateMap(); + #endregion + #region ======================================================= Projects ======================================================= // Your mappings CreateMap(); @@ -60,8 +67,9 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Comment)); #endregion - #region ======================================================= Projects ======================================================= + #region ======================================================= Employees ======================================================= CreateMap(); + CreateMap(); #endregion } } diff --git a/Marco.Pms.Services/Service/StartupDataSeeder.cs b/Marco.Pms.Services/Service/StartupDataSeeder.cs index 10d6f71..d2496fc 100644 --- a/Marco.Pms.Services/Service/StartupDataSeeder.cs +++ b/Marco.Pms.Services/Service/StartupDataSeeder.cs @@ -4,134 +4,211 @@ using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Roles; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; // For configuration +using System.Linq.Expressions; namespace Marco.Pms.Services.Service { + // A configuration class to hold settings from appsettings.json + // This avoids hardcoding sensitive information. + public class SuperAdminSettings + { + public const string CONFIG_SECTION_NAME = "SuperAdminAccount"; + public string Email { get; set; } = "admin@marcoaiot.com"; + public string Password { get; set; } = "User@123"; + public string TenantId { get; set; } = "b3466e83-7e11-464c-b93a-daf047838b26"; + } + public class StartupUserSeeder : IHostedService { private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; - public StartupUserSeeder(IServiceProvider serviceProvider) + // Constants to avoid "magic strings" + private const string AdminJobRoleName = "Admin"; + private const string SuperUserRoleName = "Super User"; + + public StartupUserSeeder(IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; + _logger = logger; } public async Task StartAsync(CancellationToken cancellationToken) { + _logger.LogInformation("Starting database seeding process..."); + using var scope = _serviceProvider.CreateScope(); - var userManager = scope.ServiceProvider.GetRequiredService>(); - var dbContext = scope.ServiceProvider.GetRequiredService(); + var serviceProvider = scope.ServiceProvider; - var userEmail = "admin@marcoaiot.com"; + // Get services from the scoped provider + var userManager = serviceProvider.GetRequiredService>(); + var dbContext = serviceProvider.GetRequiredService(); + var adminSettings = serviceProvider.GetRequiredService>().Value; + var tenantId = Guid.Parse(adminSettings.TenantId); - var user = await userManager.FindByEmailAsync(userEmail); - var newUser = new ApplicationUser + // Use a database transaction to ensure all operations succeed or none do. + await using var transaction = await dbContext.Database.BeginTransactionAsync(cancellationToken); + + try { - UserName = userEmail, - Email = userEmail, - EmailConfirmed = true, - IsRootUser = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }; - var result = new IdentityResult(); + // 1. Seed the Application User (Super Admin) + var user = await SeedSuperAdminUserAsync(userManager, adminSettings, tenantId); + // 2. Seed the Job Role + var jobRole = await GetOrCreateAsync( + dbContext.JobRoles, + j => j.Name == AdminJobRoleName && j.TenantId == tenantId, + () => new JobRole + { + Name = AdminJobRoleName, + Description = "Administrator with full system access.", + TenantId = tenantId + }); + + // 3. Seed the Application Role + var appRole = await GetOrCreateAsync( + dbContext.ApplicationRoles, + a => a.Role == SuperUserRoleName && a.TenantId == tenantId, + () => new ApplicationRole + { + Role = SuperUserRoleName, + Description = "System role with all permissions.", + IsSystem = true, + TenantId = tenantId + }); + + // 4. Seed the Employee record linked to the user and job role + var employee = await GetOrCreateAsync( + dbContext.Employees, + e => e.Email == adminSettings.Email && e.TenantId == tenantId, + () => new Employee + { + ApplicationUserId = user.Id, + FirstName = "Admin", + LastName = "User", + Email = adminSettings.Email, + TenantId = tenantId, + PhoneNumber = "9876543210", + JobRoleId = jobRole.Id, + IsSystem = true, + JoiningDate = DateTime.UtcNow, + BirthDate = new DateTime(1970, 1, 1) + // Set other non-nullable fields to sensible defaults + }); + + // 5. Seed the Employee-Role Mapping + await GetOrCreateAsync( + dbContext.EmployeeRoleMappings, + erm => erm.EmployeeId == employee.Id && erm.RoleId == appRole.Id, + () => new EmployeeRoleMapping + { + EmployeeId = employee.Id, + RoleId = appRole.Id, + TenantId = tenantId, + IsEnabled = true + }); + + // 6. Seed Role Permissions (Efficiently) + await SeedRolePermissionsAsync(dbContext, appRole.Id); + + // All entities are now tracked by the DbContext. + // A single SaveChanges call is more efficient. + await dbContext.SaveChangesAsync(cancellationToken); + + // If all operations were successful, commit the transaction. + await transaction.CommitAsync(cancellationToken); + _logger.LogInformation("Database seeding process completed successfully."); + } + catch (Exception ex) + { + _logger.LogError(ex, "An error occurred during database seeding. Rolling back changes."); + await transaction.RollbackAsync(cancellationToken); + // Optionally re-throw or handle the exception as needed + throw; + } + } + + private async Task SeedSuperAdminUserAsync(UserManager userManager, SuperAdminSettings settings, Guid tenantId) + { + _logger.LogInformation("Seeding Super Admin user: {Email}", settings.Email); + var user = await userManager.FindByEmailAsync(settings.Email); if (user == null) { - result = await userManager.CreateAsync(newUser, "User@123"); - } - else - { - newUser = user; - } - - var jobRole = new JobRole - { - Id = Guid.Empty, - Name = "Admin", - Description = "Admin", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - }; - - if (!await dbContext.JobRoles.Where(j => j.Name == "Admin").AnyAsync()) - { - await dbContext.JobRoles.AddAsync(jobRole); - } - else - { - jobRole = await dbContext.JobRoles.Where(j => j.Name == "Admin").FirstOrDefaultAsync(); - } - var role = new ApplicationRole - { - Role = "Super User", - Description = "Super User", - IsSystem = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }; - if (!await dbContext.ApplicationRoles.Where(a => a.Role == "Super User").AnyAsync()) - { - await dbContext.ApplicationRoles.AddAsync(role); - } - else - { - role = await dbContext.ApplicationRoles.Where(a => a.Role == "Super User").FirstOrDefaultAsync(); - } - await dbContext.SaveChangesAsync(); - var employee = new Employee - { - ApplicationUserId = newUser.Id, - FirstName = "Admin", - LastName = "", - Email = userEmail, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - CurrentAddress = "", - BirthDate = Convert.ToDateTime("1965-04-20 10:11:17.588000"), - EmergencyPhoneNumber = "", - EmergencyContactPerson = "", - AadharNumber = "", - Gender = "", - MiddleName = "", - PanNumber = "", - PermanentAddress = "", - PhoneNumber = "9876543210", - Photo = null, // GetFileDetails(model.Photo).Result.FileData, - JobRoleId = jobRole != null ? jobRole.Id : Guid.Empty, - IsSystem = true, - JoiningDate = Convert.ToDateTime("2000-04-20 10:11:17.588000"), - }; - if ((!await dbContext.Employees.Where(e => e.Email == "admin@marcoaiot.com").AnyAsync()) && jobRole?.Id != Guid.Empty) - { - await dbContext.Employees.AddAsync(employee); - } - else - { - employee = await dbContext.Employees.Where(e => e.Email == "admin@marcoaiot.com").FirstOrDefaultAsync(); - } - await dbContext.SaveChangesAsync(); - if (!await dbContext.EmployeeRoleMappings.AnyAsync()) - { - await dbContext.EmployeeRoleMappings.AddAsync(new EmployeeRoleMapping + user = new ApplicationUser { - EmployeeId = employee?.Id ?? Guid.Empty, - IsEnabled = true, - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - RoleId = role?.Id ?? Guid.Empty - }); - } - if (!await dbContext.RolePermissionMappings.AnyAsync()) - { - List permissions = await dbContext.FeaturePermissions.ToListAsync(); - List rolesMapping = new List(); - foreach (var permission in permissions) + UserName = settings.Email, + Email = settings.Email, + EmailConfirmed = true, + IsRootUser = true, + TenantId = tenantId + }; + var result = await userManager.CreateAsync(user, settings.Password); + + if (!result.Succeeded) { - rolesMapping.Add(new RolePermissionMappings - { - ApplicationRoleId = role != null ? role.Id : Guid.Empty, - FeaturePermissionId = permission.Id - }); + // If user creation fails, it's a critical error. + var errors = string.Join(", ", result.Errors.Select(e => e.Description)); + _logger.LogError("Failed to create super admin user. Errors: {Errors}", errors); + throw new InvalidOperationException($"Failed to create super admin user: {errors}"); } - await dbContext.RolePermissionMappings.AddRangeAsync(rolesMapping); + _logger.LogInformation("Super Admin user created successfully."); } - await dbContext.SaveChangesAsync(); + else + { + _logger.LogInformation("Super Admin user already exists."); + } + return user; + } + + private async Task SeedRolePermissionsAsync(ApplicationDbContext dbContext, Guid superUserRoleId) + { + _logger.LogInformation("Seeding permissions for Super User role (ID: {RoleId})", superUserRoleId); + + var allPermissionIds = await dbContext.FeaturePermissions + .Select(p => p.Id) + .ToListAsync(); + + var permissionIdsFromDb = await dbContext.RolePermissionMappings + .Where(pm => pm.ApplicationRoleId == superUserRoleId) + .Select(pm => pm.FeaturePermissionId) + .ToListAsync(); // 1. Fetch data from DB into a List + + var existingPermissionIds = new HashSet(permissionIdsFromDb); // 2. Convert the List to a HashSet in memory + + var missingPermissionIds = allPermissionIds.Except(existingPermissionIds).ToList(); + + if (missingPermissionIds.Any()) + { + var newMappings = missingPermissionIds.Select(permissionId => new RolePermissionMappings + { + ApplicationRoleId = superUserRoleId, + FeaturePermissionId = permissionId + }); + + await dbContext.RolePermissionMappings.AddRangeAsync(newMappings); + _logger.LogInformation("Added {Count} new permission mappings to the Super User role.", missingPermissionIds.Count); + } + else + { + _logger.LogInformation("Super User role already has all available permissions."); + } + } + + /// + /// A generic helper to find an entity by a predicate or create, add, and return it if not found. + /// This promotes code reuse and makes the main logic cleaner. + /// + private async Task GetOrCreateAsync(DbSet dbSet, Expression> predicate, Func factory) where T : class + { + var entity = await dbSet.FirstOrDefaultAsync(predicate); + if (entity == null) + { + entity = factory(); + await dbSet.AddAsync(entity); + _logger.LogInformation("Creating new entity of type {EntityType}.", typeof(T).Name); + } + return entity; } public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; From 732182a67212f374f514aaa9b96b8facaea2ae78 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 17:26:09 +0530 Subject: [PATCH 069/125] Added new API to fetch basic employee list --- .../Controllers/EmployeeController.cs | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index d5d7f3d..c558de4 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -1,4 +1,5 @@ -using Marco.Pms.DataAccess.Data; +using AutoMapper; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Dtos.Employees; using Marco.Pms.Model.Employees; @@ -6,6 +7,7 @@ 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.Activities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Services.Hubs; using Marco.Pms.Services.Service; @@ -38,13 +40,14 @@ namespace MarcoBMS.Services.Controllers private readonly ILoggingService _logger; private readonly IHubContext _signalR; private readonly PermissionServices _permission; + private readonly IMapper _mapper; private readonly IProjectServices _projectServices; private readonly Guid tenantId; public EmployeeController(UserManager userManager, IEmailSender emailSender, ApplicationDbContext context, EmployeeHelper employeeHelper, UserHelper userHelper, IConfiguration configuration, ILoggingService logger, - IHubContext signalR, PermissionServices permission, IProjectServices projectServices) + IHubContext signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper) { _context = context; _userManager = userManager; @@ -56,6 +59,7 @@ namespace MarcoBMS.Services.Controllers _signalR = signalR; _permission = permission; _projectServices = projectServices; + _mapper = mapper; tenantId = _userHelper.GetTenantId(); } @@ -162,6 +166,30 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse(result, "Filter applied.", 200)); } + [HttpGet("basic")] + public async Task GetEmployeesByProjectBasic(Guid? projectId, [FromQuery] string? searchString) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var employeeQuery = _context.Employees.Where(e => e.TenantId == tenantId); + if (projectId != null && projectId == Guid.Empty) + { + var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); + if (!hasProjectPermission) + { + _logger.LogWarning("User {EmployeeId} attempts to get employee for project {ProjectId}, but not have access to the project", loggedInEmployee.Id, projectId); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User do not have access to view the list for this project", 403)); + } + var employeeIds = await _context.ProjectAllocations.Where(pa => pa.ProjectId == projectId && pa.IsActive && pa.TenantId == tenantId).Select(p => p.EmployeeId).ToListAsync(); + employeeQuery = employeeQuery.Where(e => employeeIds.Contains(e.Id)); + } + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchStringLower = searchString.ToLower(); + employeeQuery = employeeQuery.Where(e => (e.FirstName + " " + e.LastName).ToLower().Contains(searchStringLower)); + } + var response = await employeeQuery.Select(e => _mapper.Map(e)).ToListAsync(); + return Ok(ApiResponse.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200)); + } [HttpGet] [Route("search/{name}/{projectid?}")] public async Task SearchEmployee(string name, Guid? projectid) From e565a80f7ad837b892a9fd477ea3886931433529 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 18:56:19 +0530 Subject: [PATCH 070/125] Optimized the create tenant API --- .../Controllers/TenantController.cs | 150 ++++++++++++------ 1 file changed, 105 insertions(+), 45 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 0d177d3..b1b5c6f 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -3,6 +3,7 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; @@ -31,18 +32,22 @@ namespace Marco.Pms.Services.Controllers private readonly ILoggingService _logger; private readonly UserManager _userManager; private readonly IMapper _mapper; + private readonly UserHelper _userHelper; private readonly static Guid activeStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); + private readonly static string AdminRoleName = "Admin"; public TenantController(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, UserManager userManager, - IMapper mapper) + IMapper mapper, + UserHelper userHelper) { _dbContextFactory = dbContextFactory; _serviceScopeFactory = serviceScopeFactory; _logger = logger; _userManager = userManager; _mapper = mapper; + _userHelper = userHelper; } // GET: api/ [HttpGet] @@ -60,45 +65,65 @@ namespace Marco.Pms.Services.Controllers // POST api/ [HttpPost("create")] - public async Task Post([FromBody] CreateTenantDto model) + public async Task CreateTenant([FromBody] CreateTenantDto model) { using var scope = _serviceScopeFactory.CreateScope(); await using var _context = await _dbContextFactory.CreateDbContextAsync(); var _configuration = scope.ServiceProvider.GetRequiredService(); var _emailSender = scope.ServiceProvider.GetRequiredService(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); - var userHelper = scope.ServiceProvider.GetRequiredService(); - var loggedInEmployee = await userHelper.GetCurrentEmployeeAsync(); + _logger.LogInfo("Attempting to create a new tenant with organization name: {OrganizationName}", model.OragnizationName); - var permissionService = scope.ServiceProvider.GetRequiredService(); - var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - if (!hasPermission || !(loggedInEmployee.ApplicationUser?.IsRootUser ?? false)) + // 1. --- PERMISSION CHECK --- + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) { - _logger.LogWarning("User {EmployeeId} attmpted to create new tenant but not have permissions", loggedInEmployee.Id); - return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User don't have rights for this action", 403)); + // This case should ideally be handled by an [Authorize] attribute, but it's good practice to double-check. + return Unauthorized(ApiResponse.ErrorResponse("Authentication required", "User is not logged in.", 401)); } + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + if (!hasPermission || !(loggedInEmployee.ApplicationUser?.IsRootUser ?? false)) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to create a tenant without sufficient rights.", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + // 2. --- VALIDATION --- + // Check if a user with the same email already exists. var existingUser = await _userManager.FindByEmailAsync(model.Email); if (existingUser != null) { - _logger.LogWarning("User {EmployeeId} attempted to create tenant with email {Email} but already exists in database", loggedInEmployee.Id, model.Email); - return StatusCode(409, ApiResponse.ErrorResponse("Tenant can't be created", "User with same email already exists", 409)); + _logger.LogWarning("Tenant creation failed for email {Email}: an application user with this email already exists.", model.Email); + return StatusCode(409, ApiResponse.ErrorResponse("Tenant cannot be created", "A user with the specified email already exists.", 409)); } - var isTenantExists = await _context.Tenants.AnyAsync(t => t.TaxId != null && t.TaxId == model.TaxId); - if (isTenantExists) + + // Check if a tenant with the same Tax ID already exists. + if (!string.IsNullOrWhiteSpace(model.TaxId)) { - _logger.LogWarning("User {EmployeeId} attempted to create tenant with duplicate taxId", loggedInEmployee.Id); - return StatusCode(409, ApiResponse.ErrorResponse("Tenant can't be created", "User with same taxId already exists", 409)); + var isTenantExists = await _context.Tenants.AnyAsync(t => t.TaxId == model.TaxId); + if (isTenantExists) + { + _logger.LogWarning("Tenant creation failed for Tax ID {TaxId}: a tenant with this Tax ID already exists.", model.TaxId); + return StatusCode(409, ApiResponse.ErrorResponse("Tenant cannot be created", "A tenant with the same Tax ID already exists.", 409)); + } } + + // Check if the provided logo is a valid Base64 string. if (!string.IsNullOrWhiteSpace(model.logoImage) && !IsBase64String(model.logoImage)) { - _logger.LogWarning("User {EmployeeId} attempted to create tenant with Invalid logoImage", loggedInEmployee.Id); - return StatusCode(400, ApiResponse.ErrorResponse("Tenant can't be created", "User with same taxId already exists", 400)); + _logger.LogWarning("Tenant creation failed for user {EmployeeId}: The provided logo image was not a valid Base64 string.", loggedInEmployee.Id); + return StatusCode(400, ApiResponse.ErrorResponse("Tenant cannot be created", "The provided logo image is invalid.", 400)); } + + // 3. --- DATABASE TRANSACTION --- + // Use a transaction to ensure all related entities are created successfully or none at all. await using var transaction = await _context.Database.BeginTransactionAsync(); try { + // Create the primary Tenant entity var tenant = new Tenant { Name = model.OragnizationName, @@ -106,7 +131,7 @@ namespace Marco.Pms.Services.Controllers ContactNumber = model.ContactNumber, Email = model.Email, IndustryId = model.IndustryId, - TenantStatusId = activeStatus, + TenantStatusId = activeStatus, // Assuming 'activeStatus' is a defined variable or constant Description = model.Description, OnBoardingDate = model.OnBoardingDate, OragnizationSize = model.OragnizationSize, @@ -118,32 +143,42 @@ namespace Marco.Pms.Services.Controllers DomainName = model.DomainName, IsSuperTenant = false }; - _context.Tenants.Add(tenant); - await _context.SaveChangesAsync(); - var designation = new JobRole - { - Name = "Admin", - Description = "Root degination for tenant only", - TenantId = tenant.Id - }; + // Create the root ApplicationUser for the new tenant var applicationUser = new ApplicationUser { Email = model.Email, - UserName = model.Email, + UserName = model.Email, // Best practice to use email as username for simplicity IsRootUser = true, - EmailConfirmed = true, + EmailConfirmed = true, // Auto-confirming email as it's part of a trusted setup process TenantId = tenant.Id }; - _context.JobRoles.Add(designation); - var result = await _userManager.CreateAsync(applicationUser, "User@123"); + // SECURITY WARNING: Hardcoded passwords are a major vulnerability. + // Replace "User@123" with a securely generated random password. + var initialPassword = "User@123"; // TODO: Replace with password generation service. + var result = await _userManager.CreateAsync(applicationUser, initialPassword); + if (!result.Succeeded) - return BadRequest(ApiResponse.ErrorResponse("Failed to create user", result.Errors, 400)); + { + // If user creation fails, roll back the transaction immediately and return the errors. + await transaction.RollbackAsync(); + var errors = result.Errors.Select(e => e.Description).ToList(); + _logger.LogWarning("Failed to create ApplicationUser for tenant {TenantName}. Errors: {Errors}", model.OragnizationName, string.Join(", ", errors)); + return BadRequest(ApiResponse.ErrorResponse("Failed to create user", errors, 400)); + } - await _context.SaveChangesAsync(); + // Create the default "Admin" Job Role for the tenant + var adminJobRole = new JobRole + { + Name = AdminRoleName, + Description = "Default administrator role for the tenant.", + TenantId = tenant.Id + }; + _context.JobRoles.Add(adminJobRole); + // Create the primary Employee record and link it to the ApplicationUser and JobRole var employeeUser = new Employee { FirstName = model.FirstName, @@ -151,32 +186,57 @@ namespace Marco.Pms.Services.Controllers Email = model.Email, PhoneNumber = model.ContactNumber, ApplicationUserId = applicationUser.Id, - JobRole = designation, + JobRole = adminJobRole, // Link to the newly created role CurrentAddress = model.BillingAddress, TenantId = tenant.Id }; + _context.Employees.Add(employeeUser); + // Create a default project for the new tenant + var project = new Project + { + Name = $"{model.OragnizationName} - Default Project", + ProjectStatusId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"), // Consider using a constant for this GUID + ProjectAddress = model.BillingAddress, + ContactPerson = tenant.ContactName, + TenantId = tenant.Id + }; + _context.Projects.Add(project); + + // All entities are now added to the context. Save them all in a single database operation. await _context.SaveChangesAsync(); + // 4. --- POST-CREATION ACTIONS --- + // Generate a password reset token so the new user can set their own password. + _logger.LogInfo("User {Email} created. Sending password setup email.", applicationUser.Email); var token = await _userManager.GeneratePasswordResetTokenAsync(applicationUser); - var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}"; - if (employeeUser.FirstName != null) - { - await _emailSender.SendResetPasswordEmailOnRegister(applicationUser.Email, employeeUser.FirstName, resetLink); - } - var vm = _mapper.Map(tenant); - vm.CreatedBy = _mapper.Map(loggedInEmployee); - return Ok(tenant); + var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}&email={WebUtility.UrlEncode(applicationUser.Email)}"; + await _emailSender.SendResetPasswordEmailOnRegister(applicationUser.Email, employeeUser.FirstName, resetLink); + + // Map the result to a ViewModel for the API response. + var tenantVM = _mapper.Map(tenant); + tenantVM.CreatedBy = _mapper.Map(loggedInEmployee); + + // Commit the transaction as all operations were successful. + await transaction.CommitAsync(); + + _logger.LogInfo("Successfully created tenant {TenantId} for organization {OrganizationName}.", tenant.Id, tenant.Name); + return StatusCode(201, ApiResponse.SuccessResponse(tenantVM, "Tenant created successfully.", 201)); } catch (DbUpdateException dbEx) { - _logger.LogError(dbEx, "Database Exception occured while creating tenant"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500)); + await transaction.RollbackAsync(); + // Log the detailed database exception, including the inner exception if available. + _logger.LogError(dbEx, "A database update exception occurred while creating tenant for email {Email}. Inner Exception: {InnerException}", + model.Email, dbEx.InnerException?.Message ?? string.Empty); + return StatusCode(500, ApiResponse.ErrorResponse("An internal database error occurred.", ExceptionMapper(dbEx), 500)); } catch (Exception ex) { - _logger.LogError(ex, "Exception occured while creating tenant"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + await transaction.RollbackAsync(); + // Log the general exception. + _logger.LogError(ex, "An unexpected exception occurred while creating tenant for email {Email}.", model.Email); + return StatusCode(500, ApiResponse.ErrorResponse("An unexpected internal error occurred.", ExceptionMapper(ex), 500)); } } From 59459acaee1f260beb1cbb312f4c4aed9da25bf0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 31 Jul 2025 19:06:26 +0530 Subject: [PATCH 071/125] Only sending 10 employees if project Id is not provided --- Marco.Pms.Services/Controllers/EmployeeController.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index c558de4..21de1bf 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -171,7 +171,7 @@ namespace MarcoBMS.Services.Controllers { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var employeeQuery = _context.Employees.Where(e => e.TenantId == tenantId); - if (projectId != null && projectId == Guid.Empty) + if (projectId != null && projectId != Guid.Empty) { var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); if (!hasProjectPermission) @@ -187,6 +187,11 @@ namespace MarcoBMS.Services.Controllers var searchStringLower = searchString.ToLower(); employeeQuery = employeeQuery.Where(e => (e.FirstName + " " + e.LastName).ToLower().Contains(searchStringLower)); } + + if (string.IsNullOrWhiteSpace(searchString) && (projectId == null || projectId == Guid.Empty)) + { + employeeQuery = employeeQuery.Take(10); + } var response = await employeeQuery.Select(e => _mapper.Map(e)).ToListAsync(); return Ok(ApiResponse.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200)); } From 4808d6e77b0fc4adeda6c54bbbd567f9a1974d05 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 09:03:12 +0530 Subject: [PATCH 072/125] COrrected the seppling mistake for projectDetails API --- Marco.Pms.Services/Controllers/ProjectController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 796fd39..2c03d69 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -135,7 +135,7 @@ namespace MarcoBMS.Services.Controllers var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _projectServices.GetProjectDetailsAsync(id, tenantId, loggedInEmployee); + var response = await _projectServices.GetProjectDetailsOldAsync(id, tenantId, loggedInEmployee); return StatusCode(response.StatusCode, response); } From 0be021448d516948c4daa8c0ba496144f61dfbe1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 11:34:23 +0530 Subject: [PATCH 073/125] Added the date filert in mongo get function also --- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index fc670d6..5bdc934 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -52,12 +52,18 @@ namespace Marco.Pms.Helpers.CacheHelper if (expenseFilter != null) { - if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue) + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue && expenseFilter.IsTransactionDate == false) { filter &= filterBuilder.Gte(e => e.CreatedAt, expenseFilter.StartDate.Value.Date) & filterBuilder.Lte(e => e.CreatedAt, expenseFilter.EndDate.Value.Date.AddDays(1).AddTicks(-1)); } + if (expenseFilter.StartDate.HasValue && expenseFilter.EndDate.HasValue && expenseFilter.IsTransactionDate) + { + filter &= filterBuilder.Gte(e => e.TransactionDate, expenseFilter.StartDate.Value.Date) + & filterBuilder.Lte(e => e.TransactionDate, expenseFilter.EndDate.Value.Date.AddDays(1).AddTicks(-1)); + } + if (expenseFilter.ProjectIds?.Any() == true) { filter &= filterBuilder.In(e => e.Project.Id, expenseFilter.ProjectIds.Select(p => p.ToString()).ToList()); From 555bb8777928746fb13542e65a1b1297c37bcfe3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 12:15:24 +0530 Subject: [PATCH 074/125] Validating the null objects while saving the object in cache --- .../Helpers/CacheUpdateHelper.cs | 6 +- .../MappingProfiles/MappingProfile.cs | 2 +- Marco.Pms.Services/Service/ExpensesService.cs | 152 +++++++++++++++++- 3 files changed, 148 insertions(+), 12 deletions(-) diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 6aa5305..5db4d4c 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1146,9 +1146,9 @@ namespace Marco.Pms.Services.Helpers response.Project = projects.Where(p => p.Id == m.ProjectId).Select(p => _mapper.Map(p)).FirstOrDefault() ?? new ProjectBasicMongoDB(); response.PaidBy = paidBys.Where(p => p.Id == m.PaidById).Select(p => _mapper.Map(p)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); response.CreatedBy = createdBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); - response.ReviewedBy = reviewedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); - response.ApprovedBy = approvedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); - response.ProcessedBy = processedBy.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault() ?? new BasicEmployeeMongoDB(); + response.ReviewedBy = reviewedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); + response.ApprovedBy = approvedBys.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); + response.ProcessedBy = processedBy.Where(e => e.Id == m.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); response.Status = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map(s.Status)).FirstOrDefault() ?? new ExpensesStatusMasterMongoDB(); if (response.Status.Id == string.Empty) { diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index a4c58b3..3d1b90d 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -112,7 +112,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap() .ForMember( dest => dest.Id, - opt => opt.MapFrom(src => Guid.Parse(src.Id))) + opt => opt.MapFrom(src => string.IsNullOrWhiteSpace(src.Id) ? Guid.Empty : Guid.Parse(src.Id))) .ForMember( dest => dest.JobRoleId, opt => opt.MapFrom(src => Guid.Parse(src.JobRoleId ?? ""))); diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 03a22f6..5b2420c 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -5,6 +5,11 @@ using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.MongoDBModels; +using Marco.Pms.Model.MongoDBModels.Employees; +using Marco.Pms.Model.MongoDBModels.Expenses; +using Marco.Pms.Model.MongoDBModels.Masters; +using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; @@ -117,14 +122,13 @@ namespace Marco.Pms.Services.Service var (totalPages, totalCount, cacheList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, pageNumber, pageSize, expenseFilter, searchString); + // 3. --- Build Base Query and Apply Permissions --- + // Start with a base IQueryable. Filters will be chained onto this. + var expensesQuery = _context.Expenses + .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + if (cacheList == null) { - - // 3. --- Build Base Query and Apply Permissions --- - // Start with a base IQueryable. Filters will be chained onto this. - var expensesQuery = _context.Expenses - .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. - await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); // Apply permission-based filtering BEFORE any other filters or pagination. @@ -264,12 +268,14 @@ namespace Marco.Pms.Services.Service var expenseDetails = await _cache.GetExpenseDetailsById(id, tenantId); if (expenseDetails == null) { - expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId); - if (expenseDetails == null) + var expense = await _context.Expenses.AsNoTracking().FirstOrDefaultAsync(e => e.Id == id && e.TenantId == tenantId); + + if (expense == null) { _logger.LogWarning("User attempted to fetch expense details with ID {ExpenseId}, but not found in both database and cache", id); return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); } + expenseDetails = await GetAllExpnesRelatedTablesForSingle(expense, expense.TenantId); } var vm = _mapper.Map(expenseDetails); @@ -1182,6 +1188,136 @@ namespace Marco.Pms.Services.Service return expenseList; } + private async Task GetAllExpnesRelatedTablesForSingle(Expenses model, Guid tenantId) + { + var projectTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == model.ProjectId && p.TenantId == tenantId); + }); + var paidByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.PaidById && e.TenantId == tenantId); + }); + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.CreatedById && e.TenantId == tenantId); + }); + var reviewedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ReviewedById && e.TenantId == tenantId); + }); + var approvedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ApprovedById && e.TenantId == tenantId); + }); + var processedByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Include(e => e.JobRole).AsNoTracking().FirstOrDefaultAsync(e => e.Id == model.ProcessedById && e.TenantId == tenantId); + }); + var expenseTypeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == model.ExpensesTypeId && et.TenantId == tenantId); + }); + var paymentModeTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == model.PaymentModeId && pm.TenantId == tenantId); + }); + var statusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMapping + .Include(s => s.Status) + .Include(s => s.NextStatus) + .AsNoTracking() + .Where(es => es.StatusId == model.StatusId && es.Status != null) + .GroupBy(s => s.StatusId) + .Select(g => new + { + StatusId = g.Key, + Status = g.Select(s => s.Status).FirstOrDefault(), + NextStatus = g.Select(s => s.NextStatus).ToList() + }).FirstOrDefaultAsync(); + }); + var statusTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.ExpensesStatusMaster + .AsNoTracking() + .FirstOrDefaultAsync(es => es.Id == model.StatusId); + }); + var billAttachmentsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.BillAttachments + .Include(ba => ba.Document) + .AsNoTracking() + .Where(ba => ba.ExpensesId == model.Id && ba.Document != null) + .GroupBy(ba => ba.ExpensesId) + .Select(g => new + { + ExpensesId = g.Key, + Documents = g.Select(ba => new DocumentMongoDB + { + DocumentId = ba.Document!.Id.ToString(), + FileName = ba.Document.FileName, + ContentType = ba.Document.ContentType, + S3Key = ba.Document.S3Key, + ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key + }).ToList() + }) + .FirstOrDefaultAsync(); + }); + + // Await all prerequisite checks at once. + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, reviewedByTask, approvedByTask, + processedByTask, statusTask, billAttachmentsTask); + + var project = projectTask.Result; + var expenseType = expenseTypeTask.Result; + var paymentMode = paymentModeTask.Result; + var statusMapping = statusMappingTask.Result; + var paidBy = paidByTask.Result; + var createdBy = createdByTask.Result; + var reviewedBy = reviewedByTask.Result; + var approvedBy = approvedByTask.Result; + var processedBy = processedByTask.Result; + var billAttachment = billAttachmentsTask.Result; + + + var response = _mapper.Map(model); + + response.Project = _mapper.Map(project); + response.PaidBy = _mapper.Map(paidBy); + response.CreatedBy = _mapper.Map(createdBy); + response.ReviewedBy = _mapper.Map(reviewedBy); + response.ApprovedBy = _mapper.Map(approvedBy); + response.ProcessedBy = _mapper.Map(processedBy); + if (statusMapping != null) + { + response.Status = _mapper.Map(statusMapping.Status); + response.NextStatus = _mapper.Map>(statusMapping.NextStatus); + } + if (response.Status == null) + { + var status = statusTask.Result; + response.Status = _mapper.Map(status); + } + response.PaymentMode = _mapper.Map(paymentMode); + response.ExpensesType = _mapper.Map(expenseType); + if (billAttachment != null) response.Documents = billAttachment.Documents; + + return response; + + } + /// /// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string). From fdac2e06e171626bf436b6e13474727462ebda36 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 13:17:49 +0530 Subject: [PATCH 075/125] Added get tenant list API --- Marco.Pms.Model/Utilities/TenantFilter.cs | 12 + .../ViewModels/Tenant/TenantListVM.cs | 18 ++ .../Controllers/TenantController.cs | 229 ++++++++++++++++-- .../MappingProfiles/MappingProfile.cs | 11 + 4 files changed, 244 insertions(+), 26 deletions(-) create mode 100644 Marco.Pms.Model/Utilities/TenantFilter.cs create mode 100644 Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs diff --git a/Marco.Pms.Model/Utilities/TenantFilter.cs b/Marco.Pms.Model/Utilities/TenantFilter.cs new file mode 100644 index 0000000..2c0a477 --- /dev/null +++ b/Marco.Pms.Model/Utilities/TenantFilter.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.Utilities +{ + public class TenantFilter + { + public List? IndustryIds { get; set; } + public List? CreatedByIds { get; set; } + public List? TenantStatusIds { get; set; } + public List? References { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs new file mode 100644 index 0000000..10c6a89 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs @@ -0,0 +1,18 @@ +using Marco.Pms.Model.Master; + +namespace Marco.Pms.Model.ViewModels.Tenant +{ + public class TenantListVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string? DomainName { get; set; } + public string ContactName { get; set; } = string.Empty; + public string ContactNumber { get; set; } = string.Empty; + public string? logoImage { get; set; } // Base64 + public string? OragnizationSize { get; set; } + public Industry? Industry { get; set; } + public TenantStatus? TenantStatus { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index b1b5c6f..254a542 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Net; +using System.Text.Json; using System.Text.RegularExpressions; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -49,18 +50,154 @@ namespace Marco.Pms.Services.Controllers _mapper = mapper; _userHelper = userHelper; } - // GET: api/ - [HttpGet] - public IEnumerable Get() + #region =================================================================== Tenant APIs =================================================================== + + /// + /// Retrieves a paginated list of active tenants with optional filtering and searching. + /// + /// A string to search for across various tenant fields. + /// A JSON serialized string containing advanced filter criteria. + /// The number of records to return per page. + /// The page number to retrieve. + /// A paginated list of tenants matching the criteria. + [HttpGet("list")] + public async Task GetTenantList([FromQuery] string? searchString, string? filter, int pageSize = 20, int pageNumber = 1) { - return new string[] { "value1", "value2" }; + + using var scope = _serviceScopeFactory.CreateScope(); + + var _permissionService = scope.ServiceProvider.GetRequiredService(); + _logger.LogInfo("Attempting to fetch tenant list with pageNumber: {PageNumber} and pageSize: {PageSize}", pageNumber, pageSize); + + try + { + // --- 1. PERMISSION CHECK --- + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + // This case should be handled by the [Authorize] attribute. + // This check is a safeguard. + _logger.LogWarning("Authentication failed: No logged-in employee found."); + return StatusCode(403, ApiResponse.ErrorResponse("Authentication required", "User is not logged in.", 403)); + } + + // A root user should have access regardless of the specific permission. + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + + if (!hasPermission && !isRootUser) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + // --- 2. QUERY CONSTRUCTION --- + // Using a DbContext from the factory ensures a fresh context for this request. + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + // Start with a base IQueryable. Filters will be appended to this. + var tenantQuery = _context.Tenants.Where(t => t.IsActive); + + // Apply advanced filters from the JSON filter object. + var tenantFilter = TryDeserializeFilter(filter); + if (tenantFilter != null) + { + // Date range filtering + if (tenantFilter.StartDate.HasValue && tenantFilter.EndDate.HasValue) + { + // OPTIMIZATION: Avoid using .Date on the database column, as it can prevent index usage. + // This structure (`>= start` and `< end.AddDays(1)`) is index-friendly and correctly inclusive. + var endDateExclusive = tenantFilter.EndDate.Value.AddDays(1); + tenantQuery = tenantQuery.Where(t => t.OnBoardingDate >= tenantFilter.StartDate.Value && t.OnBoardingDate < endDateExclusive); + } + // List-based filtering + if (tenantFilter.IndustryIds?.Any() == true) + { + tenantQuery = tenantQuery.Where(t => t.IndustryId.HasValue && tenantFilter.IndustryIds.Contains(t.IndustryId.Value)); + } + if (tenantFilter.References?.Any() == true) + { + tenantQuery = tenantQuery.Where(t => tenantFilter.References.Contains(t.Reference)); + } + if (tenantFilter.TenantStatusIds?.Any() == true) + { + tenantQuery = tenantQuery.Where(t => tenantFilter.TenantStatusIds.Contains(t.TenantStatusId)); + } + if (tenantFilter.CreatedByIds?.Any() == true) + { + tenantQuery = tenantQuery.Where(t => t.CreatedById.HasValue && tenantFilter.CreatedByIds.Contains(t.CreatedById.Value)); + } + } + + // Apply free-text search string. + if (!string.IsNullOrWhiteSpace(searchString)) + { + // OPTIMIZATION: Do not use .ToLower() on the database columns (e.g., `t.Name.ToLower()`). + // This makes the query non-SARGable and kills performance by preventing index usage. + // This implementation relies on the database collation being case-insensitive (e.g., `SQL_Latin1_General_CP1_CI_AS` in SQL Server). + tenantQuery = tenantQuery.Where(t => + t.Name.Contains(searchString) || + t.ContactName.Contains(searchString) || + t.Email.Contains(searchString) || + t.ContactNumber.Contains(searchString) || + t.BillingAddress.Contains(searchString) || + (t.TaxId != null && t.TaxId.Contains(searchString)) || + (t.Description != null && t.Description.Contains(searchString)) || + (t.DomainName != null && t.DomainName.Contains(searchString)) + ); + } + + // --- 3. PAGINATION AND EXECUTION --- + // First, get the total count of records for pagination metadata. + // This executes a separate, efficient `COUNT(*)` query. + int totalRecords = await tenantQuery.CountAsync(); + int totalPages = (int)Math.Ceiling((double)totalRecords / pageSize); + + _logger.LogInfo("Found {TotalRecords} total tenants matching the query.", totalRecords); + + // Now, apply ordering and pagination to fetch only the data for the current page. + // This is efficient server-side pagination. + var tenantList = await tenantQuery + .Include(t => t.Industry) // Eager load related data to prevent N+1 queries. + .Include(t => t.TenantStatus) + .OrderByDescending(t => t.OnBoardingDate) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(); + + // Map the entities to a ViewModel/DTO for the response. + var vm = _mapper.Map>(tenantList); + + // --- 4. CONSTRUCT RESPONSE --- + var response = new + { + TotalCount = totalRecords, + TotalPages = totalPages, + CurrentPage = pageNumber, + PageSize = pageSize, + Filter = tenantFilter, // Return the applied filter for context on the client-side. + Data = vm + }; + + _logger.LogInfo("Successfully fetched {RecordCount} tenant records.", vm.Count); + return Ok(ApiResponse.SuccessResponse(response, $"{totalRecords} records of tenants fetched successfully", 200)); + } + catch (Exception ex) + { + // CRITICAL SECURITY FIX: Do not expose the exception details to the client. + // Log the full exception for debugging purposes. + _logger.LogError(ex, "An unhandled exception occurred while fetching the tenant list."); + + // Return a generic 500 Internal Server Error response. + return StatusCode(500, ApiResponse.ErrorResponse("An internal server error occurred.", "An unexpected error prevented the request from completing.", 500)); + } } // GET api//5 - [HttpGet("{id}")] - public string Get(int id) + [HttpGet("details/{id}")] + public async Task GetDetails(Guid id) { - return "value"; + return Ok(); } // POST api/ @@ -124,25 +261,13 @@ namespace Marco.Pms.Services.Controllers try { // Create the primary Tenant entity - var tenant = new Tenant - { - Name = model.OragnizationName, - ContactName = $"{model.FirstName} {model.LastName}", - ContactNumber = model.ContactNumber, - Email = model.Email, - IndustryId = model.IndustryId, - TenantStatusId = activeStatus, // Assuming 'activeStatus' is a defined variable or constant - Description = model.Description, - OnBoardingDate = model.OnBoardingDate, - OragnizationSize = model.OragnizationSize, - Reference = model.Reference, - CreatedById = loggedInEmployee.Id, - BillingAddress = model.BillingAddress, - TaxId = model.TaxId, - logoImage = model.logoImage, - DomainName = model.DomainName, - IsSuperTenant = false - }; + + var tenant = _mapper.Map(model); + + tenant.TenantStatusId = activeStatus; + tenant.CreatedById = loggedInEmployee.Id; + tenant.IsSuperTenant = false; + _context.Tenants.Add(tenant); // Create the root ApplicationUser for the new tenant @@ -253,6 +378,17 @@ namespace Marco.Pms.Services.Controllers } + #endregion + + #region =================================================================== Subscription APIs =================================================================== + + #endregion + + #region =================================================================== Subscription Plan APIs =================================================================== + + #endregion + + #region =================================================================== Helper Functions =================================================================== private static object ExceptionMapper(Exception ex) { @@ -298,5 +434,46 @@ namespace Marco.Pms.Services.Controllers return false; } } + + private TenantFilter? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + TenantFilter? 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; + } + + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 244c2d8..7d9e269 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.Dtos.Project; +using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Master; @@ -18,6 +19,16 @@ namespace Marco.Pms.Services.MappingProfiles { #region ======================================================= Employees ======================================================= CreateMap(); + CreateMap(); + CreateMap() + .ForMember( + dest => dest.ContactName, + opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}") + ) + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.OragnizationName) + ); #endregion #region ======================================================= Projects ======================================================= From eaf6284a57db9566519550eb01491cf197c2239f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 16:18:17 +0530 Subject: [PATCH 076/125] Order nextStatus by it name --- Marco.Pms.Services/Helpers/CacheUpdateHelper.cs | 4 ++-- Marco.Pms.Services/Service/ExpensesService.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 5db4d4c..cbd7b6e 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -1090,7 +1090,7 @@ namespace Marco.Pms.Services.Helpers { StatusId = g.Key, Status = g.Select(s => s.Status).FirstOrDefault(), - NextStatus = g.Select(s => s.NextStatus).ToList() + NextStatus = g.Select(s => s.NextStatus).OrderBy(s => s!.Name).ToList() }).ToListAsync(); }); var statusTask = Task.Run(async () => @@ -1220,7 +1220,7 @@ namespace Marco.Pms.Services.Helpers { StatusId = g.Key, Status = g.Select(s => s.Status).FirstOrDefault(), - NextStatus = g.Select(s => s.NextStatus).ToList() + NextStatus = g.Select(s => s.NextStatus).OrderBy(s => s!.Name).ToList() }).FirstOrDefaultAsync(); }); var statusTask = Task.Run(async () => diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 5b2420c..cf91fed 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1120,7 +1120,7 @@ namespace Marco.Pms.Services.Service { StatusId = g.Key, Status = g.Select(s => s.Status).FirstOrDefault(), - NextStatus = g.Select(s => s.NextStatus).ToList() + NextStatus = g.Select(s => s.NextStatus).OrderBy(s => s!.Name).ToList() }).ToListAsync(); }); var statusTask = Task.Run(async () => @@ -1243,7 +1243,7 @@ namespace Marco.Pms.Services.Service { StatusId = g.Key, Status = g.Select(s => s.Status).FirstOrDefault(), - NextStatus = g.Select(s => s.NextStatus).ToList() + NextStatus = g.Select(s => s.NextStatus).OrderBy(s => s!.Name).ToList() }).FirstOrDefaultAsync(); }); var statusTask = Task.Run(async () => From 8210e250a146a46218b3d23b4f3ec6a636186dbe Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 16:22:12 +0530 Subject: [PATCH 077/125] added new parameter tenant table --- ..._New_Parameter_In_Tenant_Table.Designer.cs | 3550 +++++++++++++++++ ...253_Added_New_Parameter_In_Tenant_Table.cs | 37 + .../ApplicationDbContextModelSnapshot.cs | 3 + .../Dtos/Tenant/CreateTenantDto.cs | 1 + Marco.Pms.Model/Entitlements/Tenant.cs | 1 + .../Controllers/RolesController.cs | 36 +- .../Controllers/TenantController.cs | 75 +- 7 files changed, 3685 insertions(+), 18 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.Designer.cs new file mode 100644 index 0000000..ee2c6ec --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.Designer.cs @@ -0,0 +1,3550 @@ +// +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("20250801101253_Added_New_Parameter_In_Tenant_Table")] + partial class Added_New_Parameter_In_Tenant_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.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.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("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" + }); + }); + + 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.Entitlements.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("OragnizationSize") + .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), + OragnizationSize = "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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250801101253_Added_New_Parameter_In_Tenant_Table.cs b/Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.cs new file mode 100644 index 0000000..f3bd3ea --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250801101253_Added_New_Parameter_In_Tenant_Table.cs @@ -0,0 +1,37 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_New_Parameter_In_Tenant_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "OfficeNumber", + table: "Tenants", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.UpdateData( + table: "Tenants", + keyColumn: "Id", + keyValue: new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + column: "OfficeNumber", + value: null); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "OfficeNumber", + table: "Tenants"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index bdb6cd2..2e038ea 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1223,6 +1223,9 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); + b.Property("OfficeNumber") + .HasColumnType("longtext"); + b.Property("OnBoardingDate") .HasColumnType("datetime(6)"); diff --git a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs index 0d85b83..16db65b 100644 --- a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs @@ -11,6 +11,7 @@ public string? TaxId { get; set; } public string? logoImage { get; set; } public required string OragnizationName { get; set; } + public string? OfficeNumber { get; set; } public required string ContactNumber { get; set; } public required DateTime OnBoardingDate { get; set; } public required string OragnizationSize { get; set; } diff --git a/Marco.Pms.Model/Entitlements/Tenant.cs b/Marco.Pms.Model/Entitlements/Tenant.cs index 55b6c93..cb974a0 100644 --- a/Marco.Pms.Model/Entitlements/Tenant.cs +++ b/Marco.Pms.Model/Entitlements/Tenant.cs @@ -13,6 +13,7 @@ namespace Marco.Pms.Model.Entitlements public string? DomainName { get; set; } public string ContactName { get; set; } = string.Empty; public string ContactNumber { get; set; } = string.Empty; + public string? OfficeNumber { get; set; } public string BillingAddress { get; set; } = string.Empty; public string? TaxId { get; set; } public string? logoImage { get; set; } // Base64 diff --git a/Marco.Pms.Services/Controllers/RolesController.cs b/Marco.Pms.Services/Controllers/RolesController.cs index a67ecaf..54b826a 100644 --- a/Marco.Pms.Services/Controllers/RolesController.cs +++ b/Marco.Pms.Services/Controllers/RolesController.cs @@ -1,5 +1,4 @@ -using System.Data; -using Marco.Pms.DataAccess.Data; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Employees; using Marco.Pms.Model.Dtos.Roles; using Marco.Pms.Model.Employees; @@ -11,12 +10,13 @@ using Marco.Pms.Model.ViewModels; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Roles; using Marco.Pms.Services.Helpers; +using Marco.Pms.Services.Service; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using System.Data; #nullable disable namespace MarcoBMS.Services.Controllers { @@ -28,15 +28,15 @@ namespace MarcoBMS.Services.Controllers private readonly ApplicationDbContext _context; private readonly RolesHelper _rolesHelper; private readonly UserHelper _userHelper; - private readonly UserManager _userManager; + private readonly PermissionServices _permissionService; private readonly ILoggingService _logger; private readonly CacheUpdateHelper _cache; - public RolesController(UserManager userManager, ApplicationDbContext context, RolesHelper rolesHelper, UserHelper userHelper, ILoggingService logger, + public RolesController(PermissionServices permissionServices, ApplicationDbContext context, RolesHelper rolesHelper, UserHelper userHelper, ILoggingService logger, CacheUpdateHelper cache) { _context = context; - _userManager = userManager; + _permissionService = permissionServices; _rolesHelper = rolesHelper; _userHelper = userHelper; _logger = logger; @@ -213,12 +213,17 @@ namespace MarcoBMS.Services.Controllers } Guid TenantId = GetTenantId(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (createRoleDto.FeaturesPermission == null || (createRoleDto.FeaturesPermission != null && createRoleDto.FeaturesPermission.Count == 0)) { return BadRequest(ApiResponse.ErrorResponse("Feature Permission is required.", "Feature Permission is required.", 400)); } - + var hasManageMasterPermission = await _permissionService.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManageMasterPermission) + { + return StatusCode(403, ApiResponse.SuccessResponse("Access Denied", "User do not have permission for this action", 403)); + } bool roleExists = _context.ApplicationRoles .Any(r => r.TenantId == TenantId && r.Role.ToLower() == createRoleDto.Role.ToLower());// assuming role name is unique per tenant if (roleExists) @@ -228,14 +233,19 @@ namespace MarcoBMS.Services.Controllers ApplicationRole role = createRoleDto.ToApplicationRoleFromCreateDto(TenantId); _context.ApplicationRoles.Add(role); + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); foreach (var permission in createRoleDto.FeaturesPermission) { - var item = new RolePermissionMappings() { ApplicationRoleId = role.Id, FeaturePermissionId = permission.Id }; - bool assigned = _context.RolePermissionMappings.Any(c => c.ApplicationRoleId == role.Id && c.FeaturePermissionId == permission.Id); - if (permission.IsEnabled && !assigned) - _context.RolePermissionMappings.Add(item); - else - _context.RolePermissionMappings.Remove(item); + if (!hasPermission && + permission.Id != PermissionsMaster.ManageTenants) + { + var item = new RolePermissionMappings() { ApplicationRoleId = role.Id, FeaturePermissionId = permission.Id }; + bool assigned = _context.RolePermissionMappings.Any(c => c.ApplicationRoleId == role.Id && c.FeaturePermissionId == permission.Id); + if (permission.IsEnabled && !assigned) + _context.RolePermissionMappings.Add(item); + else + _context.RolePermissionMappings.Remove(item); + } } await _context.SaveChangesAsync(); diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 254a542..c3f2853 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -237,15 +237,39 @@ namespace Marco.Pms.Services.Controllers return StatusCode(409, ApiResponse.ErrorResponse("Tenant cannot be created", "A user with the specified email already exists.", 409)); } - // Check if a tenant with the same Tax ID already exists. - if (!string.IsNullOrWhiteSpace(model.TaxId)) + // Check if a tenant with the same Tax ID and Domain Name already exists. + var taxTask = Task.Run(async () => { - var isTenantExists = await _context.Tenants.AnyAsync(t => t.TaxId == model.TaxId); - if (isTenantExists) + if (!string.IsNullOrWhiteSpace(model.TaxId)) + { + return await _context.Tenants.AnyAsync(t => t.TaxId == model.TaxId); + + } + return false; + }); + var domainTask = Task.Run(async () => + { + if (!string.IsNullOrWhiteSpace(model.DomainName)) + { + return await _context.Tenants.AnyAsync(t => t.DomainName == model.DomainName); + + } + return false; + }); + + await Task.WhenAll(taxTask, domainTask); + + if (taxTask.Result || domainTask.Result) + { + if (!string.IsNullOrWhiteSpace(model.TaxId)) { _logger.LogWarning("Tenant creation failed for Tax ID {TaxId}: a tenant with this Tax ID already exists.", model.TaxId); - return StatusCode(409, ApiResponse.ErrorResponse("Tenant cannot be created", "A tenant with the same Tax ID already exists.", 409)); } + if (!string.IsNullOrWhiteSpace(model.DomainName)) + { + _logger.LogWarning("Tenant creation failed for Domain Name {DomainName}: a tenant with this Domain Name already exists.", model.DomainName); + } + return StatusCode(409, ApiResponse.ErrorResponse("Tenant cannot be created", "A tenant already exists.", 409)); } // Check if the provided logo is a valid Base64 string. @@ -317,6 +341,47 @@ namespace Marco.Pms.Services.Controllers }; _context.Employees.Add(employeeUser); + var applicationRole = new ApplicationRole + { + Role = "Super User", + Description = "Super User", + IsSystem = true, + TenantId = tenant.Id + }; + _context.ApplicationRoles.Add(applicationRole); + + var rolePermissionMappigs = new List { + new RolePermissionMappings + { + ApplicationRoleId = applicationRole.Id, + FeaturePermissionId = PermissionsMaster.ModifyTenant + }, + new RolePermissionMappings + { + ApplicationRoleId = applicationRole.Id, + FeaturePermissionId = PermissionsMaster.ViewTenant + }, + new RolePermissionMappings + { + ApplicationRoleId = applicationRole.Id, + FeaturePermissionId = PermissionsMaster.ManageMasters + }, + new RolePermissionMappings + { + ApplicationRoleId = applicationRole.Id, + FeaturePermissionId = PermissionsMaster.ViewMasters + } + }; + _context.RolePermissionMappings.AddRange(rolePermissionMappigs); + + _context.EmployeeRoleMappings.Add(new EmployeeRoleMapping + { + EmployeeId = employeeUser.Id, + RoleId = applicationRole.Id, + IsEnabled = true, + TenantId = tenant.Id + }); + // Create a default project for the new tenant var project = new Project { From 3915e9b9d043f3801c63d9230a7aa066a54a6d46 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 16:43:07 +0530 Subject: [PATCH 078/125] Correct Typo of OrganizationSize and OrganizationName --- .../Data/ApplicationDbContext.cs | 3 +- ...elling_Mistake_In_Tenant_Table.Designer.cs | 3550 +++++++++++++++++ ..._Fixed_Spelling_Mistake_In_Tenant_Table.cs | 28 + .../ApplicationDbContextModelSnapshot.cs | 288 +- .../Dtos/Tenant/CreateTenantDto.cs | 4 +- .../{Entitlements => TenantModels}/Tenant.cs | 4 +- Marco.Pms.Model/Utilities/TenantRelation.cs | 4 +- .../Controllers/TenantController.cs | 7 +- .../MappingProfiles/MappingProfile.cs | 4 +- Marco.Pms.Services/Service/ProjectServices.cs | 1 + 10 files changed, 3737 insertions(+), 156 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.cs rename Marco.Pms.Model/{Entitlements => TenantModels}/Tenant.cs (93%) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 6a2de2b..6a26c54 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -10,6 +10,7 @@ using Marco.Pms.Model.Mail; using Marco.Pms.Model.Master; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; +using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.Utilities; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; @@ -130,7 +131,7 @@ namespace Marco.Pms.DataAccess.Data new Tenant { Id = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"), - OragnizationSize = "100-200", + OrganizationSize = "100-200", Email = "admin@marcoaiot.com", Name = "MarcoBMS", ContactName = "Admin", diff --git a/Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.Designer.cs new file mode 100644 index 0000000..f812501 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.Designer.cs @@ -0,0 +1,3550 @@ +// +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("20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table")] + partial class Fixed_Spelling_Mistake_In_Tenant_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.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.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("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" + }); + }); + + 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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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("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/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.cs b/Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.cs new file mode 100644 index 0000000..9680c8c --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250801111158_Fixed_Spelling_Mistake_In_Tenant_Table.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Fixed_Spelling_Mistake_In_Tenant_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "OragnizationSize", + table: "Tenants", + newName: "OrganizationSize"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "OrganizationSize", + table: "Tenants", + newName: "OragnizationSize"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 2e038ea..0493d55 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1179,102 +1179,6 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("RolePermissionMappings"); }); - modelBuilder.Entity("Marco.Pms.Model.Entitlements.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("OragnizationSize") - .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), - OragnizationSize = "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.Forum.TicketAttachment", b => { b.Property("Id") @@ -2400,6 +2304,102 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("JobRoles"); }); + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.Utilities.Inquiries", b => { b.Property("Id") @@ -2669,7 +2669,7 @@ namespace Marco.Pms.DataAccess.Migrations .WithMany() .HasForeignKey("ReportedById"); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2712,7 +2712,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2739,7 +2739,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2760,7 +2760,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2789,7 +2789,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2812,7 +2812,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2823,7 +2823,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2850,7 +2850,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2873,7 +2873,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2913,7 +2913,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2947,7 +2947,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -2991,7 +2991,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3025,7 +3025,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3066,7 +3066,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3091,7 +3091,7 @@ namespace Marco.Pms.DataAccess.Migrations .WithMany() .HasForeignKey("JobRoleId"); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3118,7 +3118,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3133,7 +3133,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3168,23 +3168,6 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired(); }); - modelBuilder.Entity("Marco.Pms.Model.Entitlements.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.Forum.TicketAttachment", b => { b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") @@ -3204,7 +3187,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3227,7 +3210,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3280,7 +3263,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3302,7 +3285,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3313,7 +3296,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3324,7 +3307,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3335,7 +3318,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3352,7 +3335,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3371,7 +3354,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3396,7 +3379,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3417,7 +3400,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3436,7 +3419,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3463,7 +3446,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", null) + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3472,7 +3455,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => { - b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3481,6 +3464,23 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Tenant"); }); + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) diff --git a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs index 16db65b..5726285 100644 --- a/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/CreateTenantDto.cs @@ -10,11 +10,11 @@ public required string BillingAddress { get; set; } public string? TaxId { get; set; } public string? logoImage { get; set; } - public required string OragnizationName { get; set; } + public required string OrganizationName { get; set; } public string? OfficeNumber { get; set; } public required string ContactNumber { get; set; } public required DateTime OnBoardingDate { get; set; } - public required string OragnizationSize { get; set; } + public required string OrganizationSize { get; set; } public required Guid IndustryId { get; set; } public required string Reference { get; set; } } diff --git a/Marco.Pms.Model/Entitlements/Tenant.cs b/Marco.Pms.Model/TenantModels/Tenant.cs similarity index 93% rename from Marco.Pms.Model/Entitlements/Tenant.cs rename to Marco.Pms.Model/TenantModels/Tenant.cs index cb974a0..d8b1567 100644 --- a/Marco.Pms.Model/Entitlements/Tenant.cs +++ b/Marco.Pms.Model/TenantModels/Tenant.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using System.ComponentModel.DataAnnotations.Schema; -namespace Marco.Pms.Model.Entitlements +namespace Marco.Pms.Model.TenantModel { public class Tenant { @@ -18,7 +18,7 @@ namespace Marco.Pms.Model.Entitlements public string? TaxId { get; set; } public string? logoImage { get; set; } // Base64 public DateTime OnBoardingDate { get; set; } - public string? OragnizationSize { get; set; } + public string? OrganizationSize { get; set; } public Guid? IndustryId { get; set; } [ForeignKey("IndustryId")] diff --git a/Marco.Pms.Model/Utilities/TenantRelation.cs b/Marco.Pms.Model/Utilities/TenantRelation.cs index fa41adf..76e6974 100644 --- a/Marco.Pms.Model/Utilities/TenantRelation.cs +++ b/Marco.Pms.Model/Utilities/TenantRelation.cs @@ -1,6 +1,6 @@ -using System.ComponentModel.DataAnnotations.Schema; -using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.TenantModel; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; namespace Marco.Pms.Model.Utilities { diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index c3f2853..0b53f80 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -5,6 +5,7 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; +using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Tenant; @@ -211,7 +212,7 @@ namespace Marco.Pms.Services.Controllers var _emailSender = scope.ServiceProvider.GetRequiredService(); var _permissionService = scope.ServiceProvider.GetRequiredService(); - _logger.LogInfo("Attempting to create a new tenant with organization name: {OrganizationName}", model.OragnizationName); + _logger.LogInfo("Attempting to create a new tenant with organization name: {OrganizationName}", model.OrganizationName); // 1. --- PERMISSION CHECK --- var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -314,7 +315,7 @@ namespace Marco.Pms.Services.Controllers // If user creation fails, roll back the transaction immediately and return the errors. await transaction.RollbackAsync(); var errors = result.Errors.Select(e => e.Description).ToList(); - _logger.LogWarning("Failed to create ApplicationUser for tenant {TenantName}. Errors: {Errors}", model.OragnizationName, string.Join(", ", errors)); + _logger.LogWarning("Failed to create ApplicationUser for tenant {TenantName}. Errors: {Errors}", model.OrganizationName, string.Join(", ", errors)); return BadRequest(ApiResponse.ErrorResponse("Failed to create user", errors, 400)); } @@ -385,7 +386,7 @@ namespace Marco.Pms.Services.Controllers // Create a default project for the new tenant var project = new Project { - Name = $"{model.OragnizationName} - Default Project", + Name = $"{model.OrganizationName} - Default Project", ProjectStatusId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"), // Consider using a constant for this GUID ProjectAddress = model.BillingAddress, ContactPerson = tenant.ContactName, diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 7d9e269..b1bfafa 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -2,10 +2,10 @@ using AutoMapper; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; -using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Projects; @@ -27,7 +27,7 @@ namespace Marco.Pms.Services.MappingProfiles ) .ForMember( dest => dest.Name, - opt => opt.MapFrom(src => src.OragnizationName) + opt => opt.MapFrom(src => src.OrganizationName) ); #endregion diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 9406ec9..45a7e83 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -7,6 +7,7 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Projects; From a7392a515d1236eb0358b115ff2d4597bdd166fb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 17:50:59 +0530 Subject: [PATCH 079/125] Added new logs in expense update API --- Marco.Pms.Services/Service/ExpensesService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index cf91fed..5d82745 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -824,12 +824,12 @@ namespace Marco.Pms.Services.Service if (existingExpense.StatusId != Draft && existingExpense.StatusId != RejectedByReviewer && existingExpense.StatusId != RejectedByApprover) { - _logger.LogWarning("User attempted to update expense with ID {ExpenseId}, but donot have status of DRAFT or REJECTED", loggedInEmployee.Id); + _logger.LogWarning("User attempted to update expense with ID {ExpenseId}, but donot have status of DRAFT or REJECTED, but is {StatusId}", existingExpense.Id, existingExpense.StatusId); return ApiResponse.ErrorResponse("Expense connot be updated", "Expense connot be updated", 400); } if (existingExpense.CreatedById != loggedInEmployee.Id) { - _logger.LogWarning("User attempted to update expense with ID {ExpenseId} which not created by them", loggedInEmployee.Id); + _logger.LogWarning("User attempted to update expense with ID {ExpenseId} which not created by them", existingExpense.Id); return ApiResponse.ErrorResponse("You donot have access to update this expense", "You donot have access to update this expense", 400); } From c8435020a4e3998029abd14803e44f039de10c55 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 1 Aug 2025 18:22:31 +0530 Subject: [PATCH 080/125] Chnaged the function to chek if base64 is valid or not --- .../Controllers/TenantController.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 0b53f80..a922832 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -18,7 +18,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Net; using System.Text.Json; -using System.Text.RegularExpressions; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -243,7 +242,8 @@ namespace Marco.Pms.Services.Controllers { if (!string.IsNullOrWhiteSpace(model.TaxId)) { - return await _context.Tenants.AnyAsync(t => t.TaxId == model.TaxId); + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Tenants.AnyAsync(t => t.TaxId == model.TaxId); } return false; @@ -252,7 +252,8 @@ namespace Marco.Pms.Services.Controllers { if (!string.IsNullOrWhiteSpace(model.DomainName)) { - return await _context.Tenants.AnyAsync(t => t.DomainName == model.DomainName); + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Tenants.AnyAsync(t => t.DomainName == model.DomainName); } return false; @@ -474,29 +475,40 @@ namespace Marco.Pms.Services.Controllers private bool IsBase64String(string? input) { if (string.IsNullOrWhiteSpace(input)) + { return false; + } - // Normalize string - input = input.Trim(); + string base64Data = input; + const string dataUriMarker = "base64,"; + int markerIndex = input.IndexOf(dataUriMarker, StringComparison.Ordinal); - // Length must be multiple of 4 - if (input.Length % 4 != 0) - return false; - - // Valid Base64 characters with correct padding - var base64Regex = new Regex(@"^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"); - if (!base64Regex.IsMatch(input)) + // If the marker is found, extract the actual Base64 data + if (markerIndex >= 0) + { + base64Data = input.Substring(markerIndex + dataUriMarker.Length); + } + + // Now, validate the extracted payload + base64Data = base64Data.Trim(); + + // Check for valid length (must be a multiple of 4) and non-empty + if (base64Data.Length == 0 || base64Data.Length % 4 != 0) + { return false; + } + // The most reliable test is to simply try to convert it. + // The .NET converter is strict and will throw a FormatException + // for invalid characters or incorrect padding. try { - // Decode and re-encode to confirm validity - var bytes = Convert.FromBase64String(input); - var reEncoded = Convert.ToBase64String(bytes); - return input == reEncoded; + Convert.FromBase64String(base64Data); + return true; } - catch + catch (FormatException) { + // The string is not a valid Base64 payload. return false; } } From 001bb6447d74a077362666282129e975b5df90dc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 2 Aug 2025 09:45:56 +0530 Subject: [PATCH 081/125] corrected the typo --- Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs index 017ed1d..b1ee0e6 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantVM.cs @@ -16,7 +16,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant public string? TaxId { get; set; } public string? logoImage { get; set; } // Base64 public DateTime OnBoardingDate { get; set; } - public string? OragnizationSize { get; set; } + public string? OrganizationSize { get; set; } public Industry? Industry { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } // EmployeeId public TenantStatus? TenantStatus { get; set; } From 2ccae935f36240e5af1ae22f99b81841f90ea65d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 2 Aug 2025 12:48:20 +0530 Subject: [PATCH 082/125] Sending the ExpenseLogs in Details API --- .../ViewModels/Expenses/ExpenseDetailsVM.cs | 1 + Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs | 12 ++++++++++++ Marco.Pms.Services/Controllers/EmployeeController.cs | 6 +----- Marco.Pms.Services/MappingProfiles/MappingProfile.cs | 1 + Marco.Pms.Services/Service/ExpensesService.cs | 3 +++ 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs index b777d13..174a53d 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseDetailsVM.cs @@ -27,6 +27,7 @@ namespace Marco.Pms.Model.ViewModels.Expenses public string Description { get; set; } = string.Empty; public string? Location { get; set; } public List Documents { get; set; } = new List(); + public List ExpenseLogs { get; set; } = new List(); public string? GSTNumber { get; set; } public int? NoOfPersons { get; set; } public bool IsActive { get; set; } = true; diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs new file mode 100644 index 0000000..6a05ff7 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs @@ -0,0 +1,12 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.Expenses +{ + public class ExpenseLogVM + { + public Guid Id { get; set; } + public BasicEmployeeVM? UpdatedBy { get; set; } + public string Action { get; set; } = string.Empty; + public string? Comment { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 21de1bf..cdc28ed 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -188,11 +188,7 @@ namespace MarcoBMS.Services.Controllers employeeQuery = employeeQuery.Where(e => (e.FirstName + " " + e.LastName).ToLower().Contains(searchStringLower)); } - if (string.IsNullOrWhiteSpace(searchString) && (projectId == null || projectId == Guid.Empty)) - { - employeeQuery = employeeQuery.Take(10); - } - var response = await employeeQuery.Select(e => _mapper.Map(e)).ToListAsync(); + var response = await employeeQuery.Take(10).Select(e => _mapper.Map(e)).ToListAsync(); return Ok(ApiResponse.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200)); } [HttpGet] diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 3d1b90d..a5fc445 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -123,6 +123,7 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap() diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 5d82745..fb639bc 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -321,6 +321,9 @@ namespace Marco.Pms.Services.Service response!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); } + var expenselogs = await _context.ExpenseLogs.Include(el => el.UpdatedBy).Where(el => el.ExpenseId == vm.Id).Select(el => _mapper.Map(el)).ToListAsync(); + + vm.ExpenseLogs = expenselogs; _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); From 2c94854f57a0573cfd1bf5b50cab0d75b2069de8 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 09:46:56 +0530 Subject: [PATCH 083/125] Showing the draft of self only --- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 7 +++++++ Marco.Pms.Services/Service/ExpensesService.cs | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 5bdc934..11e4554 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -47,6 +47,13 @@ namespace Marco.Pms.Helpers.CacheHelper { filter &= filterBuilder.Eq(e => e.CreatedBy.Id, loggedInEmployeeId.ToString()); } + else + { + filter &= filterBuilder.Or( + filterBuilder.Ne(e => e.CreatedBy.Id, loggedInEmployeeId.ToString()), + filterBuilder.Ne(e => e.Status.Id, "297e0d8f-f668-41b5-bfea-e03b354251c8") + ); + } // Apply filters diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index fb639bc..dd0bf95 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -139,6 +139,10 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); } + else + { + expensesQuery = expensesQuery.Where(e => e.CreatedById != loggedInEmployeeId || e.StatusId != Draft); + } if (expenseFilter != null) { From 30fa924d0f2a719e020783be408ca103c933a488 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 11:12:07 +0530 Subject: [PATCH 084/125] added the date in update logs --- ...Added_Updated_At_In_UpdateLogs.Designer.cs | 4437 +++++++++++++++++ ...04053705_Added_Updated_At_In_UpdateLogs.cs | 29 + .../ApplicationDbContextModelSnapshot.cs | 3 + Marco.Pms.Model/Expenses/ExpenseLog.cs | 1 + .../ViewModels/Expenses/ExpenseLogVM.cs | 1 + 5 files changed, 4471 insertions(+) create mode 100644 Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.Designer.cs new file mode 100644 index 0000000..5b67b33 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.Designer.cs @@ -0,0 +1,4437 @@ +// +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("20250804053705_Added_Updated_At_In_UpdateLogs")] + partial class Added_Updated_At_In_UpdateLogs + { + /// + 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.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.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("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("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.Entitlements.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactName") + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OragnizationSize") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OragnizationSize = "100-200" + }); + }); + + 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.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("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" + }); + }); + + 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" + }); + }); + + 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.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Document", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.Navigation("Industry"); + }); + + 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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.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.Entitlements.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + 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/20250804053705_Added_Updated_At_In_UpdateLogs.cs b/Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.cs new file mode 100644 index 0000000..0a60584 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804053705_Added_Updated_At_In_UpdateLogs.cs @@ -0,0 +1,29 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_Updated_At_In_UpdateLogs : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "UpdateAt", + table: "ExpenseLogs", + type: "datetime(6)", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "UpdateAt", + table: "ExpenseLogs"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 6953947..98a3e93 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1311,6 +1311,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("TenantId") .HasColumnType("char(36)"); + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + b.Property("UpdatedById") .HasColumnType("char(36)"); diff --git a/Marco.Pms.Model/Expenses/ExpenseLog.cs b/Marco.Pms.Model/Expenses/ExpenseLog.cs index e0eaa21..afee5fc 100644 --- a/Marco.Pms.Model/Expenses/ExpenseLog.cs +++ b/Marco.Pms.Model/Expenses/ExpenseLog.cs @@ -18,6 +18,7 @@ namespace Marco.Pms.Model.Expenses [ValidateNever] [ForeignKey("UpdatedById")] public Employee? UpdatedBy { get; set; } + public DateTime? UpdateAt { get; set; } public string Action { get; set; } = string.Empty; public string? Comment { get; set; } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs index 6a05ff7..4875eaf 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseLogVM.cs @@ -7,6 +7,7 @@ namespace Marco.Pms.Model.ViewModels.Expenses public Guid Id { get; set; } public BasicEmployeeVM? UpdatedBy { get; set; } public string Action { get; set; } = string.Empty; + public DateTime? UpdateAt { get; set; } public string? Comment { get; set; } } } From 53a2c5d87c792a86060d3b0a2178597bc9a3e5a3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 12:10:52 +0530 Subject: [PATCH 085/125] Added API to get plan List and add subscription to specific tenant --- Marco.Pms.CacheHelper/FeatureDetailsHelper.cs | 53 + .../Data/ApplicationDbContext.cs | 206 +- ...ed_Subscription_Related_Tables.Designer.cs | 3872 +++++++++++++++++ ...61007_Added_Subscription_Related_Tables.cs | 243 ++ ...ted_Typo_In_Subscription_Table.Designer.cs | 3872 +++++++++++++++++ ...00_Corrected_Typo_In_Subscription_Table.cs | 28 + .../ApplicationDbContextModelSnapshot.cs | 322 ++ .../Dtos/Tenant/AddSubscriptionDto.cs | 15 + .../Dtos/Tenant/AttendanceDetailsDto.cs | 10 + .../Dtos/Tenant/DirectoryDetailsDto.cs | 9 + .../Dtos/Tenant/ExpenseModuleDetailsDto.cs | 7 + .../Dtos/Tenant/FeatureDetailsDto.cs | 10 + .../Dtos/Tenant/ModulesDetailsDto.cs | 10 + .../Tenant/ProjectManagementDetailsDto.cs | 11 + .../Dtos/Tenant/ReportDetailsDto.cs | 9 + .../Dtos/Tenant/SubscriptionCheckListDto.cs | 8 + .../Dtos/Tenant/SubscriptionPlanDto.cs | 19 + .../Dtos/Tenant/SupportDetailsDto.cs | 9 + Marco.Pms.Model/Master/CurrencyMaster.cs | 11 + Marco.Pms.Model/Master/SubscriptionStatus.cs | 8 + .../MongoDBModel/AttendanceDetails.cs | 16 + .../MongoDBModel/DirectoryDetails.cs | 15 + .../MongoDBModel/ExpenseModuleDetails.cs | 13 + .../MongoDBModel/FeatureDetails.cs | 18 + .../MongoDBModel/ModulesDetails.cs | 16 + .../MongoDBModel/ProjectManagementDetails.cs | 17 + .../MongoDBModel/ReportDetails.cs | 15 + .../MongoDBModel/SubscriptionCheckList.cs | 14 + .../MongoDBModel/SupportDetails.cs | 15 + .../TenantModels/SubscriptionPlan.cs | 45 + .../TenantModels/TenantSubscriptions.cs | 46 + .../ViewModels/Tenant/SubscriptionPlanVM.cs | 18 + .../ViewModels/Tenant/TenantListVM.cs | 2 +- .../Controllers/TenantController.cs | 163 +- .../MappingProfiles/MappingProfile.cs | 15 + Marco.Pms.Services/Program.cs | 1 + 36 files changed, 9061 insertions(+), 100 deletions(-) create mode 100644 Marco.Pms.CacheHelper/FeatureDetailsHelper.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/FeatureDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/ModulesDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/ReportDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/SubscriptionCheckListDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/SupportDetailsDto.cs create mode 100644 Marco.Pms.Model/Master/CurrencyMaster.cs create mode 100644 Marco.Pms.Model/Master/SubscriptionStatus.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/FeatureDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/ModulesDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/ReportDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/SubscriptionCheckList.cs create mode 100644 Marco.Pms.Model/TenantModels/MongoDBModel/SupportDetails.cs create mode 100644 Marco.Pms.Model/TenantModels/SubscriptionPlan.cs create mode 100644 Marco.Pms.Model/TenantModels/TenantSubscriptions.cs create mode 100644 Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs diff --git a/Marco.Pms.CacheHelper/FeatureDetailsHelper.cs b/Marco.Pms.CacheHelper/FeatureDetailsHelper.cs new file mode 100644 index 0000000..da17988 --- /dev/null +++ b/Marco.Pms.CacheHelper/FeatureDetailsHelper.cs @@ -0,0 +1,53 @@ +using Marco.Pms.Model.TenantModels.MongoDBModel; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; + +namespace Marco.Pms.CacheHelper +{ + public class FeatureDetailsHelper + { + private readonly IMongoCollection _collection; + private readonly ILogger _logger; + public FeatureDetailsHelper(IConfiguration configuration, ILogger logger) + { + _logger = logger; + var connectionString = configuration["MongoDB:ModificationConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + var mongoDB = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + _collection = mongoDB.GetCollection("FeatureDetails"); + } + public async Task GetFeatureDetails(Guid Id) + { + try + { + var filter = Builders.Filter.Eq(e => e.Id, Id); + + var result = await _collection + .Find(filter) + .FirstOrDefaultAsync(); + return result; + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while fetchig features for subscription plan"); + return null; + } + } + public async Task AddFeatureDetails(FeatureDetails featureDetails) + { + try + { + await _collection.InsertOneAsync(featureDetails); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while fetchig features for subscription plan"); + return false; + } + } + + } +} diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 6a26c54..26c8d83 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -11,6 +11,7 @@ using Marco.Pms.Model.Master; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; using Marco.Pms.Model.TenantModel; +using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.Utilities; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; @@ -32,7 +33,10 @@ namespace Marco.Pms.DataAccess.Data public DbSet RefreshTokens { get; set; } public DbSet TenantStatus { get; set; } + public DbSet SubscriptionStatus { get; set; } public DbSet Tenants { get; set; } + public DbSet SubscriptionPlans { get; set; } + public DbSet TenantSubscriptions { get; set; } public DbSet ApplicationUsers { get; set; } public DbSet ActivityMasters { get; set; } public DbSet Projects { get; set; } @@ -54,6 +58,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet Modules { get; set; } public DbSet Features { get; set; } public DbSet FeaturePermissions { get; set; } + public DbSet CurrencyMaster { get; set; } public DbSet ApplicationRoles { get; set; } public DbSet JobRoles { get; set; } public DbSet RolePermissionMappings { get; set; } @@ -191,79 +196,11 @@ namespace Marco.Pms.DataAccess.Data ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") } - //, new Project - //{ - // Id = new Guid("3ef56a12-f5e5-4193-87d6-9e110ed10b86"), - // Name = "Project 2", - // ProjectAddress = "Project 2 Address", - // ContactPerson = "Project 2 Contact Person", - // StartDate = DateTime.ParseExact("2025-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // EndDate = DateTime.ParseExact("2026-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // ProjectStatusId = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - //}, new Project - //{ - // Id = new Guid("54d013e3-0a2b-48be-85c7-5ef03492a18c"), - // Name = "Project 3", - // ProjectAddress = "Project 3 Address", - // ContactPerson = "Project 3 Contact Person", - // StartDate = DateTime.ParseExact("2025-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // EndDate = DateTime.ParseExact("2026-04-20 10:11:17.588000", "yyyy-MM-dd HH:mm:ss.ffffff", CultureInfo.InvariantCulture), - // ProjectStatusId = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - //} ); var tenantId = _httpContextAccessor.HttpContext?.Items["TenantId"]?.ToString(); - //modelBuilder.Entity() - // .HasData( - // new ActivityMaster - // { - // Id = new Guid("4117b7de-ef6c-461f-a2c2-64eaac5f9a11"), - // ActivityName = "Core Cutting", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("1714f64d-7591-4419-bee5-118d21bb2855"), - // ActivityName = "Fabrication", - // UnitOfMeasurement = UnitOfMeasurement.Meter.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("b3f51a93-dde6-45f9-8b22-f1bf017a640b"), - // ActivityName = "Welding", - // UnitOfMeasurement = UnitOfMeasurement.Meter.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("53eedf44-4076-445f-be93-fedef17117e7"), - // ActivityName = "MS Support Fabrication", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("715b9ddb-d9e2-4afa-8987-d9918905cea4"), - // ActivityName = "MS Support Hanging", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("a3d191a7-a5aa-4dd8-a525-12c99263bbd6"), - // ActivityName = "Hydrant Volve", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // }, new ActivityMaster - // { - // Id = new Guid("c138a7de-713a-4bd4-8292-b0b265be77a3"), - // ActivityName = "Sprinkler Installation", - // UnitOfMeasurement = UnitOfMeasurement.Number.ToString(), - // TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - // } - // ); - modelBuilder.Entity().HasData( new Industry { Id = Guid.Parse("15436ee3-a650-469e-bfc2-59993f7514bb"), Name = "Information Technology (IT) Services" }, new Industry { Id = Guid.Parse("0a63e657-2c5f-49b5-854b-42c978293154"), Name = "Manufacturing & Production" }, @@ -483,34 +420,52 @@ namespace Marco.Pms.DataAccess.Data - modelBuilder.Entity().HasData(new Module - { - Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), - Name = "Project", - Description = "Project Module", - Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02" - }, - new Module - { - Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), - Name = "Employee", - Description = "Employee Module", - Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637" - }, - new Module - { - Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), - Name = "Masters", - Description = "Masters Module", - Key = "504ec132-e6a9-422f-8f85-050602cfce05" - }, - new Module - { - Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), - Name = "Tenant", - Description = "Tenant Module", - Key = "504ec132-e6a9-422f-8f85-050602cfce05" - }); + modelBuilder.Entity().HasData( + new SubscriptionStatus + { + Id = Guid.Parse("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new SubscriptionStatus + { + Id = Guid.Parse("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new SubscriptionStatus + { + Id = Guid.Parse("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + } + ); + modelBuilder.Entity().HasData( + new Module + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project", + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02" + }, + new Module + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee", + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637" + }, + new Module + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters", + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05" + }, + new Module + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant", + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05" + }); @@ -565,6 +520,65 @@ namespace Marco.Pms.DataAccess.Data //new FeaturePermission { Id = new Guid("6b1a6d97-a951-4de5-9b19-709bac7c4f18"), FeatureId = new Guid("660131a4-788c-4739-a082-cbbf7879cbf2"), IsEnabled = true, Name = "Manage Masters", Description = "" } ); + + modelBuilder.Entity().HasData( + new CurrencyMaster + { + Id = Guid.Parse("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + Symbol = "₹", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + Symbol = "$", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + Symbol = "€", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + Symbol = "£", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + Symbol = "¥", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + Symbol = "₽", + IsActive = true + }, + new CurrencyMaster + { + Id = Guid.Parse("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + Symbol = "¥", + IsActive = true + } + ); } } } diff --git a/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.Designer.cs new file mode 100644 index 0000000..387f384 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.Designer.cs @@ -0,0 +1,3872 @@ +// +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("20250804061007_Added_Subscription_Related_Tables")] + partial class Added_Subscription_Related_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.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.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("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" + }); + }); + + 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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.TenantModel.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.SubscriptionPlan", 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("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PriceHalfMonthly") + .HasColumnType("double"); + + b.Property("PriceMonthly") + .HasColumnType("double"); + + b.Property("PriceQuarterly") + .HasColumnType("double"); + + b.Property("PriceYearly") + .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("UpdatedById"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRemew") + .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("IsTrial") + .HasColumnType("tinyint(1)"); + + 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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.SubscriptionPlan", 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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("UpdatedBy"); + }); + + 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.SubscriptionPlan", "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.TenantModel.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/20250804061007_Added_Subscription_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs new file mode 100644 index 0000000..5de2a37 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs @@ -0,0 +1,243 @@ +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_Subscription_Related_Tables : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CurrencyMaster", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CurrencyCode = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CurrencyName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Symbol = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsActive = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CurrencyMaster", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SubscriptionStatus", + 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") + }, + constraints: table => + { + table.PrimaryKey("PK_SubscriptionStatus", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "SubscriptionPlans", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PlanName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + PriceQuarterly = table.Column(type: "double", nullable: false), + PriceMonthly = table.Column(type: "double", nullable: false), + PriceHalfMonthly = table.Column(type: "double", nullable: false), + PriceYearly = table.Column(type: "double", nullable: false), + TrialDays = table.Column(type: "int", nullable: false), + MaxUser = table.Column(type: "double", nullable: false), + MaxStorage = table.Column(type: "double", nullable: false), + FeaturesId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreateAt = table.Column(type: "datetime(6)", nullable: false), + UpdateAt = table.Column(type: "datetime(6)", nullable: true), + CurrencyId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + IsActive = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SubscriptionPlans", x => x.Id); + table.ForeignKey( + name: "FK_SubscriptionPlans_CurrencyMaster_CurrencyId", + column: x => x.CurrencyId, + principalTable: "CurrencyMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SubscriptionPlans_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SubscriptionPlans_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id"); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "TenantSubscriptions", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PlanId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + StartDate = table.Column(type: "datetime(6)", nullable: false), + EndDate = table.Column(type: "datetime(6)", nullable: false), + IsTrial = table.Column(type: "tinyint(1)", nullable: false), + StatusId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CurrencyId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + NextBillingDate = table.Column(type: "datetime(6)", nullable: false), + CancellationDate = table.Column(type: "datetime(6)", nullable: true), + AutoRemew = table.Column(type: "tinyint(1)", nullable: false), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + UpdateAt = table.Column(type: "datetime(6)", nullable: true), + CreatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_TenantSubscriptions", x => x.Id); + table.ForeignKey( + name: "FK_TenantSubscriptions_CurrencyMaster_CurrencyId", + column: x => x.CurrencyId, + principalTable: "CurrencyMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TenantSubscriptions_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TenantSubscriptions_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_TenantSubscriptions_SubscriptionPlans_PlanId", + column: x => x.PlanId, + principalTable: "SubscriptionPlans", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TenantSubscriptions_SubscriptionStatus_StatusId", + column: x => x.StatusId, + principalTable: "SubscriptionStatus", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_TenantSubscriptions_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "CurrencyMaster", + columns: new[] { "Id", "CurrencyCode", "CurrencyName", "IsActive", "Symbol" }, + values: new object[,] + { + { new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), "JPY", "Japanese Yen", true, "¥" }, + { new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), "USD", "US Dollar", true, "$" }, + { new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), "GBP", "Pound Sterling", true, "£" }, + { new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), "EUR", "Euro", true, "€" }, + { new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), "INR", "Indian Rupee", true, "₹" }, + { new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), "CNY", "Chinese Yuan (Renminbi)", true, "¥" }, + { new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), "RUB", "Russian Ruble", true, "₽" } + }); + + migrationBuilder.InsertData( + table: "SubscriptionStatus", + columns: new[] { "Id", "Name" }, + values: new object[,] + { + { new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), "Suspended" }, + { new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), "InActive" }, + { new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), "Active" } + }); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_CreatedById", + table: "SubscriptionPlans", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_CurrencyId", + table: "SubscriptionPlans", + column: "CurrencyId"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_UpdatedById", + table: "SubscriptionPlans", + column: "UpdatedById"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_CreatedById", + table: "TenantSubscriptions", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_CurrencyId", + table: "TenantSubscriptions", + column: "CurrencyId"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_PlanId", + table: "TenantSubscriptions", + column: "PlanId"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_StatusId", + table: "TenantSubscriptions", + column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_TenantId", + table: "TenantSubscriptions", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_TenantSubscriptions_UpdatedById", + table: "TenantSubscriptions", + column: "UpdatedById"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "TenantSubscriptions"); + + migrationBuilder.DropTable( + name: "SubscriptionPlans"); + + migrationBuilder.DropTable( + name: "SubscriptionStatus"); + + migrationBuilder.DropTable( + name: "CurrencyMaster"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.Designer.cs new file mode 100644 index 0000000..6794ae0 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.Designer.cs @@ -0,0 +1,3872 @@ +// +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("20250804063600_Corrected_Typo_In_Subscription_Table")] + partial class Corrected_Typo_In_Subscription_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.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.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("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" + }); + }); + + 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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.TenantModel.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.SubscriptionPlan", 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("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PriceHalfMonthly") + .HasColumnType("double"); + + b.Property("PriceMonthly") + .HasColumnType("double"); + + b.Property("PriceQuarterly") + .HasColumnType("double"); + + b.Property("PriceYearly") + .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("UpdatedById"); + + b.ToTable("SubscriptionPlans"); + }); + + 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("IsTrial") + .HasColumnType("tinyint(1)"); + + 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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.SubscriptionPlan", 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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("UpdatedBy"); + }); + + 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.SubscriptionPlan", "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.TenantModel.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/20250804063600_Corrected_Typo_In_Subscription_Table.cs b/Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.cs new file mode 100644 index 0000000..7926d9b --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804063600_Corrected_Typo_In_Subscription_Table.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Corrected_Typo_In_Subscription_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "AutoRemew", + table: "TenantSubscriptions", + newName: "AutoRenew"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "AutoRenew", + table: "TenantSubscriptions", + newName: "AutoRemew"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 0493d55..413e3d1 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1469,6 +1469,90 @@ namespace Marco.Pms.DataAccess.Migrations 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.Feature", b => { b.Property("Id") @@ -1716,6 +1800,38 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + 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") @@ -2400,6 +2516,138 @@ namespace Marco.Pms.DataAccess.Migrations }); }); + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", 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("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PriceHalfMonthly") + .HasColumnType("double"); + + b.Property("PriceMonthly") + .HasColumnType("double"); + + b.Property("PriceQuarterly") + .HasColumnType("double"); + + b.Property("PriceYearly") + .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("UpdatedById"); + + b.ToTable("SubscriptionPlans"); + }); + + 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("IsTrial") + .HasColumnType("tinyint(1)"); + + 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") @@ -3481,6 +3729,80 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("TenantStatus"); }); + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", 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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("UpdatedBy"); + }); + + 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.SubscriptionPlan", "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.TenantModel.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) diff --git a/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs new file mode 100644 index 0000000..eb9dca1 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs @@ -0,0 +1,15 @@ +using Marco.Pms.Model.TenantModels; + +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class AddSubscriptionDto + { + public Guid TenantId { get; set; } + public Guid PlanId { get; set; } + public Guid CurrencyId { get; set; } + public int MaxUsers { get; set; } + public PLAN_FREQUENCY Frequency { get; set; } + public bool IsTrial { get; set; } = false; + public bool AutoRenew { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs new file mode 100644 index 0000000..b6fb41c --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class AttendanceDetailsDto + { + public bool Enabled { get; set; } = false; + public bool ManualEntry { get; set; } = true; + public bool LocationTracking { get; set; } = true; + public bool ShiftManagement { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs new file mode 100644 index 0000000..168cc4f --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class DirectoryDetailsDto + { + public bool Enabled { get; set; } = false; + public int BucketLimit { get; set; } = 25; + public bool OrganizationChart { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs new file mode 100644 index 0000000..1966b78 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs @@ -0,0 +1,7 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class ExpenseModuleDetailsDto + { + public bool Enabled { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/FeatureDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/FeatureDetailsDto.cs new file mode 100644 index 0000000..7780331 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/FeatureDetailsDto.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class FeatureDetailsDto + { + public ModulesDetailsDto? Modules { get; set; } + public ReportDetailsDto? Reports { get; set; } + public SupportDetailsDto? Supports { get; set; } + public List SubscriptionCheckList { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/ModulesDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ModulesDetailsDto.cs new file mode 100644 index 0000000..5a828f9 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/ModulesDetailsDto.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class ModulesDetailsDto + { + public ProjectManagementDetailsDto? ProjectManagement { get; set; } + public AttendanceDetailsDto? Attendance { get; set; } + public DirectoryDetailsDto? Directory { get; set; } + public ExpenseModuleDetailsDto? Expense { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs new file mode 100644 index 0000000..cda923a --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class ProjectManagementDetailsDto + { + public bool Enabled { get; set; } = false; + public int MaxProject { get; set; } = 10; + public double MaxTaskPerProject { get; set; } = 100000000; + public bool GanttChart { get; set; } = false; + public bool ResourceAllocation { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/ReportDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ReportDetailsDto.cs new file mode 100644 index 0000000..e5ddfca --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/ReportDetailsDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class ReportDetailsDto + { + public bool BasicReports { get; set; } = true; + public bool CustomReports { get; set; } = false; + public List ExportData { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/SubscriptionCheckListDto.cs b/Marco.Pms.Model/Dtos/Tenant/SubscriptionCheckListDto.cs new file mode 100644 index 0000000..f5b7c1c --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/SubscriptionCheckListDto.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class SubscriptionCheckListDto + { + public string Name { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs new file mode 100644 index 0000000..1346d8c --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs @@ -0,0 +1,19 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class SubscriptionPlanDto + { + public Guid? Id { get; set; } + public required string PlanName { get; set; } + public required string Description { get; set; } + public double PriceQuarterly { get; set; } + public double PriceMonthly { get; set; } + public double PriceHalfMonthly { get; set; } + public double PriceYearly { get; set; } + public required int TrialDays { get; set; } + public required double MaxUser { get; set; } + public double MaxStorage { get; set; } + public required FeatureDetailsDto Features { get; set; } + public Guid CurrencyId { get; set; } + + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/SupportDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/SupportDetailsDto.cs new file mode 100644 index 0000000..c475773 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/SupportDetailsDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class SupportDetailsDto + { + public bool EmailSupport { get; set; } = true; + public bool PhoneSupport { get; set; } = false; + public bool PrioritySupport { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/Master/CurrencyMaster.cs b/Marco.Pms.Model/Master/CurrencyMaster.cs new file mode 100644 index 0000000..62f73d3 --- /dev/null +++ b/Marco.Pms.Model/Master/CurrencyMaster.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.Master +{ + public class CurrencyMaster + { + public Guid Id { get; set; } + public string CurrencyCode { get; set; } = string.Empty; + public string CurrencyName { get; set; } = string.Empty; + public string Symbol { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/Master/SubscriptionStatus.cs b/Marco.Pms.Model/Master/SubscriptionStatus.cs new file mode 100644 index 0000000..425915c --- /dev/null +++ b/Marco.Pms.Model/Master/SubscriptionStatus.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Master +{ + public class SubscriptionStatus + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs new file mode 100644 index 0000000..0c800c2 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class AttendanceDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool Enabled { get; set; } = false; + public bool ManualEntry { get; set; } = true; + public bool LocationTracking { get; set; } = true; + public bool ShiftManagement { get; set; } = false; + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs new file mode 100644 index 0000000..f0bf9d3 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class DirectoryDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool Enabled { get; set; } = false; + public int BucketLimit { get; set; } = 25; + public bool OrganizationChart { get; set; } = false; + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs new file mode 100644 index 0000000..210ae26 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs @@ -0,0 +1,13 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class ExpenseModuleDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool Enabled { get; set; } = false; + } +} diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/FeatureDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/FeatureDetails.cs new file mode 100644 index 0000000..52227c0 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/FeatureDetails.cs @@ -0,0 +1,18 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class FeatureDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public ModulesDetails? Modules { get; set; } + public ReportDetails? Reports { get; set; } + public SupportDetails? Supports { get; set; } + public List SubscriptionCheckList { get; set; } = new List(); + + + } +} diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ModulesDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ModulesDetails.cs new file mode 100644 index 0000000..7b682f2 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ModulesDetails.cs @@ -0,0 +1,16 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class ModulesDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public ProjectManagementDetails? ProjectManagement { get; set; } + public AttendanceDetails? Attendance { get; set; } + public DirectoryDetails? Directory { get; set; } + public ExpenseModuleDetails? Expense { get; set; } + } +} diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs new file mode 100644 index 0000000..7f843f8 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs @@ -0,0 +1,17 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class ProjectManagementDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool Enabled { get; set; } = false; + public int MaxProject { get; set; } = 10; + public double MaxTaskPerProject { get; set; } = 100000000; + public bool GanttChart { get; set; } = false; + public bool ResourceAllocation { get; set; } = false; + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ReportDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ReportDetails.cs new file mode 100644 index 0000000..4e08975 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ReportDetails.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class ReportDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool BasicReports { get; set; } = true; + public bool CustomReports { get; set; } = false; + public List ExportData { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/SubscriptionCheckList.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/SubscriptionCheckList.cs new file mode 100644 index 0000000..d8bc656 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/SubscriptionCheckList.cs @@ -0,0 +1,14 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class SubscriptionCheckList + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public string Name { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/SupportDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/SupportDetails.cs new file mode 100644 index 0000000..f7eba1b --- /dev/null +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/SupportDetails.cs @@ -0,0 +1,15 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.TenantModels.MongoDBModel +{ + public class SupportDetails + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + public bool EmailSupport { get; set; } = true; + public bool PhoneSupport { get; set; } = false; + public bool PrioritySupport { get; set; } = false; + } +} \ No newline at end of file diff --git a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs new file mode 100644 index 0000000..afc390a --- /dev/null +++ b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs @@ -0,0 +1,45 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Master; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.TenantModels +{ + public class SubscriptionPlan + { + public Guid Id { get; set; } + public string PlanName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public double PriceQuarterly { get; set; } + public double PriceMonthly { get; set; } + public double PriceHalfMonthly { get; set; } + public double PriceYearly { get; set; } + public int TrialDays { get; set; } = 30; + public double MaxUser { get; set; } = 10; + public double MaxStorage { get; set; } + public Guid FeaturesId { get; set; } + public DateTime CreateAt { get; set; } + public DateTime? UpdateAt { get; set; } + public Guid CurrencyId { get; set; } + + [ForeignKey("CurrencyId")] + [ValidateNever] + public CurrencyMaster? Currency { get; set; } + public Guid CreatedById { get; set; } + + [ForeignKey("CreatedById")] + [ValidateNever] + public Employee? CreatedBy { get; set; } + public Guid? UpdatedById { get; set; } + + [ForeignKey("UpdatedById")] + [ValidateNever] + public Employee? UpdatedBy { get; set; } + public bool IsActive { get; set; } = true; + } + + public enum PLAN_FREQUENCY + { + MONTHLY = 0, QUARTERLY = 1, HALF_MONTHLY = 2, YEARLY = 3 + } +} diff --git a/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs b/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs new file mode 100644 index 0000000..b98164f --- /dev/null +++ b/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs @@ -0,0 +1,46 @@ +using Marco.Pms.Model.Employees; +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.TenantModels +{ + public class TenantSubscriptions : TenantRelation + { + public Guid Id { get; set; } + public Guid PlanId { get; set; } + + [ForeignKey("PlanId")] + [ValidateNever] + public SubscriptionPlan? Plan { get; set; } + public DateTime StartDate { get; set; } + public DateTime EndDate { get; set; } + public bool IsTrial { get; set; } + public Guid StatusId { get; set; } + + [ForeignKey("StatusId")] + [ValidateNever] + public SubscriptionStatus? Status { get; set; } + public Guid CurrencyId { get; set; } + + [ForeignKey("CurrencyId")] + [ValidateNever] + public CurrencyMaster? Currency { get; set; } + public DateTime NextBillingDate { get; set; } + public DateTime? CancellationDate { get; set; } + public bool AutoRenew { get; set; } = true; + public DateTime CreatedAt { get; set; } + public DateTime? UpdateAt { get; set; } + public Guid CreatedById { get; set; } + + [ForeignKey("CreatedById")] + [ValidateNever] + public Employee? CreatedBy { get; set; } + public Guid? UpdatedById { get; set; } + + [ForeignKey("UpdatedById")] + [ValidateNever] + public Employee? UpdatedBy { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs new file mode 100644 index 0000000..6d72560 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs @@ -0,0 +1,18 @@ +using Marco.Pms.Model.Master; +using Marco.Pms.Model.TenantModels.MongoDBModel; + +namespace Marco.Pms.Model.ViewModels.Tenant +{ + public class SubscriptionPlanVM + { + public Guid Id { get; set; } + public string? PlanName { get; set; } + public string? Description { get; set; } + public double? Price { get; set; } + public int TrialDays { get; set; } + public double MaxUser { get; set; } + public double MaxStorage { get; set; } + public FeatureDetails? Features { get; set; } + public CurrencyMaster? Currency { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs index 10c6a89..e3348b1 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantListVM.cs @@ -11,7 +11,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant public string ContactName { get; set; } = string.Empty; public string ContactNumber { get; set; } = string.Empty; public string? logoImage { get; set; } // Base64 - public string? OragnizationSize { get; set; } + public string? OrganizationSize { get; set; } public Industry? Industry { get; set; } public TenantStatus? TenantStatus { get; set; } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index a922832..6a7bbaf 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Marco.Pms.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; @@ -6,6 +7,8 @@ using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; using Marco.Pms.Model.TenantModel; +using Marco.Pms.Model.TenantModels; +using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Tenant; @@ -34,14 +37,18 @@ namespace Marco.Pms.Services.Controllers private readonly UserManager _userManager; private readonly IMapper _mapper; private readonly UserHelper _userHelper; + private readonly FeatureDetailsHelper _featureDetailsHelper; + private readonly static Guid activeStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); + private readonly static Guid activePlanStatus = Guid.Parse("cd3a68ea-41fd-42f0-bd0c-c871c7337727"); private readonly static string AdminRoleName = "Admin"; public TenantController(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, UserManager userManager, IMapper mapper, - UserHelper userHelper) + UserHelper userHelper, + FeatureDetailsHelper featureDetailsHelper) { _dbContextFactory = dbContextFactory; _serviceScopeFactory = serviceScopeFactory; @@ -49,6 +56,7 @@ namespace Marco.Pms.Services.Controllers _userManager = userManager; _mapper = mapper; _userHelper = userHelper; + _featureDetailsHelper = featureDetailsHelper; } #region =================================================================== Tenant APIs =================================================================== @@ -85,7 +93,7 @@ namespace Marco.Pms.Services.Controllers var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - if (!hasPermission && !isRootUser) + if (!hasPermission || !isRootUser) { _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); @@ -336,6 +344,7 @@ namespace Marco.Pms.Services.Controllers LastName = model.LastName, Email = model.Email, PhoneNumber = model.ContactNumber, + JoiningDate = model.OnBoardingDate, ApplicationUserId = applicationUser.Id, JobRole = adminJobRole, // Link to the newly created role CurrentAddress = model.BillingAddress, @@ -387,9 +396,11 @@ namespace Marco.Pms.Services.Controllers // Create a default project for the new tenant var project = new Project { - Name = $"{model.OrganizationName} - Default Project", + Name = "Default Project", ProjectStatusId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"), // Consider using a constant for this GUID ProjectAddress = model.BillingAddress, + StartDate = model.OnBoardingDate, + EndDate = DateTime.MaxValue, ContactPerson = tenant.ContactName, TenantId = tenant.Id }; @@ -449,10 +460,156 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription APIs =================================================================== + [HttpPost("add-subscription")] + public async Task AddSubscription(AddSubscriptionDto model) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScopeFactory.CreateScope(); + + var _permissionService = scope.ServiceProvider.GetRequiredService(); + + // A root user should have access regardless of the specific permission. + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + + if (!hasPermission || !isRootUser) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + var tenantSubscription = new TenantSubscriptions + { + TenantId = model.TenantId, + PlanId = model.PlanId, + StatusId = activePlanStatus, + CreatedAt = DateTime.UtcNow, + CreatedById = loggedInEmployee.Id, + CurrencyId = model.CurrencyId, + IsTrial = model.IsTrial, + StartDate = DateTime.UtcNow, + AutoRenew = model.AutoRenew + }; + switch (model.Frequency) + { + case PLAN_FREQUENCY.MONTHLY: + tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(1); + tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(1); + break; + case PLAN_FREQUENCY.QUARTERLY: + tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(3); + tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(3); + break; + case PLAN_FREQUENCY.HALF_MONTHLY: + tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(6); + tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(6); + break; + case PLAN_FREQUENCY.YEARLY: + tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(12); + tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(12); + break; + } + _context.TenantSubscriptions.Add(tenantSubscription); + await _context.SaveChangesAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); + } + #endregion #region =================================================================== Subscription Plan APIs =================================================================== + [HttpGet("list/subscription-plan")] + public async Task GetSubscriptionPlanList([FromQuery] int frequency) + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + var plans = await _context.SubscriptionPlans.Include(s => s.Currency).ToListAsync(); + + var vm = await Task.WhenAll(plans.Select(async p => + { + var response = _mapper.Map(p); + switch (frequency) + { + case 0: + response.Price = p.PriceMonthly; + break; + case 1: + response.Price = p.PriceMonthly; + break; + case 2: + response.Price = p.PriceHalfMonthly; + break; + case 3: + response.Price = p.PriceYearly; + break; + } + response.Features = await _featureDetailsHelper.GetFeatureDetails(p.FeaturesId); + return response; + }).ToList()); + + return Ok(ApiResponse.SuccessResponse(vm, "List of plans fetched successfully", 200)); + } + + [HttpPost("create/subscription-plan")] + public async Task CreateSubscriptionPlan([FromBody] SubscriptionPlanDto model) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScopeFactory.CreateScope(); + + var _permissionService = scope.ServiceProvider.GetRequiredService(); + + // A root user should have access regardless of the specific permission. + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + + if (!hasPermission || !isRootUser) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.CurrencyId); + if (currencyMaster == null) + { + return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); + } + + var plan = _mapper.Map(model); + var features = _mapper.Map(model.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + + + plan.FeaturesId = features.Id; + plan.CreatedById = loggedInEmployee.Id; + plan.CreateAt = DateTime.UtcNow; + + _context.SubscriptionPlans.Add(plan); + try + { + await _context.SaveChangesAsync(); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while saving subscription plan"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500)); + } + + var response = _mapper.Map(plan); + response.Features = features; + response.Currency = currencyMaster; + + return StatusCode(201, ApiResponse.SuccessResponse(response, "Plan Created Successfully", 201)); + } #endregion #region =================================================================== Helper Functions =================================================================== diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index b1bfafa..1dd0d96 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -6,6 +6,8 @@ using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; using Marco.Pms.Model.Projects; using Marco.Pms.Model.TenantModel; +using Marco.Pms.Model.TenantModels; +using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Projects; @@ -29,6 +31,19 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Name, opt => opt.MapFrom(src => src.OrganizationName) ); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap(); + #endregion #region ======================================================= Projects ======================================================= diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 5549702..4b99cb8 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -183,6 +183,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion #region Cache Services From c708fa1ea18cb149b7eb9776d8c6528caf48b76b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 12:16:40 +0530 Subject: [PATCH 086/125] Crrocted the typo in SubScription Plans --- ...Typo_In_SubscriptionPlan_Table.Designer.cs | 3872 +++++++++++++++++ ...orrected_Typo_In_SubscriptionPlan_Table.cs | 28 + .../ApplicationDbContextModelSnapshot.cs | 2 +- .../TenantModels/SubscriptionPlan.cs | 2 +- .../Controllers/TenantController.cs | 2 +- 5 files changed, 3903 insertions(+), 3 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.cs diff --git a/Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.Designer.cs new file mode 100644 index 0000000..bd99086 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.Designer.cs @@ -0,0 +1,3872 @@ +// +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("20250804064532_Corrected_Typo_In_SubscriptionPlan_Table")] + partial class Corrected_Typo_In_SubscriptionPlan_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.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.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("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" + }); + }); + + 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.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.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("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("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.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + 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 = "#6c757d", + 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.TenantModel.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.SubscriptionPlan", 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("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PriceHalfYearly") + .HasColumnType("double"); + + b.Property("PriceMonthly") + .HasColumnType("double"); + + b.Property("PriceQuarterly") + .HasColumnType("double"); + + b.Property("PriceYearly") + .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("UpdatedById"); + + b.ToTable("SubscriptionPlans"); + }); + + 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("IsTrial") + .HasColumnType("tinyint(1)"); + + 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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.StatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.SubscriptionPlan", 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.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("UpdatedBy"); + }); + + 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.SubscriptionPlan", "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.TenantModel.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/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.cs b/Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.cs new file mode 100644 index 0000000..1f27bad --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250804064532_Corrected_Typo_In_SubscriptionPlan_Table.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Corrected_Typo_In_SubscriptionPlan_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "PriceHalfMonthly", + table: "SubscriptionPlans", + newName: "PriceHalfYearly"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "PriceHalfYearly", + table: "SubscriptionPlans", + newName: "PriceHalfMonthly"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 413e3d1..3ea215b 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -2551,7 +2551,7 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); - b.Property("PriceHalfMonthly") + b.Property("PriceHalfYearly") .HasColumnType("double"); b.Property("PriceMonthly") diff --git a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs index afc390a..57e1631 100644 --- a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs +++ b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs @@ -12,7 +12,7 @@ namespace Marco.Pms.Model.TenantModels public string Description { get; set; } = string.Empty; public double PriceQuarterly { get; set; } public double PriceMonthly { get; set; } - public double PriceHalfMonthly { get; set; } + public double PriceHalfYearly { get; set; } public double PriceYearly { get; set; } public int TrialDays { get; set; } = 30; public double MaxUser { get; set; } = 10; diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 6a7bbaf..d82ca12 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -537,7 +537,7 @@ namespace Marco.Pms.Services.Controllers response.Price = p.PriceMonthly; break; case 2: - response.Price = p.PriceHalfMonthly; + response.Price = p.PriceHalfYearly; break; case 3: response.Price = p.PriceYearly; From 545018dde1f675b330ae371a1818c50f530e75e0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 12:24:37 +0530 Subject: [PATCH 087/125] If frequency is null send all prices for all plans --- .../Tenant/SubscriptionPlanDetailsVM.cs | 21 +++++++++++++++++++ .../Controllers/TenantController.cs | 13 +++++++++++- .../MappingProfiles/MappingProfile.cs | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs diff --git a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs new file mode 100644 index 0000000..f30f99e --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs @@ -0,0 +1,21 @@ +using Marco.Pms.Model.Master; +using Marco.Pms.Model.TenantModels.MongoDBModel; + +namespace Marco.Pms.Model.ViewModels.Tenant +{ + public class SubscriptionPlanDetailsVM + { + public Guid Id { get; set; } + public string? PlanName { get; set; } + public string? Description { get; set; } + public double PriceQuarterly { get; set; } + public double PriceMonthly { get; set; } + public double PriceHalfYearly { get; set; } + public double PriceYearly { get; set; } + public int TrialDays { get; set; } + public double MaxUser { get; set; } + public double MaxStorage { get; set; } + public FeatureDetails? Features { get; set; } + public CurrencyMaster? Currency { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index d82ca12..c3793e9 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -520,11 +520,22 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription Plan APIs =================================================================== [HttpGet("list/subscription-plan")] - public async Task GetSubscriptionPlanList([FromQuery] int frequency) + public async Task GetSubscriptionPlanList([FromQuery] int? frequency) { await using var _context = await _dbContextFactory.CreateDbContextAsync(); var plans = await _context.SubscriptionPlans.Include(s => s.Currency).ToListAsync(); + if (frequency == null) + { + var detailsVM = await Task.WhenAll(plans.Select(async p => + { + var response = _mapper.Map(p); + response.Features = await _featureDetailsHelper.GetFeatureDetails(p.FeaturesId); + return response; + }).ToList()); + + return Ok(ApiResponse.SuccessResponse(detailsVM, "List of plans fetched successfully", 200)); + } var vm = await Task.WhenAll(plans.Select(async p => { var response = _mapper.Map(p); diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 1dd0d96..c9feb59 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -33,6 +33,7 @@ namespace Marco.Pms.Services.MappingProfiles ); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); From b9f2bc53c88f12ea01ba91416bac497c28995cdc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 12:26:33 +0530 Subject: [PATCH 088/125] Added updated at in action API --- Marco.Pms.Services/Service/ExpensesService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index dd0bf95..38d554d 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -737,6 +737,7 @@ namespace Marco.Pms.Services.Service ExpenseId = expense.Id, Action = $"Status changed to '{statusTransition.NextStatus?.Name}'", UpdatedById = loggedInEmployee.Id, + UpdateAt = DateTime.UtcNow, Comment = model.Comment, TenantId = tenantId }); From 1072a2da031338be1ccd7f4cc029b8ccee75588e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 12:39:28 +0530 Subject: [PATCH 089/125] Added mongoDB string in appsetting --- .../appsettings.Development.json | 103 +++++++++--------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/Marco.Pms.Services/appsettings.Development.json b/Marco.Pms.Services/appsettings.Development.json index 030c450..406e8ca 100644 --- a/Marco.Pms.Services/appsettings.Development.json +++ b/Marco.Pms.Services/appsettings.Development.json @@ -1,53 +1,54 @@ { - "Cors": { - "AllowedOrigins": "*", - "AllowedMethods": "*", - "AllowedHeaders": "*" - }, - "Environment": { - "Name": "Development", - "Title": "Dev" - }, - "ConnectionStrings": { - "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" - }, - "SmtpSettings": { - "SmtpServer": "smtp.gmail.com", - "Port": 587, - "SenderName": "MarcoAIOT", - "SenderEmail": "marcoioitsoft@gmail.com", - "Password": "qrtq wfuj hwpp fhqr" - }, - //"SmtpSettings": { - // "SmtpServer": "mail.marcoaiot.com", - // "Port": 587, - // "SenderName": "MarcoAIOT", - // "SenderEmail": "ashutosh.nehete@marcoaiot.com", - // "Password": "Reset@123" - //}, - "AppSettings": { - "WebFrontendUrl": "http://localhost:5173", - "ImagesBaseUrl": "http://localhost:5173" - }, - "Jwt": { - "Issuer": "http://localhost:5246", - "Audience": "http://localhost:5246", - "Key": "sworffishhkjfa9dnfdndfu33infnajfj", - "ExpiresInMinutes": 60, - "RefreshTokenExpiresInDays": 7 - }, - "MailingList": { - "RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" - //"ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" - }, - "AWS": { - "AccessKey": "AKIARZDBH3VDMSUUY2FX", - "SecretKey": "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", - "Region": "us-east-1", - "BucketName": "testenv-marco-pms-documents" - }, - "MongoDB": { - "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", - "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" - } + "Cors": { + "AllowedOrigins": "*", + "AllowedMethods": "*", + "AllowedHeaders": "*" + }, + "Environment": { + "Name": "Development", + "Title": "Dev" + }, + "ConnectionStrings": { + "DefaultConnectionString": "Server=147.93.98.152;User ID=devuser;Password=AppUser@123$;Database=MarcoBMS1" + }, + "SmtpSettings": { + "SmtpServer": "smtp.gmail.com", + "Port": 587, + "SenderName": "MarcoAIOT", + "SenderEmail": "marcoioitsoft@gmail.com", + "Password": "qrtq wfuj hwpp fhqr" + }, + //"SmtpSettings": { + // "SmtpServer": "mail.marcoaiot.com", + // "Port": 587, + // "SenderName": "MarcoAIOT", + // "SenderEmail": "ashutosh.nehete@marcoaiot.com", + // "Password": "Reset@123" + //}, + "AppSettings": { + "WebFrontendUrl": "http://localhost:5173", + "ImagesBaseUrl": "http://localhost:5173" + }, + "Jwt": { + "Issuer": "http://localhost:5246", + "Audience": "http://localhost:5246", + "Key": "sworffishhkjfa9dnfdndfu33infnajfj", + "ExpiresInMinutes": 60, + "RefreshTokenExpiresInDays": 7 + }, + "MailingList": { + "RequestDemoReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" + //"ProjectStatisticsReceivers": "ashutosh.nehete@marcoaiot.com;vikas@marcoaiot.com;umesh@marcoait.com" + }, + "AWS": { + "AccessKey": "AKIARZDBH3VDMSUUY2FX", + "SecretKey": "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", + "Region": "us-east-1", + "BucketName": "testenv-marco-pms-documents" + }, + "MongoDB": { + "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", + "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500", + "ModificationConnectionString": "mongodb://localhost:27017/ModificationLog?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" + } } From c3571f76b820781d769a7e64d305dc7bb93e6cfa Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 14:46:40 +0530 Subject: [PATCH 090/125] Changed the if condition in expense list API --- Marco.Pms.Services/Service/ExpensesService.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 38d554d..0443b2b 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -132,17 +132,16 @@ namespace Marco.Pms.Services.Service await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); // Apply permission-based filtering BEFORE any other filters or pagination. - - if (!hasViewAllPermissionTask.Result && hasViewSelfPermissionTask.Result) + if (hasViewAllPermissionTask.Result) + { + expensesQuery = expensesQuery.Where(e => e.CreatedById != loggedInEmployeeId || e.StatusId != Draft); + } + else if (hasViewSelfPermissionTask.Result) { // User only has 'View Self' permission, so restrict the query to their own expenses. _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); } - else - { - expensesQuery = expensesQuery.Where(e => e.CreatedById != loggedInEmployeeId || e.StatusId != Draft); - } if (expenseFilter != null) { From 33538c25b71f821f17c8432fc7dee7d2adfcddc3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 14:51:05 +0530 Subject: [PATCH 091/125] Chnaged get query --- Marco.Pms.Services/Service/ExpensesService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 0443b2b..cc3fbaa 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -134,7 +134,7 @@ namespace Marco.Pms.Services.Service // Apply permission-based filtering BEFORE any other filters or pagination. if (hasViewAllPermissionTask.Result) { - expensesQuery = expensesQuery.Where(e => e.CreatedById != loggedInEmployeeId || e.StatusId != Draft); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId || e.StatusId != Draft); } else if (hasViewSelfPermissionTask.Result) { From 19aedfb64842cc2370ea395f2b86b02c5274867d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 15:45:04 +0530 Subject: [PATCH 092/125] Chnage the cache logic --- Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs index 11e4554..9c030ed 100644 --- a/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ExpenseCache.cs @@ -50,7 +50,7 @@ namespace Marco.Pms.Helpers.CacheHelper else { filter &= filterBuilder.Or( - filterBuilder.Ne(e => e.CreatedBy.Id, loggedInEmployeeId.ToString()), + filterBuilder.Eq(e => e.CreatedBy.Id, loggedInEmployeeId.ToString()), filterBuilder.Ne(e => e.Status.Id, "297e0d8f-f668-41b5-bfea-e03b354251c8") ); } From 7bf30d722bdf23359ecca2c50e82b30f0cb99554 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 4 Aug 2025 17:01:02 +0530 Subject: [PATCH 093/125] Optimzed the add subscription API --- .../Dtos/Tenant/AttendanceDetailsDto.cs | 1 + .../Dtos/Tenant/DirectoryDetailsDto.cs | 1 + .../Dtos/Tenant/ExpenseModuleDetailsDto.cs | 1 + .../Tenant/ProjectManagementDetailsDto.cs | 1 + .../Dtos/Tenant/SubscriptionPlanDto.cs | 2 +- .../MongoDBModel/AttendanceDetails.cs | 3 + .../MongoDBModel/DirectoryDetails.cs | 3 + .../MongoDBModel/ExpenseModuleDetails.cs | 3 + .../MongoDBModel/ProjectManagementDetails.cs | 3 + .../Controllers/TenantController.cs | 215 +++++++++++++++--- Marco.Pms.Services/Program.cs | 6 +- 11 files changed, 206 insertions(+), 33 deletions(-) diff --git a/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs index b6fb41c..9259a5c 100644 --- a/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs @@ -2,6 +2,7 @@ { public class AttendanceDetailsDto { + public List? FeatureId { get; set; } public bool Enabled { get; set; } = false; public bool ManualEntry { get; set; } = true; public bool LocationTracking { get; set; } = true; diff --git a/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs index 168cc4f..7006545 100644 --- a/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs @@ -2,6 +2,7 @@ { public class DirectoryDetailsDto { + public List? FeatureId { get; set; } public bool Enabled { get; set; } = false; public int BucketLimit { get; set; } = 25; public bool OrganizationChart { get; set; } = false; diff --git a/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs index 1966b78..b8142c9 100644 --- a/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs @@ -2,6 +2,7 @@ { public class ExpenseModuleDetailsDto { + public List? FeatureId { get; set; } public bool Enabled { get; set; } = false; } } diff --git a/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs index cda923a..0ba8c5e 100644 --- a/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs @@ -2,6 +2,7 @@ { public class ProjectManagementDetailsDto { + public List? FeatureId { get; set; } public bool Enabled { get; set; } = false; public int MaxProject { get; set; } = 10; public double MaxTaskPerProject { get; set; } = 100000000; diff --git a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs index 1346d8c..b414d3f 100644 --- a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs @@ -7,7 +7,7 @@ public required string Description { get; set; } public double PriceQuarterly { get; set; } public double PriceMonthly { get; set; } - public double PriceHalfMonthly { get; set; } + public double PriceHalfYearly { get; set; } public double PriceYearly { get; set; } public required int TrialDays { get; set; } public required double MaxUser { get; set; } diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs index 0c800c2..a0728ac 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs @@ -8,6 +8,9 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + + [BsonRepresentation(BsonType.String)] + public List FeatureId { get; set; } = new List(); public bool Enabled { get; set; } = false; public bool ManualEntry { get; set; } = true; public bool LocationTracking { get; set; } = true; diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs index f0bf9d3..9708cc9 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs @@ -8,6 +8,9 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + + [BsonRepresentation(BsonType.String)] + public List FeatureId { get; set; } = new List(); public bool Enabled { get; set; } = false; public int BucketLimit { get; set; } = 25; public bool OrganizationChart { get; set; } = false; diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs index 210ae26..3ea1a78 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs @@ -8,6 +8,9 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + + [BsonRepresentation(BsonType.String)] + public List FeatureId { get; set; } = new List(); public bool Enabled { get; set; } = false; } } diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs index 7f843f8..9852570 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs @@ -8,6 +8,9 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + + [BsonRepresentation(BsonType.String)] + public List FeatureId { get; set; } = new List(); public bool Enabled { get; set; } = false; public int MaxProject { get; set; } = 10; public double MaxTaskPerProject { get; set; } = 100000000; diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index c3793e9..781aeda 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -41,6 +41,7 @@ namespace Marco.Pms.Services.Controllers private readonly static Guid activeStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); private readonly static Guid activePlanStatus = Guid.Parse("cd3a68ea-41fd-42f0-bd0c-c871c7337727"); + private readonly static Guid EmployeeFeatureId = Guid.Parse("81ab8a87-8ccd-4015-a917-0627cee6a100"); private readonly static string AdminRoleName = "Admin"; public TenantController(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, @@ -461,60 +462,214 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription APIs =================================================================== [HttpPost("add-subscription")] - public async Task AddSubscription(AddSubscriptionDto model) + public async Task AddSubscriptionAsync(AddSubscriptionDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + _logger.LogInfo("AddSubscription called by employee {EmployeeId} for Tenant {TenantId} and Plan {PlanId}", + loggedInEmployee.Id, model.TenantId, model.PlanId); + if (loggedInEmployee == null) + { + _logger.LogWarning("No logged-in employee found."); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + } + await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScopeFactory.CreateScope(); var _permissionService = scope.ServiceProvider.GetRequiredService(); - // A root user should have access regardless of the specific permission. var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - if (!hasPermission || !isRootUser) + if (!hasPermission && !isRootUser) // fixed logic here { - _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); - return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", + loggedInEmployee.Id); + + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", + "User does not have the required permissions for this action.", 403)); } + var subscriptionPlan = await _context.SubscriptionPlans.FirstOrDefaultAsync(sp => sp.Id == model.PlanId); + if (subscriptionPlan == null) + { + _logger.LogWarning("Subscription plan {PlanId} not found in database", model.PlanId); + return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 400)); + } + + await using var transaction = await _context.Database.BeginTransactionAsync(); + var utcNow = DateTime.UtcNow; + + // Prepare subscription dates based on frequency + var endDate = model.Frequency switch + { + PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + _ => utcNow.AddMonths(1) // default to monthly if unknown + }; + var tenantSubscription = new TenantSubscriptions { TenantId = model.TenantId, PlanId = model.PlanId, StatusId = activePlanStatus, - CreatedAt = DateTime.UtcNow, + CreatedAt = utcNow, CreatedById = loggedInEmployee.Id, CurrencyId = model.CurrencyId, IsTrial = model.IsTrial, - StartDate = DateTime.UtcNow, + StartDate = utcNow, + EndDate = endDate, + NextBillingDate = endDate, AutoRenew = model.AutoRenew }; - switch (model.Frequency) - { - case PLAN_FREQUENCY.MONTHLY: - tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(1); - tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(1); - break; - case PLAN_FREQUENCY.QUARTERLY: - tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(3); - tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(3); - break; - case PLAN_FREQUENCY.HALF_MONTHLY: - tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(6); - tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(6); - break; - case PLAN_FREQUENCY.YEARLY: - tenantSubscription.EndDate = DateTime.UtcNow.AddMonths(12); - tenantSubscription.NextBillingDate = DateTime.UtcNow.AddMonths(12); - break; - } + _context.TenantSubscriptions.Add(tenantSubscription); - await _context.SaveChangesAsync(); - return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); + + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("Tenant subscription added successfully for Tenant {TenantId}, Plan {PlanId}", + model.TenantId, model.PlanId); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database exception while adding subscription plan to tenant {TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(dbEx), 500)); + } + + try + { + var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + if (features == null) + { + _logger.LogInfo("No features found for subscription plan {PlanId}", model.PlanId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } + + // Helper to get permissions for a module asynchronously + async Task> GetPermissionsForModuleAsync(List? featureIds) + { + if (featureIds == null || featureIds.Count == 0) return new List(); + + await using var ctx = await _dbContextFactory.CreateDbContextAsync(); + return await ctx.FeaturePermissions.AsNoTracking() + .Where(fp => featureIds.Contains(fp.FeatureId)) + .Select(fp => fp.Id) + .ToListAsync(); + } + + // Fetch permission tasks for all modules in parallel + var projectPermissionTask = GetPermissionsForModuleAsync(features.Modules?.ProjectManagement?.FeatureId); + var attendancePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Attendance?.FeatureId); + var directoryPermissionTask = GetPermissionsForModuleAsync(features.Modules?.Directory?.FeatureId); + var expensePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Expense?.FeatureId); + var employeePermissionTask = GetPermissionsForModuleAsync(new List { EmployeeFeatureId }); + + await Task.WhenAll(projectPermissionTask, attendancePermissionTask, directoryPermissionTask, expensePermissionTask, employeePermissionTask); + + var newPermissionIds = new List(); + var deletePermissionIds = new List(); + + // Add or remove permissions based on modules enabled status + void ProcessPermissions(bool? enabled, List permissions) + { + if (enabled == true) + newPermissionIds.AddRange(permissions); + else + deletePermissionIds.AddRange(permissions); + } + + ProcessPermissions(features.Modules?.ProjectManagement?.Enabled, projectPermissionTask.Result); + ProcessPermissions(features.Modules?.Attendance?.Enabled, attendancePermissionTask.Result); + ProcessPermissions(features.Modules?.Directory?.Enabled, directoryPermissionTask.Result); + ProcessPermissions(features.Modules?.Expense?.Enabled, expensePermissionTask.Result); + + newPermissionIds = newPermissionIds.Distinct().ToList(); + deletePermissionIds = deletePermissionIds.Distinct().ToList(); + + // Get root employee and role for this tenant + var rootEmployee = await _context.Employees + .Include(e => e.ApplicationUser) + .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); + + if (rootEmployee == null) + { + _logger.LogWarning("Root employee not found for tenant {TenantId}", model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } + + var roleId = await _context.EmployeeRoleMappings + .AsNoTracking() + .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) + .Select(er => er.RoleId) + .FirstOrDefaultAsync(); + + if (roleId == Guid.Empty) + { + _logger.LogWarning("RoleId for root employee {EmployeeId} in tenant {TenantId} not found", rootEmployee.Id, model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } + + var oldRolePermissionMappings = await _context.RolePermissionMappings + .Where(rp => rp.ApplicationRoleId == roleId) + .ToListAsync(); + + var oldPermissionIds = oldRolePermissionMappings.Select(rp => rp.FeaturePermissionId).ToList(); + + // Prevent accidentally deleting essential employee permissions + var permissionIdCount = oldPermissionIds.Count - deletePermissionIds.Count; + if (permissionIdCount <= 4 && deletePermissionIds.Any()) + { + var employeePermissionIds = employeePermissionTask.Result; + deletePermissionIds = deletePermissionIds.Where(p => !employeePermissionIds.Contains(p)).ToList(); + } + + // Prepare mappings to delete and add + var deleteMappings = oldRolePermissionMappings.Where(rp => deletePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); + var addRolePermissionMappings = newPermissionIds + .Where(p => !oldPermissionIds.Contains(p)) + .Select(p => new RolePermissionMappings + { + ApplicationRoleId = roleId, + FeaturePermissionId = p + }) + .ToList(); + + if (addRolePermissionMappings.Any()) + { + _context.RolePermissionMappings.AddRange(addRolePermissionMappings); + _logger.LogInfo("Added {Count} new role permission mappings for role {RoleId}", addRolePermissionMappings.Count, roleId); + } + if (deleteMappings.Any()) + { + _context.RolePermissionMappings.RemoveRange(deleteMappings); + _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); + } + + await _context.SaveChangesAsync(); + + await transaction.CommitAsync(); + + _logger.LogInfo("Permissions updated successfully for tenant {TenantId} subscription", model.TenantId); + + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Exception occurred while updating permissions for tenant {TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(ex), 500)); + } } + #endregion #region =================================================================== Subscription Plan APIs =================================================================== @@ -523,7 +678,7 @@ namespace Marco.Pms.Services.Controllers public async Task GetSubscriptionPlanList([FromQuery] int? frequency) { await using var _context = await _dbContextFactory.CreateDbContextAsync(); - var plans = await _context.SubscriptionPlans.Include(s => s.Currency).ToListAsync(); + var plans = await _context.SubscriptionPlans.Include(s => s.Currency).OrderBy(s => s.PriceHalfYearly).ToListAsync(); if (frequency == null) { @@ -545,7 +700,7 @@ namespace Marco.Pms.Services.Controllers response.Price = p.PriceMonthly; break; case 1: - response.Price = p.PriceMonthly; + response.Price = p.PriceQuarterly; break; case 2: response.Price = p.PriceHalfYearly; diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 4b99cb8..9e19e21 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -81,10 +81,12 @@ string? connString = builder.Configuration.GetConnectionString("DefaultConnectio // This single call correctly registers BOTH the DbContext (scoped) AND the IDbContextFactory (singleton). builder.Services.AddDbContextFactory(options => - options.UseMySql(connString, ServerVersion.AutoDetect(connString))); + options.UseMySql(connString, ServerVersion.AutoDetect(connString)) + .EnableSensitiveDataLogging()); builder.Services.AddDbContext(options => - options.UseMySql(connString, ServerVersion.AutoDetect(connString))); + options.UseMySql(connString, ServerVersion.AutoDetect(connString)) + .EnableSensitiveDataLogging()); builder.Services.AddIdentity() .AddEntityFrameworkStores() From 60a3b3ab22163d2a540817a363ae6d3588888e38 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 5 Aug 2025 11:18:31 +0530 Subject: [PATCH 094/125] Added new API check if user with email exists or not --- .../Controllers/UserController.cs | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/UserController.cs b/Marco.Pms.Services/Controllers/UserController.cs index 8269d3e..22f8a60 100644 --- a/Marco.Pms.Services/Controllers/UserController.cs +++ b/Marco.Pms.Services/Controllers/UserController.cs @@ -6,8 +6,11 @@ using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; +using System.Net.Mail; namespace MarcoBMS.Services.Controllers { @@ -18,14 +21,17 @@ namespace MarcoBMS.Services.Controllers public class UserController : ControllerBase { private readonly UserHelper _userHelper; + private readonly UserManager _userManager; private readonly EmployeeHelper _employeeHelper; - + private readonly ILoggingService _logger; private readonly IProjectServices _projectServices; private readonly RolesHelper _rolesHelper; - public UserController(EmployeeHelper employeeHelper, IProjectServices projectServices, UserHelper userHelper, RolesHelper rolesHelper) + public UserController(EmployeeHelper employeeHelper, UserManager userManager, ILoggingService logger, IProjectServices projectServices, UserHelper userHelper, RolesHelper rolesHelper) { + _userManager = userManager; _userHelper = userHelper; + _logger = logger; _employeeHelper = employeeHelper; _projectServices = projectServices; _rolesHelper = rolesHelper; @@ -81,5 +87,44 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse(profile, "Success", 200)); } + + [HttpGet("email/{email}")] + public async Task GetUserByEmail(string email) + { + var isvalid = IsValidEmail(email); + if (!isvalid) + { + _logger.LogWarning("User provided invalid email address"); + return BadRequest(ApiResponse.ErrorResponse("Invalid email", "Invalid email", 400)); + } + var user = await _userManager.FindByEmailAsync(email); + + if (user == null) + { + _logger.LogInfo("User with email {Email} not found in ASP.NET users table", email); + return Ok(ApiResponse.SuccessResponse(true, "User not exists", 200)); + } + else + { + _logger.LogInfo("User with email {Email} founded in ASP.NET users table", email); + return Ok(ApiResponse.SuccessResponse(false, "User exists", 200)); + } + + } + + private static bool IsValidEmail(string email) + { + if (string.IsNullOrWhiteSpace(email)) + return false; + try + { + var addr = new MailAddress(email); + return addr.Address == email.Trim(); + } + catch + { + return false; + } + } } } From 54bf49a005f5fa922484f825f8fe29d711f9126d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 09:36:40 +0530 Subject: [PATCH 095/125] Seprated the subscrption plan and subscription details and commented add-subscription and update-subscription --- .../Data/ApplicationDbContext.cs | 16 +- ...an_And_SubscriptionPlanDetails.Designer.cs | 3878 +++++++++++++++++ ...riptionPlan_And_SubscriptionPlanDetails.cs | 411 ++ .../ApplicationDbContextModelSnapshot.cs | 98 +- .../Dtos/Tenant/AddSubscriptionDto.cs | 2 +- .../Dtos/Tenant/AttendanceDetailsDto.cs | 1 + .../Dtos/Tenant/DirectoryDetailsDto.cs | 1 + .../Dtos/Tenant/ExpenseModuleDetailsDto.cs | 1 + .../Tenant/ProjectManagementDetailsDto.cs | 3 +- .../Dtos/Tenant/SubscriptionPlanDetailsDto.cs | 13 + .../Dtos/Tenant/SubscriptionPlanDto.cs | 14 +- .../Dtos/Tenant/UpdateSubscriptionDto.cs | 13 + Marco.Pms.Model/Master/StatusMaster.cs | 6 +- .../MongoDBModel/AttendanceDetails.cs | 1 + .../MongoDBModel/DirectoryDetails.cs | 1 + .../MongoDBModel/ExpenseModuleDetails.cs | 1 + .../MongoDBModel/ProjectManagementDetails.cs | 1 + .../TenantModels/SubscriptionPlan.cs | 32 +- .../TenantModels/SubscriptionPlanDetails.cs | 41 + .../TenantModels/TenantSubscriptions.cs | 4 +- .../ViewModels/Tenant/SubscriptionPlanVM.cs | 2 + .../ViewModels/Tenant/TenantDetailsVM.cs | 33 + .../Controllers/TenantController.cs | 975 ++++- .../MappingProfiles/MappingProfile.cs | 17 +- Marco.Pms.Services/Program.cs | 6 +- Marco.Pms.Services/Service/ProjectServices.cs | 4 - .../appsettings.Development.json | 2 +- 27 files changed, 5229 insertions(+), 348 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDetailsDto.cs create mode 100644 Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs create mode 100644 Marco.Pms.Model/TenantModels/SubscriptionPlanDetails.cs create mode 100644 Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 26c8d83..fc3eb76 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -36,6 +36,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet SubscriptionStatus { get; set; } public DbSet Tenants { get; set; } public DbSet SubscriptionPlans { get; set; } + public DbSet SubscriptionPlanDetails { get; set; } public DbSet TenantSubscriptions { get; set; } public DbSet ApplicationUsers { get; set; } public DbSet ActivityMasters { get; set; } @@ -157,31 +158,26 @@ namespace Marco.Pms.DataAccess.Data new StatusMaster { Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), - Status = "Active", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "Active" }, new StatusMaster { Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), - Status = "In Progress", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "In Progress" }, new StatusMaster { Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), - Status = "On Hold", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "On Hold" }, new StatusMaster { Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - Status = "In Active", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "In Active" }, new StatusMaster { Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - Status = "Completed", - TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "Completed" } ); modelBuilder.Entity().HasData( diff --git a/Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.Designer.cs b/Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.Designer.cs new file mode 100644 index 0000000..36345ce --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.Designer.cs @@ -0,0 +1,3878 @@ +// +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("20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails")] + partial class Seprated_SubscriptionPlan_And_SubscriptionPlanDetails + { + /// + 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.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.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("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" + }); + }); + + 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.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.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("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("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.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 = "#6c757d", + 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.TenantModel.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.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.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.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.TenantModel.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.TenantModel.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.TenantModel.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.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.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.TenantModel.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.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.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.TenantModel.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/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.cs b/Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.cs new file mode 100644 index 0000000..a054403 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20250805162605_Seprated_SubscriptionPlan_And_SubscriptionPlanDetails.cs @@ -0,0 +1,411 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Seprated_SubscriptionPlan_And_SubscriptionPlanDetails : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_StatusMasters_Tenants_TenantId", + table: "StatusMasters"); + + migrationBuilder.DropForeignKey( + name: "FK_SubscriptionPlans_CurrencyMaster_CurrencyId", + table: "SubscriptionPlans"); + + migrationBuilder.DropForeignKey( + name: "FK_SubscriptionPlans_Employees_CreatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropForeignKey( + name: "FK_SubscriptionPlans_Employees_UpdatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropForeignKey( + name: "FK_TenantSubscriptions_SubscriptionPlans_PlanId", + table: "TenantSubscriptions"); + + migrationBuilder.DropIndex( + name: "IX_SubscriptionPlans_CreatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropIndex( + name: "IX_SubscriptionPlans_CurrencyId", + table: "SubscriptionPlans"); + + migrationBuilder.DropIndex( + name: "IX_SubscriptionPlans_UpdatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropIndex( + name: "IX_StatusMasters_TenantId", + table: "StatusMasters"); + + migrationBuilder.DropColumn( + name: "CreateAt", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "CreatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "CurrencyId", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "FeaturesId", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "MaxStorage", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "MaxUser", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "PriceHalfYearly", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "PriceMonthly", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "PriceQuarterly", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "PriceYearly", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "TrialDays", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "UpdateAt", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "UpdatedById", + table: "SubscriptionPlans"); + + migrationBuilder.DropColumn( + name: "TenantId", + table: "StatusMasters"); + + migrationBuilder.AddColumn( + name: "IsCancelled", + table: "TenantSubscriptions", + type: "tinyint(1)", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "MaxUsers", + table: "TenantSubscriptions", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.CreateTable( + name: "SubscriptionPlanDetails", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Price = table.Column(type: "double", nullable: false), + Frequency = table.Column(type: "int", nullable: false), + TrialDays = table.Column(type: "int", nullable: false), + MaxUser = table.Column(type: "double", nullable: false), + MaxStorage = table.Column(type: "double", nullable: false), + FeaturesId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreateAt = table.Column(type: "datetime(6)", nullable: false), + UpdateAt = table.Column(type: "datetime(6)", nullable: true), + PlanId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CurrencyId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UpdatedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + IsActive = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SubscriptionPlanDetails", x => x.Id); + table.ForeignKey( + name: "FK_SubscriptionPlanDetails_CurrencyMaster_CurrencyId", + column: x => x.CurrencyId, + principalTable: "CurrencyMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SubscriptionPlanDetails_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SubscriptionPlanDetails_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_SubscriptionPlanDetails_SubscriptionPlans_PlanId", + column: x => x.PlanId, + principalTable: "SubscriptionPlans", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlanDetails_CreatedById", + table: "SubscriptionPlanDetails", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlanDetails_CurrencyId", + table: "SubscriptionPlanDetails", + column: "CurrencyId"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlanDetails_PlanId", + table: "SubscriptionPlanDetails", + column: "PlanId"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlanDetails_UpdatedById", + table: "SubscriptionPlanDetails", + column: "UpdatedById"); + + migrationBuilder.AddForeignKey( + name: "FK_TenantSubscriptions_SubscriptionPlanDetails_PlanId", + table: "TenantSubscriptions", + column: "PlanId", + principalTable: "SubscriptionPlanDetails", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_TenantSubscriptions_SubscriptionPlanDetails_PlanId", + table: "TenantSubscriptions"); + + migrationBuilder.DropTable( + name: "SubscriptionPlanDetails"); + + migrationBuilder.DropColumn( + name: "IsCancelled", + table: "TenantSubscriptions"); + + migrationBuilder.DropColumn( + name: "MaxUsers", + table: "TenantSubscriptions"); + + migrationBuilder.AddColumn( + name: "CreateAt", + table: "SubscriptionPlans", + type: "datetime(6)", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "CreatedById", + table: "SubscriptionPlans", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "CurrencyId", + table: "SubscriptionPlans", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "FeaturesId", + table: "SubscriptionPlans", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "MaxStorage", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "MaxUser", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "PriceHalfYearly", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "PriceMonthly", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "PriceQuarterly", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "PriceYearly", + table: "SubscriptionPlans", + type: "double", + nullable: false, + defaultValue: 0.0); + + migrationBuilder.AddColumn( + name: "TrialDays", + table: "SubscriptionPlans", + type: "int", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "UpdateAt", + table: "SubscriptionPlans", + type: "datetime(6)", + nullable: true); + + migrationBuilder.AddColumn( + name: "UpdatedById", + table: "SubscriptionPlans", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "TenantId", + table: "StatusMasters", + type: "char(36)", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + collation: "ascii_general_ci"); + + migrationBuilder.UpdateData( + table: "StatusMasters", + keyColumn: "Id", + keyValue: new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusMasters", + keyColumn: "Id", + keyValue: new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusMasters", + keyColumn: "Id", + keyValue: new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusMasters", + keyColumn: "Id", + keyValue: new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.UpdateData( + table: "StatusMasters", + keyColumn: "Id", + keyValue: new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + column: "TenantId", + value: new Guid("b3466e83-7e11-464c-b93a-daf047838b26")); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_CreatedById", + table: "SubscriptionPlans", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_CurrencyId", + table: "SubscriptionPlans", + column: "CurrencyId"); + + migrationBuilder.CreateIndex( + name: "IX_SubscriptionPlans_UpdatedById", + table: "SubscriptionPlans", + column: "UpdatedById"); + + migrationBuilder.CreateIndex( + name: "IX_StatusMasters_TenantId", + table: "StatusMasters", + column: "TenantId"); + + migrationBuilder.AddForeignKey( + name: "FK_StatusMasters_Tenants_TenantId", + table: "StatusMasters", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_SubscriptionPlans_CurrencyMaster_CurrencyId", + table: "SubscriptionPlans", + column: "CurrencyId", + principalTable: "CurrencyMaster", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_SubscriptionPlans_Employees_CreatedById", + table: "SubscriptionPlans", + column: "CreatedById", + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_SubscriptionPlans_Employees_UpdatedById", + table: "SubscriptionPlans", + column: "UpdatedById", + principalTable: "Employees", + principalColumn: "Id"); + + migrationBuilder.AddForeignKey( + name: "FK_TenantSubscriptions_SubscriptionPlans_PlanId", + table: "TenantSubscriptions", + column: "PlanId", + principalTable: "SubscriptionPlans", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 3ea215b..692e6e8 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1758,45 +1758,35 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("Status") .HasColumnType("longtext"); - b.Property("TenantId") - .HasColumnType("char(36)"); - b.HasKey("Id"); - b.HasIndex("TenantId"); - b.ToTable("StatusMasters"); b.HasData( new { Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), - Status = "Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "Active" }, new { Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), - Status = "In Progress", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "In Progress" }, new { Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), - Status = "On Hold", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "On Hold" }, new { Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), - Status = "In Active", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "In Active" }, new { Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), - Status = "Completed", - TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + Status = "Completed" }); }); @@ -2517,6 +2507,28 @@ namespace Marco.Pms.DataAccess.Migrations }); 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() @@ -2531,13 +2543,12 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("CurrencyId") .HasColumnType("char(36)"); - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - b.Property("FeaturesId") .HasColumnType("char(36)"); + b.Property("Frequency") + .HasColumnType("int"); + b.Property("IsActive") .HasColumnType("tinyint(1)"); @@ -2547,20 +2558,10 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("MaxUser") .HasColumnType("double"); - b.Property("PlanName") - .IsRequired() - .HasColumnType("longtext"); + b.Property("PlanId") + .HasColumnType("char(36)"); - b.Property("PriceHalfYearly") - .HasColumnType("double"); - - b.Property("PriceMonthly") - .HasColumnType("double"); - - b.Property("PriceQuarterly") - .HasColumnType("double"); - - b.Property("PriceYearly") + b.Property("Price") .HasColumnType("double"); b.Property("TrialDays") @@ -2578,9 +2579,11 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("CurrencyId"); + b.HasIndex("PlanId"); + b.HasIndex("UpdatedById"); - b.ToTable("SubscriptionPlans"); + b.ToTable("SubscriptionPlanDetails"); }); modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => @@ -2607,9 +2610,15 @@ namespace Marco.Pms.DataAccess.Migrations 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)"); @@ -3531,17 +3540,6 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Module"); }); - modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => - { - b.HasOne("Marco.Pms.Model.TenantModel.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.TenantModel.Tenant", "Tenant") @@ -3729,7 +3727,7 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("TenantStatus"); }); - modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => { b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") .WithMany() @@ -3743,6 +3741,12 @@ namespace Marco.Pms.DataAccess.Migrations .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"); @@ -3751,6 +3755,8 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Currency"); + b.Navigation("Plan"); + b.Navigation("UpdatedBy"); }); @@ -3768,7 +3774,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") .WithMany() .HasForeignKey("PlanId") .OnDelete(DeleteBehavior.Cascade) diff --git a/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs index eb9dca1..4bd4df9 100644 --- a/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs @@ -7,7 +7,7 @@ namespace Marco.Pms.Model.Dtos.Tenant public Guid TenantId { get; set; } public Guid PlanId { get; set; } public Guid CurrencyId { get; set; } - public int MaxUsers { get; set; } + public double MaxUsers { get; set; } public PLAN_FREQUENCY Frequency { get; set; } public bool IsTrial { get; set; } = false; public bool AutoRenew { get; set; } = true; diff --git a/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs index 9259a5c..6b89d9f 100644 --- a/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/AttendanceDetailsDto.cs @@ -3,6 +3,7 @@ public class AttendanceDetailsDto { public List? FeatureId { get; set; } + public string Name { get; set; } = "Attendance Management"; public bool Enabled { get; set; } = false; public bool ManualEntry { get; set; } = true; public bool LocationTracking { get; set; } = true; diff --git a/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs index 7006545..e4655c4 100644 --- a/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/DirectoryDetailsDto.cs @@ -3,6 +3,7 @@ public class DirectoryDetailsDto { public List? FeatureId { get; set; } + public string Name { get; set; } = "Directory Management"; public bool Enabled { get; set; } = false; public int BucketLimit { get; set; } = 25; public bool OrganizationChart { get; set; } = false; diff --git a/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs index b8142c9..56d2eef 100644 --- a/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/ExpenseModuleDetailsDto.cs @@ -3,6 +3,7 @@ public class ExpenseModuleDetailsDto { public List? FeatureId { get; set; } + public string Name { get; set; } = "Expense Management"; public bool Enabled { get; set; } = false; } } diff --git a/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs index 0ba8c5e..72d0411 100644 --- a/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/ProjectManagementDetailsDto.cs @@ -3,9 +3,10 @@ public class ProjectManagementDetailsDto { public List? FeatureId { get; set; } + public string Name { get; set; } = "Project Management"; public bool Enabled { get; set; } = false; public int MaxProject { get; set; } = 10; - public double MaxTaskPerProject { get; set; } = 100000000; + public double MaxTaskPerProject { get; set; } = 100000; public bool GanttChart { get; set; } = false; public bool ResourceAllocation { get; set; } = false; } diff --git a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDetailsDto.cs b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDetailsDto.cs new file mode 100644 index 0000000..2317810 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDetailsDto.cs @@ -0,0 +1,13 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class SubscriptionPlanDetailsDto + { + public Guid? Id { get; set; } + public double Price { get; set; } + public required int TrialDays { get; set; } + public required double MaxUser { get; set; } + public double MaxStorage { get; set; } + public required FeatureDetailsDto Features { get; set; } + public Guid CurrencyId { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs index b414d3f..3db0802 100644 --- a/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/SubscriptionPlanDto.cs @@ -5,15 +5,9 @@ public Guid? Id { get; set; } public required string PlanName { get; set; } public required string Description { get; set; } - public double PriceQuarterly { get; set; } - public double PriceMonthly { get; set; } - public double PriceHalfYearly { get; set; } - public double PriceYearly { get; set; } - public required int TrialDays { get; set; } - public required double MaxUser { get; set; } - public double MaxStorage { get; set; } - public required FeatureDetailsDto Features { get; set; } - public Guid CurrencyId { get; set; } - + public SubscriptionPlanDetailsDto? MonthlyPlan { get; set; } + public SubscriptionPlanDetailsDto? QuarterlyPlan { get; set; } + public SubscriptionPlanDetailsDto? HalfYearlyPlan { get; set; } + public SubscriptionPlanDetailsDto? YearlyPlan { get; set; } } } diff --git a/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs b/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs new file mode 100644 index 0000000..148f845 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs @@ -0,0 +1,13 @@ +using Marco.Pms.Model.TenantModels; + +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class UpdateSubscriptionDto + { + public Guid TenantId { get; set; } + public Guid PlanId { get; set; } + public Guid CurrencyId { get; set; } + public double? MaxUsers { get; set; } + public PLAN_FREQUENCY Frequency { get; set; } + } +} diff --git a/Marco.Pms.Model/Master/StatusMaster.cs b/Marco.Pms.Model/Master/StatusMaster.cs index 4bd5283..914b926 100644 --- a/Marco.Pms.Model/Master/StatusMaster.cs +++ b/Marco.Pms.Model/Master/StatusMaster.cs @@ -1,8 +1,6 @@ -using Marco.Pms.Model.Utilities; - -namespace Marco.Pms.Model.Master +namespace Marco.Pms.Model.Master { - public class StatusMaster : TenantRelation + public class StatusMaster { public Guid Id { get; set; } public string? Status { get; set; } diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs index a0728ac..fc158b7 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/AttendanceDetails.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + public string? Name { get; set; } [BsonRepresentation(BsonType.String)] public List FeatureId { get; set; } = new List(); diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs index 9708cc9..27d1ac1 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/DirectoryDetails.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + public string? Name { get; set; } [BsonRepresentation(BsonType.String)] public List FeatureId { get; set; } = new List(); diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs index 3ea1a78..55de841 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ExpenseModuleDetails.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + public string? Name { get; set; } [BsonRepresentation(BsonType.String)] public List FeatureId { get; set; } = new List(); diff --git a/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs index 9852570..9c8c563 100644 --- a/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs +++ b/Marco.Pms.Model/TenantModels/MongoDBModel/ProjectManagementDetails.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Model.TenantModels.MongoDBModel [BsonId] [BsonRepresentation(BsonType.String)] public Guid Id { get; set; } = Guid.NewGuid(); + public string? Name { get; set; } [BsonRepresentation(BsonType.String)] public List FeatureId { get; set; } = new List(); diff --git a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs index 57e1631..e4c1f37 100644 --- a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs +++ b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs @@ -1,40 +1,10 @@ -using Marco.Pms.Model.Employees; -using Marco.Pms.Model.Master; -using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; -using System.ComponentModel.DataAnnotations.Schema; - -namespace Marco.Pms.Model.TenantModels +namespace Marco.Pms.Model.TenantModels { public class SubscriptionPlan { public Guid Id { get; set; } public string PlanName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; - public double PriceQuarterly { get; set; } - public double PriceMonthly { get; set; } - public double PriceHalfYearly { get; set; } - public double PriceYearly { get; set; } - public int TrialDays { get; set; } = 30; - public double MaxUser { get; set; } = 10; - public double MaxStorage { get; set; } - public Guid FeaturesId { get; set; } - public DateTime CreateAt { get; set; } - public DateTime? UpdateAt { get; set; } - public Guid CurrencyId { get; set; } - - [ForeignKey("CurrencyId")] - [ValidateNever] - public CurrencyMaster? Currency { get; set; } - public Guid CreatedById { get; set; } - - [ForeignKey("CreatedById")] - [ValidateNever] - public Employee? CreatedBy { get; set; } - public Guid? UpdatedById { get; set; } - - [ForeignKey("UpdatedById")] - [ValidateNever] - public Employee? UpdatedBy { get; set; } public bool IsActive { get; set; } = true; } diff --git a/Marco.Pms.Model/TenantModels/SubscriptionPlanDetails.cs b/Marco.Pms.Model/TenantModels/SubscriptionPlanDetails.cs new file mode 100644 index 0000000..69359c6 --- /dev/null +++ b/Marco.Pms.Model/TenantModels/SubscriptionPlanDetails.cs @@ -0,0 +1,41 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Master; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.TenantModels +{ + public class SubscriptionPlanDetails + { + public Guid Id { get; set; } + public double Price { get; set; } + public PLAN_FREQUENCY Frequency { get; set; } + public int TrialDays { get; set; } = 30; + public double MaxUser { get; set; } = 10; + public double MaxStorage { get; set; } + public Guid FeaturesId { get; set; } + public DateTime CreateAt { get; set; } + public DateTime? UpdateAt { get; set; } + public Guid PlanId { get; set; } + + [ForeignKey("PlanId")] + [ValidateNever] + public SubscriptionPlan? Plan { get; set; } + public Guid CurrencyId { get; set; } + + [ForeignKey("CurrencyId")] + [ValidateNever] + public CurrencyMaster? Currency { get; set; } + public Guid CreatedById { get; set; } + + [ForeignKey("CreatedById")] + [ValidateNever] + public Employee? CreatedBy { get; set; } + public Guid? UpdatedById { get; set; } + + [ForeignKey("UpdatedById")] + [ValidateNever] + public Employee? UpdatedBy { get; set; } + public bool IsActive { get; set; } = true; + } +} diff --git a/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs b/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs index b98164f..847b2b2 100644 --- a/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs +++ b/Marco.Pms.Model/TenantModels/TenantSubscriptions.cs @@ -13,10 +13,11 @@ namespace Marco.Pms.Model.TenantModels [ForeignKey("PlanId")] [ValidateNever] - public SubscriptionPlan? Plan { get; set; } + public SubscriptionPlanDetails? Plan { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public bool IsTrial { get; set; } + public double MaxUsers { get; set; } public Guid StatusId { get; set; } [ForeignKey("StatusId")] @@ -30,6 +31,7 @@ namespace Marco.Pms.Model.TenantModels public DateTime NextBillingDate { get; set; } public DateTime? CancellationDate { get; set; } public bool AutoRenew { get; set; } = true; + public bool IsCancelled { get; set; } = false; public DateTime CreatedAt { get; set; } public DateTime? UpdateAt { get; set; } public Guid CreatedById { get; set; } diff --git a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs index 6d72560..546ab0c 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanVM.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.Master; +using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels.MongoDBModel; namespace Marco.Pms.Model.ViewModels.Tenant @@ -9,6 +10,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant public string? PlanName { get; set; } public string? Description { get; set; } public double? Price { get; set; } + public PLAN_FREQUENCY? Frequency { get; set; } public int TrialDays { get; set; } public double MaxUser { get; set; } public double MaxStorage { get; set; } diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs new file mode 100644 index 0000000..d9af662 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs @@ -0,0 +1,33 @@ +using Marco.Pms.Model.Master; +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.Tenant +{ + public class TenantDetailsVM + { + public Guid Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + public string? Description { get; set; } + public string? DomainName { get; set; } + public string ContactName { get; set; } = string.Empty; + public string ContactNumber { get; set; } = string.Empty; + public string? OfficeNumber { get; set; } + public string BillingAddress { get; set; } = string.Empty; + public string? TaxId { get; set; } + public string? logoImage { get; set; } // Base64 + public DateTime OnBoardingDate { get; set; } + public string? OrganizationSize { get; set; } + public Industry? Industry { get; set; } + public TenantStatus? TenantStatus { get; set; } + public string Reference { get; set; } = string.Empty; + public bool IsActive { get; set; } = true; + public bool IsSuperTenant { get; set; } = false; + public int ActiveEmployees { get; set; } + public int InActiveEmployees { get; set; } + public object? Projects { get; set; } + public DateTime? ExpiryDate { get; set; } + public DateTime? NextBillingDate { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 781aeda..2d49fbc 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -206,6 +206,109 @@ namespace Marco.Pms.Services.Controllers [HttpGet("details/{id}")] public async Task GetDetails(Guid id) { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + var manageTenantsTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); + return await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + }); + var modifyTenantTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); + return await _permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); + }); + var viewTenantTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); + return await _permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id); + }); + + await Task.WhenAll(manageTenantsTask, modifyTenantTask, viewTenantTask); + + var hasManageTenantsPermission = manageTenantsTask.Result; + var hasModifyTenantPermission = modifyTenantTask.Result; + var hasViewTenantPermission = viewTenantTask.Result; + + if (!hasManageTenantsPermission && !hasModifyTenantPermission && !hasViewTenantPermission) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", + loggedInEmployee.Id); + + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", + "User does not have the required permissions for this action.", 403)); + } + + var tenant = await _context.Tenants + .Include(t => t.Industry) + .Include(t => t.TenantStatus) + .AsNoTracking() + .FirstOrDefaultAsync(t => t.Id == id); + if (tenant == null) + { + _logger.LogWarning("Tenant {TenantId} not found in database", id); + return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + } + + var employeeTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.Employees.Include(e => e.ApplicationUser).AsNoTracking().Where(e => e.TenantId == tenant.Id).ToListAsync(); + }); + var createdByTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.Employees.AsNoTracking().Where(e => e.Id == tenant.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefaultAsync(); + }); + var planTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.TenantSubscriptions.AsNoTracking().Where(ts => ts.TenantId == tenant.Id && !ts.IsCancelled && ts.Plan != null).FirstOrDefaultAsync(); + }); + var projectTask = Task.Run(async () => + { + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await _dbContext.Projects + .Include(p => p.ProjectStatus) + .AsNoTracking() + .Where(p => p.TenantId == tenant.Id) + .GroupBy(p => p.ProjectStatusId) + .Select(g => new + { + Status = g.Where(p => p.ProjectStatus != null && p.ProjectStatus.Id == g.Key).Select(p => p.ProjectStatus).FirstOrDefault(), + ProjectsCount = g.Where(p => p.ProjectStatusId == g.Key).Count() + }) + .ToListAsync(); + }); + + await Task.WhenAll(employeeTask, projectTask, planTask, createdByTask); + + var employees = employeeTask.Result; + var projects = projectTask.Result; + var currentPlan = planTask.Result; + var createdBy = createdByTask.Result; + + var activeEmployeesCount = employees.Where(e => e.IsActive).Count(); + var inActiveEmployeesCount = employees.Where(e => !e.IsActive).Count(); + + var expiryDate = currentPlan?.EndDate; + var nextBillingDate = currentPlan?.NextBillingDate; + + var response = _mapper.Map(tenant); + response.ActiveEmployees = activeEmployeesCount; + response.InActiveEmployees = inActiveEmployeesCount; + response.Projects = projects; + response.ExpiryDate = expiryDate; + response.NextBillingDate = nextBillingDate; + response.CreatedBy = createdBy; + + return Ok(); } @@ -461,213 +564,488 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription APIs =================================================================== - [HttpPost("add-subscription")] - public async Task AddSubscriptionAsync(AddSubscriptionDto model) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + //[HttpPost("add-subscription")] + //public async Task AddSubscriptionAsync(AddSubscriptionDto model) + //{ + // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - _logger.LogInfo("AddSubscription called by employee {EmployeeId} for Tenant {TenantId} and Plan {PlanId}", - loggedInEmployee.Id, model.TenantId, model.PlanId); - if (loggedInEmployee == null) - { - _logger.LogWarning("No logged-in employee found."); - return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); - } + // _logger.LogInfo("AddSubscription called by employee {EmployeeId} for Tenant {TenantId} and Plan {PlanId}", + // loggedInEmployee.Id, model.TenantId, model.PlanId); + // if (loggedInEmployee == null) + // { + // _logger.LogWarning("No logged-in employee found."); + // return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + // } - await using var _context = await _dbContextFactory.CreateDbContextAsync(); - using var scope = _serviceScopeFactory.CreateScope(); + // await using var _context = await _dbContextFactory.CreateDbContextAsync(); + // using var scope = _serviceScopeFactory.CreateScope(); - var _permissionService = scope.ServiceProvider.GetRequiredService(); + // var _permissionService = scope.ServiceProvider.GetRequiredService(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + // var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + // var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - if (!hasPermission && !isRootUser) // fixed logic here - { - _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", - loggedInEmployee.Id); + // if (!hasPermission || !isRootUser) + // { + // _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", + // loggedInEmployee.Id); - return StatusCode(403, - ApiResponse.ErrorResponse("Access denied", - "User does not have the required permissions for this action.", 403)); - } + // return StatusCode(403, + // ApiResponse.ErrorResponse("Access denied", + // "User does not have the required permissions for this action.", 403)); + // } - var subscriptionPlan = await _context.SubscriptionPlans.FirstOrDefaultAsync(sp => sp.Id == model.PlanId); - if (subscriptionPlan == null) - { - _logger.LogWarning("Subscription plan {PlanId} not found in database", model.PlanId); - return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 400)); - } + // var subscriptionPlan = await _context.SubscriptionPlans.FirstOrDefaultAsync(sp => sp.Id == model.PlanId); - await using var transaction = await _context.Database.BeginTransactionAsync(); - var utcNow = DateTime.UtcNow; + // var tenant = await _context.Tenants.FirstOrDefaultAsync(t => t.Id == model.TenantId); + // if (tenant == null) + // { + // _logger.LogWarning("Tenant {TenantId} not found in database", model.TenantId); + // return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + // } + // if (subscriptionPlan == null) + // { + // _logger.LogWarning("Subscription plan {PlanId} not found in database", model.PlanId); + // return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); + // } - // Prepare subscription dates based on frequency - var endDate = model.Frequency switch - { - PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), - PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - _ => utcNow.AddMonths(1) // default to monthly if unknown - }; + // await using var transaction = await _context.Database.BeginTransactionAsync(); + // var utcNow = DateTime.UtcNow; - var tenantSubscription = new TenantSubscriptions - { - TenantId = model.TenantId, - PlanId = model.PlanId, - StatusId = activePlanStatus, - CreatedAt = utcNow, - CreatedById = loggedInEmployee.Id, - CurrencyId = model.CurrencyId, - IsTrial = model.IsTrial, - StartDate = utcNow, - EndDate = endDate, - NextBillingDate = endDate, - AutoRenew = model.AutoRenew - }; + // // Prepare subscription dates based on frequency + // var endDate = model.Frequency switch + // { + // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + // _ => utcNow // default if unknown + // }; - _context.TenantSubscriptions.Add(tenantSubscription); + // var tenantSubscription = new TenantSubscriptions + // { + // TenantId = model.TenantId, + // PlanId = model.PlanId, + // StatusId = activePlanStatus, + // CreatedAt = utcNow, + // MaxUsers = model.MaxUsers, + // CreatedById = loggedInEmployee.Id, + // CurrencyId = model.CurrencyId, + // IsTrial = model.IsTrial, + // StartDate = utcNow, + // EndDate = endDate, + // NextBillingDate = endDate, + // AutoRenew = model.AutoRenew + // }; - try - { - await _context.SaveChangesAsync(); - _logger.LogInfo("Tenant subscription added successfully for Tenant {TenantId}, Plan {PlanId}", - model.TenantId, model.PlanId); - } - catch (DbUpdateException dbEx) - { - _logger.LogError(dbEx, "Database exception while adding subscription plan to tenant {TenantId}", model.TenantId); - return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(dbEx), 500)); - } + // _context.TenantSubscriptions.Add(tenantSubscription); - try - { - var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); - if (features == null) - { - _logger.LogInfo("No features found for subscription plan {PlanId}", model.PlanId); - await transaction.CommitAsync(); - return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - } + // try + // { + // await _context.SaveChangesAsync(); + // _logger.LogInfo("Tenant subscription added successfully for Tenant {TenantId}, Plan {PlanId}", + // model.TenantId, model.PlanId); + // } + // catch (DbUpdateException dbEx) + // { + // _logger.LogError(dbEx, "Database exception while adding subscription plan to tenant {TenantId}", model.TenantId); + // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(dbEx), 500)); + // } - // Helper to get permissions for a module asynchronously - async Task> GetPermissionsForModuleAsync(List? featureIds) - { - if (featureIds == null || featureIds.Count == 0) return new List(); + // try + // { + // var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + // if (features == null) + // { + // _logger.LogInfo("No features found for subscription plan {PlanId}", model.PlanId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + // } - await using var ctx = await _dbContextFactory.CreateDbContextAsync(); - return await ctx.FeaturePermissions.AsNoTracking() - .Where(fp => featureIds.Contains(fp.FeatureId)) - .Select(fp => fp.Id) - .ToListAsync(); - } + // // Helper to get permissions for a module asynchronously + // async Task> GetPermissionsForModuleAsync(List? featureIds) + // { + // if (featureIds == null || featureIds.Count == 0) return new List(); - // Fetch permission tasks for all modules in parallel - var projectPermissionTask = GetPermissionsForModuleAsync(features.Modules?.ProjectManagement?.FeatureId); - var attendancePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Attendance?.FeatureId); - var directoryPermissionTask = GetPermissionsForModuleAsync(features.Modules?.Directory?.FeatureId); - var expensePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Expense?.FeatureId); - var employeePermissionTask = GetPermissionsForModuleAsync(new List { EmployeeFeatureId }); + // await using var ctx = await _dbContextFactory.CreateDbContextAsync(); + // return await ctx.FeaturePermissions.AsNoTracking() + // .Where(fp => featureIds.Contains(fp.FeatureId)) + // .Select(fp => fp.Id) + // .ToListAsync(); + // } - await Task.WhenAll(projectPermissionTask, attendancePermissionTask, directoryPermissionTask, expensePermissionTask, employeePermissionTask); + // // Fetch permission tasks for all modules in parallel + // var projectPermissionTask = GetPermissionsForModuleAsync(features.Modules?.ProjectManagement?.FeatureId); + // var attendancePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Attendance?.FeatureId); + // var directoryPermissionTask = GetPermissionsForModuleAsync(features.Modules?.Directory?.FeatureId); + // var expensePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Expense?.FeatureId); + // var employeePermissionTask = GetPermissionsForModuleAsync(new List { EmployeeFeatureId }); - var newPermissionIds = new List(); - var deletePermissionIds = new List(); + // await Task.WhenAll(projectPermissionTask, attendancePermissionTask, directoryPermissionTask, expensePermissionTask, employeePermissionTask); - // Add or remove permissions based on modules enabled status - void ProcessPermissions(bool? enabled, List permissions) - { - if (enabled == true) - newPermissionIds.AddRange(permissions); - else - deletePermissionIds.AddRange(permissions); - } + // var newPermissionIds = new List(); + // var deletePermissionIds = new List(); - ProcessPermissions(features.Modules?.ProjectManagement?.Enabled, projectPermissionTask.Result); - ProcessPermissions(features.Modules?.Attendance?.Enabled, attendancePermissionTask.Result); - ProcessPermissions(features.Modules?.Directory?.Enabled, directoryPermissionTask.Result); - ProcessPermissions(features.Modules?.Expense?.Enabled, expensePermissionTask.Result); + // // Add or remove permissions based on modules enabled status + // void ProcessPermissions(bool? enabled, List permissions) + // { + // if (enabled == true) + // newPermissionIds.AddRange(permissions); + // else + // deletePermissionIds.AddRange(permissions); + // } - newPermissionIds = newPermissionIds.Distinct().ToList(); - deletePermissionIds = deletePermissionIds.Distinct().ToList(); + // ProcessPermissions(features.Modules?.ProjectManagement?.Enabled, projectPermissionTask.Result); + // ProcessPermissions(features.Modules?.Attendance?.Enabled, attendancePermissionTask.Result); + // ProcessPermissions(features.Modules?.Directory?.Enabled, directoryPermissionTask.Result); + // ProcessPermissions(features.Modules?.Expense?.Enabled, expensePermissionTask.Result); - // Get root employee and role for this tenant - var rootEmployee = await _context.Employees - .Include(e => e.ApplicationUser) - .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); + // newPermissionIds = newPermissionIds.Distinct().ToList(); + // deletePermissionIds = deletePermissionIds.Distinct().ToList(); - if (rootEmployee == null) - { - _logger.LogWarning("Root employee not found for tenant {TenantId}", model.TenantId); - await transaction.CommitAsync(); - return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - } + // // Get root employee and role for this tenant + // var rootEmployee = await _context.Employees + // .Include(e => e.ApplicationUser) + // .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); - var roleId = await _context.EmployeeRoleMappings - .AsNoTracking() - .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) - .Select(er => er.RoleId) - .FirstOrDefaultAsync(); + // if (rootEmployee == null) + // { + // _logger.LogWarning("Root employee not found for tenant {TenantId}", model.TenantId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + // } - if (roleId == Guid.Empty) - { - _logger.LogWarning("RoleId for root employee {EmployeeId} in tenant {TenantId} not found", rootEmployee.Id, model.TenantId); - await transaction.CommitAsync(); - return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - } + // var roleId = await _context.EmployeeRoleMappings + // .AsNoTracking() + // .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) + // .Select(er => er.RoleId) + // .FirstOrDefaultAsync(); - var oldRolePermissionMappings = await _context.RolePermissionMappings - .Where(rp => rp.ApplicationRoleId == roleId) - .ToListAsync(); + // if (roleId == Guid.Empty) + // { + // _logger.LogWarning("RoleId for root employee {EmployeeId} in tenant {TenantId} not found", rootEmployee.Id, model.TenantId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + // } - var oldPermissionIds = oldRolePermissionMappings.Select(rp => rp.FeaturePermissionId).ToList(); + // var oldRolePermissionMappings = await _context.RolePermissionMappings + // .Where(rp => rp.ApplicationRoleId == roleId) + // .ToListAsync(); - // Prevent accidentally deleting essential employee permissions - var permissionIdCount = oldPermissionIds.Count - deletePermissionIds.Count; - if (permissionIdCount <= 4 && deletePermissionIds.Any()) - { - var employeePermissionIds = employeePermissionTask.Result; - deletePermissionIds = deletePermissionIds.Where(p => !employeePermissionIds.Contains(p)).ToList(); - } + // var oldPermissionIds = oldRolePermissionMappings.Select(rp => rp.FeaturePermissionId).ToList(); - // Prepare mappings to delete and add - var deleteMappings = oldRolePermissionMappings.Where(rp => deletePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); - var addRolePermissionMappings = newPermissionIds - .Where(p => !oldPermissionIds.Contains(p)) - .Select(p => new RolePermissionMappings - { - ApplicationRoleId = roleId, - FeaturePermissionId = p - }) - .ToList(); + // // Prevent accidentally deleting essential employee permissions + // var permissionIdCount = oldPermissionIds.Count - deletePermissionIds.Count; + // if (permissionIdCount <= 4 && deletePermissionIds.Any()) + // { + // var employeePermissionIds = employeePermissionTask.Result; + // deletePermissionIds = deletePermissionIds.Where(p => !employeePermissionIds.Contains(p)).ToList(); + // } - if (addRolePermissionMappings.Any()) - { - _context.RolePermissionMappings.AddRange(addRolePermissionMappings); - _logger.LogInfo("Added {Count} new role permission mappings for role {RoleId}", addRolePermissionMappings.Count, roleId); - } - if (deleteMappings.Any()) - { - _context.RolePermissionMappings.RemoveRange(deleteMappings); - _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); - } + // // Prepare mappings to delete and add + // var deleteMappings = oldRolePermissionMappings.Where(rp => deletePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); + // var addRolePermissionMappings = newPermissionIds + // .Where(p => !oldPermissionIds.Contains(p)) + // .Select(p => new RolePermissionMappings + // { + // ApplicationRoleId = roleId, + // FeaturePermissionId = p + // }) + // .ToList(); - await _context.SaveChangesAsync(); + // if (addRolePermissionMappings.Any()) + // { + // _context.RolePermissionMappings.AddRange(addRolePermissionMappings); + // _logger.LogInfo("Added {Count} new role permission mappings for role {RoleId}", addRolePermissionMappings.Count, roleId); + // } + // if (deleteMappings.Any()) + // { + // _context.RolePermissionMappings.RemoveRange(deleteMappings); + // _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); + // } - await transaction.CommitAsync(); + // await _context.SaveChangesAsync(); - _logger.LogInfo("Permissions updated successfully for tenant {TenantId} subscription", model.TenantId); + // await transaction.CommitAsync(); + + // _logger.LogInfo("Permissions updated successfully for tenant {TenantId} subscription", model.TenantId); + + // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); + // } + // catch (Exception ex) + // { + // await transaction.RollbackAsync(); + // _logger.LogError(ex, "Exception occurred while updating permissions for tenant {TenantId}", model.TenantId); + // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(ex), 500)); + // } + //} + + //[HttpPut("update-subscription")] + //public async Task UpdateSubscriptionAsync(UpdateSubscriptionDto model) + //{ + // // 1. Get the logged-in user's employee record. + // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // // 2. Create a new DbContext instance for this request. + // await using var context = await _dbContextFactory.CreateDbContextAsync(); + + // // 3. Get PermissionServices from DI inside a fresh scope (rarely needed, but retained for your design). + // using var scope = _serviceScopeFactory.CreateScope(); + // var permissionService = scope.ServiceProvider.GetRequiredService(); + + // // 4. Check user permissions: must be both Root user and have ManageTenants permission. + // var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + // var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + + // if (!isRootUser || !hasPermission) + // { + // _logger.LogWarning("Permission denied for EmployeeId={EmployeeId}. Root: {IsRoot}, HasPermission: {HasPermission}", + // loggedInEmployee.Id, isRootUser, hasPermission); + // return StatusCode(403, ApiResponse.ErrorResponse("Access denied", + // "User does not have the required permissions.", 403)); + // } + + // // 5. Fetch Tenant, SubscriptionPlan, and TenantSubscription in parallel (efficiently). + // var tenantTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + // ctx.Result.Tenants.AsNoTracking().FirstOrDefaultAsync(t => t.Id == model.TenantId)).Unwrap(); + + // var subscriptionPlanTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + // ctx.Result.SubscriptionPlans.AsNoTracking().FirstOrDefaultAsync(sp => sp.Id == model.PlanId)).Unwrap(); + + // var currentSubscriptionTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + // ctx.Result.TenantSubscriptions.AsNoTracking().FirstOrDefaultAsync(ts => ts.TenantId == model.TenantId)).Unwrap(); + + // await Task.WhenAll(tenantTask, subscriptionPlanTask, currentSubscriptionTask); + + // var tenant = tenantTask.Result; + // if (tenant == null) + // { + // _logger.LogWarning("Tenant {TenantId} not found.", model.TenantId); + // return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + // } + + // var subscriptionPlan = subscriptionPlanTask.Result; + // if (subscriptionPlan == null) + // { + // _logger.LogWarning("Subscription plan {PlanId} not found.", model.PlanId); + // return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); + // } + + // var currentSubscription = currentSubscriptionTask.Result; + // var utcNow = DateTime.UtcNow; + + // // 6. If the tenant already has this plan, extend/renew it. + // if (currentSubscription != null && currentSubscription.PlanId == model.PlanId) + // { + // DateTime newEndDate; + // // 6a. If the subscription is still active, extend from current EndDate; else start from now. + // if (currentSubscription.EndDate.Date >= utcNow.Date) + // { + // newEndDate = model.Frequency switch + // { + // PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddMonths(1), + // PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddMonths(3), + // PLAN_FREQUENCY.HALF_MONTHLY => currentSubscription.EndDate.AddMonths(6), + // PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddMonths(12), + // _ => currentSubscription.EndDate + // }; + // } + // else + // { + // newEndDate = model.Frequency switch + // { + // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + // _ => utcNow + // }; + // } + + // // 6b. Update subscription details + // if (model.MaxUsers != null && model.MaxUsers > 0) + // { + // currentSubscription.MaxUsers = model.MaxUsers.Value; + // } + // currentSubscription.EndDate = newEndDate; + // currentSubscription.NextBillingDate = newEndDate; + // currentSubscription.UpdateAt = utcNow; + // currentSubscription.UpdatedById = loggedInEmployee.Id; + + // context.TenantSubscriptions.Update(currentSubscription); + // await context.SaveChangesAsync(); + + // _logger.LogInfo("Subscription renewed: Tenant={TenantId}, Plan={PlanId}, NewEnd={EndDate}", + // model.TenantId, model.PlanId, newEndDate); + + // return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); + // } + + // // 7. Else, change plan: new subscription record, close the old if exists. + // await using var transaction = await context.Database.BeginTransactionAsync(); + // try + // { + // // 7a. Compute new plan dates + // var endDate = model.Frequency switch + // { + // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + // _ => utcNow + // }; + + // var newSubscription = new TenantSubscriptions + // { + // TenantId = model.TenantId, + // PlanId = model.PlanId, + // StatusId = activePlanStatus, + // CreatedAt = utcNow, + // MaxUsers = model.MaxUsers ?? (currentSubscription?.MaxUsers ?? subscriptionPlan.MaxUser), + // CreatedById = loggedInEmployee.Id, + // CurrencyId = model.CurrencyId, + // StartDate = utcNow, + // EndDate = endDate, + // NextBillingDate = endDate, + // IsTrial = currentSubscription?.IsTrial ?? false, + // AutoRenew = currentSubscription?.AutoRenew ?? false + // }; + // context.TenantSubscriptions.Add(newSubscription); + + // // 7b. If an old subscription exists, cancel it. + // if (currentSubscription != null) + // { + // currentSubscription.IsCancelled = true; + // currentSubscription.CancellationDate = utcNow; + // currentSubscription.UpdateAt = utcNow; + // currentSubscription.UpdatedById = loggedInEmployee.Id; + // context.TenantSubscriptions.Update(currentSubscription); + // } + // await context.SaveChangesAsync(); + // _logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}", + // model.TenantId, model.PlanId); + + // // 8. Update tenant permissions based on subscription features. + // var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + // if (features == null) + // { + // _logger.LogInfo("No features for Plan={PlanId}.", model.PlanId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no features)", 200)); + // } + + // // 8a. Async helper to get all permission IDs for a given module. + // async Task> GetPermissionsForFeaturesAsync(List? featureIds) + // { + // if (featureIds == null || featureIds.Count == 0) return new List(); + + // await using var ctx = await _dbContextFactory.CreateDbContextAsync(); + // return await ctx.FeaturePermissions.AsNoTracking() + // .Where(fp => featureIds.Contains(fp.FeatureId)) + // .Select(fp => fp.Id) + // .ToListAsync(); + // } + + // // 8b. Fetch all module permissions concurrently. + // var projectPermTask = GetPermissionsForFeaturesAsync(features.Modules?.ProjectManagement?.FeatureId); + // var attendancePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Attendance?.FeatureId); + // var directoryPermTask = GetPermissionsForFeaturesAsync(features.Modules?.Directory?.FeatureId); + // var expensePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Expense?.FeatureId); + // var employeePermTask = GetPermissionsForFeaturesAsync(new List { EmployeeFeatureId }); // assumed defined + + // await Task.WhenAll(projectPermTask, attendancePermTask, directoryPermTask, expensePermTask, employeePermTask); + + // // 8c. Prepare add and remove permission lists. + // var newPermissionIds = new List(); + // var revokePermissionIds = new List(); + + // void ProcessPerms(bool? enabled, List ids) + // { + // if (enabled == true) newPermissionIds.AddRange(ids); + // else revokePermissionIds.AddRange(ids); + // } + // ProcessPerms(features.Modules?.ProjectManagement?.Enabled, projectPermTask.Result); + // ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result); + // ProcessPerms(features.Modules?.Directory?.Enabled, directoryPermTask.Result); + // ProcessPerms(features.Modules?.Expense?.Enabled, expensePermTask.Result); + + // newPermissionIds = newPermissionIds.Distinct().ToList(); + // revokePermissionIds = revokePermissionIds.Distinct().ToList(); + + // // 8d. Find root employee & role for this tenant. + // var rootEmployee = await context.Employees + // .Include(e => e.ApplicationUser) + // .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); + + // if (rootEmployee == null) + // { + // _logger.LogWarning("No root employee for Tenant={TenantId}.", model.TenantId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root employee)", 200)); + // } + + // var rootRoleId = await context.EmployeeRoleMappings + // .AsNoTracking() + // .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) + // .Select(er => er.RoleId) + // .FirstOrDefaultAsync(); + + // if (rootRoleId == Guid.Empty) + // { + // _logger.LogWarning("No root role for Employee={EmployeeId}, Tenant={TenantId}.", rootEmployee.Id, model.TenantId); + // await transaction.CommitAsync(); + // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root role)", 200)); + // } + + // var dbOldRolePerms = await context.RolePermissionMappings.Where(x => x.ApplicationRoleId == rootRoleId).ToListAsync(); + // var oldPermIds = dbOldRolePerms.Select(rp => rp.FeaturePermissionId).ToList(); + + // // 8e. Prevent accidental loss of basic employee permissions. + // if (oldPermIds.Count - revokePermissionIds.Count <= 4 && revokePermissionIds.Any()) + // { + // var employeePerms = employeePermTask.Result; + // revokePermissionIds = revokePermissionIds.Where(pid => !employeePerms.Contains(pid)).ToList(); + // } + + // // 8f. Prepare permission-mapping records to add/remove. + // var mappingsToRemove = dbOldRolePerms.Where(rp => revokePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); + // var mappingsToAdd = newPermissionIds + // .Where(pid => !oldPermIds.Contains(pid)) + // .Select(pid => new RolePermissionMappings { ApplicationRoleId = rootRoleId, FeaturePermissionId = pid }) + // .ToList(); + + // if (mappingsToAdd.Any()) + // { + // context.RolePermissionMappings.AddRange(mappingsToAdd); + // _logger.LogInfo("Permissions granted: {Count} for Role={RoleId}", mappingsToAdd.Count, rootRoleId); + // } + // if (mappingsToRemove.Any()) + // { + // context.RolePermissionMappings.RemoveRange(mappingsToRemove); + // _logger.LogInfo("Permissions revoked: {Count} for Role={RoleId}", mappingsToRemove.Count, rootRoleId); + // } + + // await context.SaveChangesAsync(); + // await transaction.CommitAsync(); + + // _logger.LogInfo("Tenant subscription and permissions updated: Tenant={TenantId}", model.TenantId); + + // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription successfully updated", 200)); + // } + // catch (DbUpdateException dbEx) + // { + // await transaction.RollbackAsync(); + // _logger.LogError(dbEx, "Database exception updating subscription for TenantId={TenantId}", model.TenantId); + // return StatusCode(500, ApiResponse.ErrorResponse("Internal database error", ExceptionMapper(dbEx), 500)); + // } + // catch (Exception ex) + // { + // await transaction.RollbackAsync(); + // _logger.LogError(ex, "General exception for TenantId={TenantId}", model.TenantId); + // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(ex), 500)); + // } + //} - return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); - } - catch (Exception ex) - { - await transaction.RollbackAsync(); - _logger.LogError(ex, "Exception occurred while updating permissions for tenant {TenantId}", model.TenantId); - return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(ex), 500)); - } - } #endregion @@ -675,49 +1053,66 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription Plan APIs =================================================================== [HttpGet("list/subscription-plan")] - public async Task GetSubscriptionPlanList([FromQuery] int? frequency) + public async Task GetSubscriptionPlanList([FromQuery] PLAN_FREQUENCY? frequency) { - await using var _context = await _dbContextFactory.CreateDbContextAsync(); - var plans = await _context.SubscriptionPlans.Include(s => s.Currency).OrderBy(s => s.PriceHalfYearly).ToListAsync(); + _logger.LogInfo("GetSubscriptionPlanList called with frequency: {Frequency}", frequency ?? PLAN_FREQUENCY.MONTHLY); - if (frequency == null) + // Initialize the list to store subscription plan view models + List detailsVM = new List(); + + try { - var detailsVM = await Task.WhenAll(plans.Select(async p => + // Create DbContext + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + // Load subscription plans with optional frequency filtering + IQueryable query = _context.SubscriptionPlanDetails.Include(sp => sp.Plan); + + if (frequency.HasValue) { - var response = _mapper.Map(p); - response.Features = await _featureDetailsHelper.GetFeatureDetails(p.FeaturesId); - return response; - }).ToList()); + query = query.Where(sp => sp.Frequency == frequency.Value); + _logger.LogInfo("Filtering subscription plans by frequency: {Frequency}", frequency); + } + else + { + _logger.LogInfo("Fetching all subscription plans without frequency filter"); + } + + var subscriptionPlans = await query.ToListAsync(); + + // Map and fetch feature details for each subscription plan + foreach (var subscriptionPlan in subscriptionPlans) + { + var response = _mapper.Map(subscriptionPlan); + + try + { + response.Features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + } + catch (Exception exFeature) + { + _logger.LogError(exFeature, "Failed to fetch features for FeaturesId: {FeaturesId}", subscriptionPlan.FeaturesId); + response.Features = null; // or set to a default/fallback value + } + + detailsVM.Add(response); + } + + _logger.LogInfo("Successfully fetched {Count} subscription plans", detailsVM.Count); return Ok(ApiResponse.SuccessResponse(detailsVM, "List of plans fetched successfully", 200)); } - var vm = await Task.WhenAll(plans.Select(async p => + catch (Exception ex) { - var response = _mapper.Map(p); - switch (frequency) - { - case 0: - response.Price = p.PriceMonthly; - break; - case 1: - response.Price = p.PriceQuarterly; - break; - case 2: - response.Price = p.PriceHalfYearly; - break; - case 3: - response.Price = p.PriceYearly; - break; - } - response.Features = await _featureDetailsHelper.GetFeatureDetails(p.FeaturesId); - return response; - }).ToList()); - - return Ok(ApiResponse.SuccessResponse(vm, "List of plans fetched successfully", 200)); + _logger.LogError(ex, "Error occurred while fetching subscription plans"); + return StatusCode(500, ApiResponse.ErrorResponse("An error occurred while fetching subscription plans.")); + } } + + [HttpPost("create/subscription-plan")] - public async Task CreateSubscriptionPlan([FromBody] SubscriptionPlanDto model) + public async Task CreateSubscriptionPlan1([FromBody] SubscriptionPlanDto model) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); await using var _context = await _dbContextFactory.CreateDbContextAsync(); @@ -735,31 +1130,149 @@ namespace Marco.Pms.Services.Controllers return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } - var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.CurrencyId); - if (currencyMaster == null) - { - return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); - } - var plan = _mapper.Map(model); - var features = _mapper.Map(model.Features); - - try - { - await _featureDetailsHelper.AddFeatureDetails(features); - } - catch (Exception ex) - { - _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); - } - - - plan.FeaturesId = features.Id; - plan.CreatedById = loggedInEmployee.Id; - plan.CreateAt = DateTime.UtcNow; - _context.SubscriptionPlans.Add(plan); + + List response = new List(); + + if (model.MonthlyPlan != null) + { + var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.MonthlyPlan.CurrencyId); + if (currencyMaster == null) + { + return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); + } + + var monthlyPlan = _mapper.Map(model.MonthlyPlan); + var features = _mapper.Map(model.MonthlyPlan.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + + monthlyPlan.PlanId = plan.Id; + monthlyPlan.Frequency = PLAN_FREQUENCY.MONTHLY; + monthlyPlan.FeaturesId = features.Id; + monthlyPlan.CreatedById = loggedInEmployee.Id; + monthlyPlan.CreateAt = DateTime.UtcNow; + + _context.SubscriptionPlanDetails.Add(monthlyPlan); + var VM = _mapper.Map(monthlyPlan); + VM.PlanName = plan.PlanName; + VM.Description = plan.Description; + VM.Currency = currencyMaster; + response.Add(VM); + } + + if (model.QuarterlyPlan != null) + { + var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.QuarterlyPlan.CurrencyId); + if (currencyMaster == null) + { + return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); + } + + var quarterlyPlan = _mapper.Map(model.QuarterlyPlan); + var features = _mapper.Map(model.QuarterlyPlan.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + + quarterlyPlan.PlanId = plan.Id; + quarterlyPlan.Frequency = PLAN_FREQUENCY.QUARTERLY; + quarterlyPlan.FeaturesId = features.Id; + quarterlyPlan.CreatedById = loggedInEmployee.Id; + quarterlyPlan.CreateAt = DateTime.UtcNow; + + _context.SubscriptionPlanDetails.Add(quarterlyPlan); + var VM = _mapper.Map(quarterlyPlan); + VM.PlanName = plan.PlanName; + VM.Description = plan.Description; + VM.Currency = currencyMaster; + response.Add(VM); + } + if (model.HalfYearlyPlan != null) + { + var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.HalfYearlyPlan.CurrencyId); + if (currencyMaster == null) + { + return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); + } + + var halfYearlyPlan = _mapper.Map(model.HalfYearlyPlan); + var features = _mapper.Map(model.HalfYearlyPlan.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + + halfYearlyPlan.PlanId = plan.Id; + halfYearlyPlan.Frequency = PLAN_FREQUENCY.HALF_MONTHLY; + halfYearlyPlan.FeaturesId = features.Id; + halfYearlyPlan.CreatedById = loggedInEmployee.Id; + halfYearlyPlan.CreateAt = DateTime.UtcNow; + + _context.SubscriptionPlanDetails.Add(halfYearlyPlan); + var VM = _mapper.Map(halfYearlyPlan); + VM.PlanName = plan.PlanName; + VM.Description = plan.Description; + VM.Currency = currencyMaster; + response.Add(VM); + } + if (model.YearlyPlan != null) + { + var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.YearlyPlan.CurrencyId); + if (currencyMaster == null) + { + return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); + } + + var yearlyPlan = _mapper.Map(model.YearlyPlan); + var features = _mapper.Map(model.YearlyPlan.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); + return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); + } + + yearlyPlan.PlanId = plan.Id; + yearlyPlan.Frequency = PLAN_FREQUENCY.YEARLY; + yearlyPlan.FeaturesId = features.Id; + yearlyPlan.CreatedById = loggedInEmployee.Id; + yearlyPlan.CreateAt = DateTime.UtcNow; + + _context.SubscriptionPlanDetails.Add(yearlyPlan); + var VM = _mapper.Map(yearlyPlan); + VM.PlanName = plan.PlanName; + VM.Description = plan.Description; + VM.Currency = currencyMaster; + response.Add(VM); + } + try { await _context.SaveChangesAsync(); @@ -770,12 +1283,10 @@ namespace Marco.Pms.Services.Controllers return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500)); } - var response = _mapper.Map(plan); - response.Features = features; - response.Currency = currencyMaster; - return StatusCode(201, ApiResponse.SuccessResponse(response, "Plan Created Successfully", 201)); } + + #endregion #region =================================================================== Helper Functions =================================================================== diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index c9feb59..adc7214 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -19,9 +19,11 @@ namespace Marco.Pms.Services.MappingProfiles { public MappingProfile() { - #region ======================================================= Employees ======================================================= + #region ======================================================= Tenant ======================================================= CreateMap(); CreateMap(); + CreateMap(); + CreateMap() .ForMember( dest => dest.ContactName, @@ -32,9 +34,18 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.OrganizationName) ); - CreateMap(); - CreateMap(); + CreateMap() + .ForMember( + dest => dest.PlanName, + opt => opt.MapFrom(src => src.Plan != null ? src.Plan.PlanName : "") + ) + .ForMember( + dest => dest.Description, + opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Description : "") + ); + CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 9e19e21..4b99cb8 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -81,12 +81,10 @@ string? connString = builder.Configuration.GetConnectionString("DefaultConnectio // This single call correctly registers BOTH the DbContext (scoped) AND the IDbContextFactory (singleton). builder.Services.AddDbContextFactory(options => - options.UseMySql(connString, ServerVersion.AutoDetect(connString)) - .EnableSensitiveDataLogging()); + options.UseMySql(connString, ServerVersion.AutoDetect(connString))); builder.Services.AddDbContext(options => - options.UseMySql(connString, ServerVersion.AutoDetect(connString)) - .EnableSensitiveDataLogging()); + options.UseMySql(connString, ServerVersion.AutoDetect(connString))); builder.Services.AddIdentity() .AddEntityFrameworkStores() diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 45a7e83..853fbda 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -228,10 +228,6 @@ namespace Marco.Pms.Services.Service else { projectVM = _mapper.Map(projectDetails); - if (projectVM.ProjectStatus != null) - { - projectVM.ProjectStatus.TenantId = tenantId; - } } if (projectVM == null) diff --git a/Marco.Pms.Services/appsettings.Development.json b/Marco.Pms.Services/appsettings.Development.json index 406e8ca..d6ea6a3 100644 --- a/Marco.Pms.Services/appsettings.Development.json +++ b/Marco.Pms.Services/appsettings.Development.json @@ -49,6 +49,6 @@ "MongoDB": { "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500", - "ModificationConnectionString": "mongodb://localhost:27017/ModificationLog?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" + "ModificationConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalDev?authSource=admin&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" } } From c65d73ff878737b0651e5f548cb434d9ebd25ab3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 09:47:16 +0530 Subject: [PATCH 096/125] Added new subscription details in add-subscription API --- .../Dtos/Tenant/AddSubscriptionDto.cs | 5 +- .../Controllers/TenantController.cs | 360 +++++++++--------- 2 files changed, 181 insertions(+), 184 deletions(-) diff --git a/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs index 4bd4df9..6c56253 100644 --- a/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/AddSubscriptionDto.cs @@ -1,6 +1,4 @@ -using Marco.Pms.Model.TenantModels; - -namespace Marco.Pms.Model.Dtos.Tenant +namespace Marco.Pms.Model.Dtos.Tenant { public class AddSubscriptionDto { @@ -8,7 +6,6 @@ namespace Marco.Pms.Model.Dtos.Tenant public Guid PlanId { get; set; } public Guid CurrencyId { get; set; } public double MaxUsers { get; set; } - public PLAN_FREQUENCY Frequency { get; set; } public bool IsTrial { get; set; } = false; public bool AutoRenew { get; set; } = true; } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 2d49fbc..a90f987 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -564,221 +564,221 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Subscription APIs =================================================================== - //[HttpPost("add-subscription")] - //public async Task AddSubscriptionAsync(AddSubscriptionDto model) - //{ - // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + [HttpPost("add-subscription")] + public async Task AddSubscriptionAsync(AddSubscriptionDto model) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - // _logger.LogInfo("AddSubscription called by employee {EmployeeId} for Tenant {TenantId} and Plan {PlanId}", - // loggedInEmployee.Id, model.TenantId, model.PlanId); - // if (loggedInEmployee == null) - // { - // _logger.LogWarning("No logged-in employee found."); - // return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); - // } + _logger.LogInfo("AddSubscription called by employee {EmployeeId} for Tenant {TenantId} and Plan {PlanId}", + loggedInEmployee.Id, model.TenantId, model.PlanId); + if (loggedInEmployee == null) + { + _logger.LogWarning("No logged-in employee found."); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + } - // await using var _context = await _dbContextFactory.CreateDbContextAsync(); - // using var scope = _serviceScopeFactory.CreateScope(); + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + using var scope = _serviceScopeFactory.CreateScope(); - // var _permissionService = scope.ServiceProvider.GetRequiredService(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); - // var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - // var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - // if (!hasPermission || !isRootUser) - // { - // _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", - // loggedInEmployee.Id); + if (!hasPermission || !isRootUser) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", + loggedInEmployee.Id); - // return StatusCode(403, - // ApiResponse.ErrorResponse("Access denied", - // "User does not have the required permissions for this action.", 403)); - // } + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", + "User does not have the required permissions for this action.", 403)); + } - // var subscriptionPlan = await _context.SubscriptionPlans.FirstOrDefaultAsync(sp => sp.Id == model.PlanId); + var subscriptionPlan = await _context.SubscriptionPlanDetails.Include(sp => sp.Plan).FirstOrDefaultAsync(sp => sp.Id == model.PlanId); - // var tenant = await _context.Tenants.FirstOrDefaultAsync(t => t.Id == model.TenantId); - // if (tenant == null) - // { - // _logger.LogWarning("Tenant {TenantId} not found in database", model.TenantId); - // return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); - // } - // if (subscriptionPlan == null) - // { - // _logger.LogWarning("Subscription plan {PlanId} not found in database", model.PlanId); - // return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); - // } + var tenant = await _context.Tenants.FirstOrDefaultAsync(t => t.Id == model.TenantId); + if (tenant == null) + { + _logger.LogWarning("Tenant {TenantId} not found in database", model.TenantId); + return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + } + if (subscriptionPlan == null) + { + _logger.LogWarning("Subscription plan {PlanId} not found in database", model.PlanId); + return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); + } - // await using var transaction = await _context.Database.BeginTransactionAsync(); - // var utcNow = DateTime.UtcNow; + await using var transaction = await _context.Database.BeginTransactionAsync(); + var utcNow = DateTime.UtcNow; - // // Prepare subscription dates based on frequency - // var endDate = model.Frequency switch - // { - // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), - // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - // _ => utcNow // default if unknown - // }; + // Prepare subscription dates based on frequency + var endDate = subscriptionPlan.Frequency switch + { + PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + _ => utcNow // default if unknown + }; - // var tenantSubscription = new TenantSubscriptions - // { - // TenantId = model.TenantId, - // PlanId = model.PlanId, - // StatusId = activePlanStatus, - // CreatedAt = utcNow, - // MaxUsers = model.MaxUsers, - // CreatedById = loggedInEmployee.Id, - // CurrencyId = model.CurrencyId, - // IsTrial = model.IsTrial, - // StartDate = utcNow, - // EndDate = endDate, - // NextBillingDate = endDate, - // AutoRenew = model.AutoRenew - // }; + var tenantSubscription = new TenantSubscriptions + { + TenantId = model.TenantId, + PlanId = model.PlanId, + StatusId = activePlanStatus, + CreatedAt = utcNow, + MaxUsers = model.MaxUsers, + CreatedById = loggedInEmployee.Id, + CurrencyId = model.CurrencyId, + IsTrial = model.IsTrial, + StartDate = utcNow, + EndDate = endDate, + NextBillingDate = endDate, + AutoRenew = model.AutoRenew + }; - // _context.TenantSubscriptions.Add(tenantSubscription); + _context.TenantSubscriptions.Add(tenantSubscription); - // try - // { - // await _context.SaveChangesAsync(); - // _logger.LogInfo("Tenant subscription added successfully for Tenant {TenantId}, Plan {PlanId}", - // model.TenantId, model.PlanId); - // } - // catch (DbUpdateException dbEx) - // { - // _logger.LogError(dbEx, "Database exception while adding subscription plan to tenant {TenantId}", model.TenantId); - // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(dbEx), 500)); - // } + try + { + await _context.SaveChangesAsync(); + _logger.LogInfo("Tenant subscription added successfully for Tenant {TenantId}, Plan {PlanId}", + model.TenantId, model.PlanId); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database exception while adding subscription plan to tenant {TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(dbEx), 500)); + } - // try - // { - // var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); - // if (features == null) - // { - // _logger.LogInfo("No features found for subscription plan {PlanId}", model.PlanId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - // } + try + { + var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + if (features == null) + { + _logger.LogInfo("No features found for subscription plan {PlanId}", model.PlanId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } - // // Helper to get permissions for a module asynchronously - // async Task> GetPermissionsForModuleAsync(List? featureIds) - // { - // if (featureIds == null || featureIds.Count == 0) return new List(); + // Helper to get permissions for a module asynchronously + async Task> GetPermissionsForModuleAsync(List? featureIds) + { + if (featureIds == null || featureIds.Count == 0) return new List(); - // await using var ctx = await _dbContextFactory.CreateDbContextAsync(); - // return await ctx.FeaturePermissions.AsNoTracking() - // .Where(fp => featureIds.Contains(fp.FeatureId)) - // .Select(fp => fp.Id) - // .ToListAsync(); - // } + await using var ctx = await _dbContextFactory.CreateDbContextAsync(); + return await ctx.FeaturePermissions.AsNoTracking() + .Where(fp => featureIds.Contains(fp.FeatureId)) + .Select(fp => fp.Id) + .ToListAsync(); + } - // // Fetch permission tasks for all modules in parallel - // var projectPermissionTask = GetPermissionsForModuleAsync(features.Modules?.ProjectManagement?.FeatureId); - // var attendancePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Attendance?.FeatureId); - // var directoryPermissionTask = GetPermissionsForModuleAsync(features.Modules?.Directory?.FeatureId); - // var expensePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Expense?.FeatureId); - // var employeePermissionTask = GetPermissionsForModuleAsync(new List { EmployeeFeatureId }); + // Fetch permission tasks for all modules in parallel + var projectPermissionTask = GetPermissionsForModuleAsync(features.Modules?.ProjectManagement?.FeatureId); + var attendancePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Attendance?.FeatureId); + var directoryPermissionTask = GetPermissionsForModuleAsync(features.Modules?.Directory?.FeatureId); + var expensePermissionTask = GetPermissionsForModuleAsync(features.Modules?.Expense?.FeatureId); + var employeePermissionTask = GetPermissionsForModuleAsync(new List { EmployeeFeatureId }); - // await Task.WhenAll(projectPermissionTask, attendancePermissionTask, directoryPermissionTask, expensePermissionTask, employeePermissionTask); + await Task.WhenAll(projectPermissionTask, attendancePermissionTask, directoryPermissionTask, expensePermissionTask, employeePermissionTask); - // var newPermissionIds = new List(); - // var deletePermissionIds = new List(); + var newPermissionIds = new List(); + var deletePermissionIds = new List(); - // // Add or remove permissions based on modules enabled status - // void ProcessPermissions(bool? enabled, List permissions) - // { - // if (enabled == true) - // newPermissionIds.AddRange(permissions); - // else - // deletePermissionIds.AddRange(permissions); - // } + // Add or remove permissions based on modules enabled status + void ProcessPermissions(bool? enabled, List permissions) + { + if (enabled == true) + newPermissionIds.AddRange(permissions); + else + deletePermissionIds.AddRange(permissions); + } - // ProcessPermissions(features.Modules?.ProjectManagement?.Enabled, projectPermissionTask.Result); - // ProcessPermissions(features.Modules?.Attendance?.Enabled, attendancePermissionTask.Result); - // ProcessPermissions(features.Modules?.Directory?.Enabled, directoryPermissionTask.Result); - // ProcessPermissions(features.Modules?.Expense?.Enabled, expensePermissionTask.Result); + ProcessPermissions(features.Modules?.ProjectManagement?.Enabled, projectPermissionTask.Result); + ProcessPermissions(features.Modules?.Attendance?.Enabled, attendancePermissionTask.Result); + ProcessPermissions(features.Modules?.Directory?.Enabled, directoryPermissionTask.Result); + ProcessPermissions(features.Modules?.Expense?.Enabled, expensePermissionTask.Result); - // newPermissionIds = newPermissionIds.Distinct().ToList(); - // deletePermissionIds = deletePermissionIds.Distinct().ToList(); + newPermissionIds = newPermissionIds.Distinct().ToList(); + deletePermissionIds = deletePermissionIds.Distinct().ToList(); - // // Get root employee and role for this tenant - // var rootEmployee = await _context.Employees - // .Include(e => e.ApplicationUser) - // .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); + // Get root employee and role for this tenant + var rootEmployee = await _context.Employees + .Include(e => e.ApplicationUser) + .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); - // if (rootEmployee == null) - // { - // _logger.LogWarning("Root employee not found for tenant {TenantId}", model.TenantId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - // } + if (rootEmployee == null) + { + _logger.LogWarning("Root employee not found for tenant {TenantId}", model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } - // var roleId = await _context.EmployeeRoleMappings - // .AsNoTracking() - // .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) - // .Select(er => er.RoleId) - // .FirstOrDefaultAsync(); + var roleId = await _context.EmployeeRoleMappings + .AsNoTracking() + .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) + .Select(er => er.RoleId) + .FirstOrDefaultAsync(); - // if (roleId == Guid.Empty) - // { - // _logger.LogWarning("RoleId for root employee {EmployeeId} in tenant {TenantId} not found", rootEmployee.Id, model.TenantId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); - // } + if (roleId == Guid.Empty) + { + _logger.LogWarning("RoleId for root employee {EmployeeId} in tenant {TenantId} not found", rootEmployee.Id, model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant subscription successfully added", 200)); + } - // var oldRolePermissionMappings = await _context.RolePermissionMappings - // .Where(rp => rp.ApplicationRoleId == roleId) - // .ToListAsync(); + var oldRolePermissionMappings = await _context.RolePermissionMappings + .Where(rp => rp.ApplicationRoleId == roleId) + .ToListAsync(); - // var oldPermissionIds = oldRolePermissionMappings.Select(rp => rp.FeaturePermissionId).ToList(); + var oldPermissionIds = oldRolePermissionMappings.Select(rp => rp.FeaturePermissionId).ToList(); - // // Prevent accidentally deleting essential employee permissions - // var permissionIdCount = oldPermissionIds.Count - deletePermissionIds.Count; - // if (permissionIdCount <= 4 && deletePermissionIds.Any()) - // { - // var employeePermissionIds = employeePermissionTask.Result; - // deletePermissionIds = deletePermissionIds.Where(p => !employeePermissionIds.Contains(p)).ToList(); - // } + // Prevent accidentally deleting essential employee permissions + var permissionIdCount = oldPermissionIds.Count - deletePermissionIds.Count; + if (permissionIdCount <= 4 && deletePermissionIds.Any()) + { + var employeePermissionIds = employeePermissionTask.Result; + deletePermissionIds = deletePermissionIds.Where(p => !employeePermissionIds.Contains(p)).ToList(); + } - // // Prepare mappings to delete and add - // var deleteMappings = oldRolePermissionMappings.Where(rp => deletePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); - // var addRolePermissionMappings = newPermissionIds - // .Where(p => !oldPermissionIds.Contains(p)) - // .Select(p => new RolePermissionMappings - // { - // ApplicationRoleId = roleId, - // FeaturePermissionId = p - // }) - // .ToList(); + // Prepare mappings to delete and add + var deleteMappings = oldRolePermissionMappings.Where(rp => deletePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); + var addRolePermissionMappings = newPermissionIds + .Where(p => !oldPermissionIds.Contains(p)) + .Select(p => new RolePermissionMappings + { + ApplicationRoleId = roleId, + FeaturePermissionId = p + }) + .ToList(); - // if (addRolePermissionMappings.Any()) - // { - // _context.RolePermissionMappings.AddRange(addRolePermissionMappings); - // _logger.LogInfo("Added {Count} new role permission mappings for role {RoleId}", addRolePermissionMappings.Count, roleId); - // } - // if (deleteMappings.Any()) - // { - // _context.RolePermissionMappings.RemoveRange(deleteMappings); - // _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); - // } + if (addRolePermissionMappings.Any()) + { + _context.RolePermissionMappings.AddRange(addRolePermissionMappings); + _logger.LogInfo("Added {Count} new role permission mappings for role {RoleId}", addRolePermissionMappings.Count, roleId); + } + if (deleteMappings.Any()) + { + _context.RolePermissionMappings.RemoveRange(deleteMappings); + _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); + } - // await _context.SaveChangesAsync(); + await _context.SaveChangesAsync(); - // await transaction.CommitAsync(); + await transaction.CommitAsync(); - // _logger.LogInfo("Permissions updated successfully for tenant {TenantId} subscription", model.TenantId); + _logger.LogInfo("Permissions updated successfully for tenant {TenantId} subscription", model.TenantId); - // return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); - // } - // catch (Exception ex) - // { - // await transaction.RollbackAsync(); - // _logger.LogError(ex, "Exception occurred while updating permissions for tenant {TenantId}", model.TenantId); - // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(ex), 500)); - // } - //} + return Ok(ApiResponse.SuccessResponse(tenantSubscription, "Tenant Subscription Successfully", 200)); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Exception occurred while updating permissions for tenant {TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occured", ExceptionMapper(ex), 500)); + } + } //[HttpPut("update-subscription")] //public async Task UpdateSubscriptionAsync(UpdateSubscriptionDto model) From 640b80ea82fb5406cb3d21be5e61b6c3c28bf62e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 10:14:53 +0530 Subject: [PATCH 097/125] Subscription plan details added in update subscription API --- .../Dtos/Tenant/UpdateSubscriptionDto.cs | 5 +- .../Controllers/TenantController.cs | 455 +++++++++--------- 2 files changed, 229 insertions(+), 231 deletions(-) diff --git a/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs b/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs index 148f845..50a3d7e 100644 --- a/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/UpdateSubscriptionDto.cs @@ -1,6 +1,4 @@ -using Marco.Pms.Model.TenantModels; - -namespace Marco.Pms.Model.Dtos.Tenant +namespace Marco.Pms.Model.Dtos.Tenant { public class UpdateSubscriptionDto { @@ -8,6 +6,5 @@ namespace Marco.Pms.Model.Dtos.Tenant public Guid PlanId { get; set; } public Guid CurrencyId { get; set; } public double? MaxUsers { get; set; } - public PLAN_FREQUENCY Frequency { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index a90f987..21fa0c8 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -780,271 +780,272 @@ namespace Marco.Pms.Services.Controllers } } - //[HttpPut("update-subscription")] - //public async Task UpdateSubscriptionAsync(UpdateSubscriptionDto model) - //{ - // // 1. Get the logged-in user's employee record. - // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + [HttpPut("update-subscription")] + public async Task UpdateSubscriptionAsync(UpdateSubscriptionDto model) + { + // 1. Get the logged-in user's employee record. + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - // // 2. Create a new DbContext instance for this request. - // await using var context = await _dbContextFactory.CreateDbContextAsync(); + // 2. Create a new DbContext instance for this request. + await using var context = await _dbContextFactory.CreateDbContextAsync(); - // // 3. Get PermissionServices from DI inside a fresh scope (rarely needed, but retained for your design). - // using var scope = _serviceScopeFactory.CreateScope(); - // var permissionService = scope.ServiceProvider.GetRequiredService(); + // 3. Get PermissionServices from DI inside a fresh scope (rarely needed, but retained for your design). + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); - // // 4. Check user permissions: must be both Root user and have ManageTenants permission. - // var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - // var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + // 4. Check user permissions: must be both Root user and have ManageTenants permission. + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var hasPermission = await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - // if (!isRootUser || !hasPermission) - // { - // _logger.LogWarning("Permission denied for EmployeeId={EmployeeId}. Root: {IsRoot}, HasPermission: {HasPermission}", - // loggedInEmployee.Id, isRootUser, hasPermission); - // return StatusCode(403, ApiResponse.ErrorResponse("Access denied", - // "User does not have the required permissions.", 403)); - // } + if (!isRootUser || !hasPermission) + { + _logger.LogWarning("Permission denied for EmployeeId={EmployeeId}. Root: {IsRoot}, HasPermission: {HasPermission}", + loggedInEmployee.Id, isRootUser, hasPermission); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", + "User does not have the required permissions.", 403)); + } - // // 5. Fetch Tenant, SubscriptionPlan, and TenantSubscription in parallel (efficiently). - // var tenantTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => - // ctx.Result.Tenants.AsNoTracking().FirstOrDefaultAsync(t => t.Id == model.TenantId)).Unwrap(); + // 5. Fetch Tenant, SubscriptionPlan, and TenantSubscription in parallel (efficiently). + var tenantTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + ctx.Result.Tenants.AsNoTracking().FirstOrDefaultAsync(t => t.Id == model.TenantId)).Unwrap(); - // var subscriptionPlanTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => - // ctx.Result.SubscriptionPlans.AsNoTracking().FirstOrDefaultAsync(sp => sp.Id == model.PlanId)).Unwrap(); + var planDetailsTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + ctx.Result.SubscriptionPlanDetails.Include(sp => sp.Plan).AsNoTracking().FirstOrDefaultAsync(sp => sp.Id == model.PlanId)).Unwrap(); - // var currentSubscriptionTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => - // ctx.Result.TenantSubscriptions.AsNoTracking().FirstOrDefaultAsync(ts => ts.TenantId == model.TenantId)).Unwrap(); + var currentSubscriptionTask = _dbContextFactory.CreateDbContextAsync().ContinueWith(ctx => + ctx.Result.TenantSubscriptions.Include(ts => ts.Currency).AsNoTracking().FirstOrDefaultAsync(ts => ts.TenantId == model.TenantId && !ts.IsCancelled)).Unwrap(); - // await Task.WhenAll(tenantTask, subscriptionPlanTask, currentSubscriptionTask); + await Task.WhenAll(tenantTask, planDetailsTask, currentSubscriptionTask); - // var tenant = tenantTask.Result; - // if (tenant == null) - // { - // _logger.LogWarning("Tenant {TenantId} not found.", model.TenantId); - // return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); - // } + var tenant = tenantTask.Result; + if (tenant == null) + { + _logger.LogWarning("Tenant {TenantId} not found.", model.TenantId); + return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + } - // var subscriptionPlan = subscriptionPlanTask.Result; - // if (subscriptionPlan == null) - // { - // _logger.LogWarning("Subscription plan {PlanId} not found.", model.PlanId); - // return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); - // } + var subscriptionPlan = planDetailsTask.Result; + if (subscriptionPlan == null) + { + _logger.LogWarning("Subscription plan {PlanId} not found.", model.PlanId); + return NotFound(ApiResponse.ErrorResponse("Subscription plan not found", "Subscription plan not found", 404)); + } - // var currentSubscription = currentSubscriptionTask.Result; - // var utcNow = DateTime.UtcNow; + var currentSubscription = currentSubscriptionTask.Result; + var utcNow = DateTime.UtcNow; - // // 6. If the tenant already has this plan, extend/renew it. - // if (currentSubscription != null && currentSubscription.PlanId == model.PlanId) - // { - // DateTime newEndDate; - // // 6a. If the subscription is still active, extend from current EndDate; else start from now. - // if (currentSubscription.EndDate.Date >= utcNow.Date) - // { - // newEndDate = model.Frequency switch - // { - // PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddMonths(1), - // PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddMonths(3), - // PLAN_FREQUENCY.HALF_MONTHLY => currentSubscription.EndDate.AddMonths(6), - // PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddMonths(12), - // _ => currentSubscription.EndDate - // }; - // } - // else - // { - // newEndDate = model.Frequency switch - // { - // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), - // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - // _ => utcNow - // }; - // } + // 6. If the tenant already has this plan, extend/renew it. + if (currentSubscription != null && currentSubscription.PlanId == subscriptionPlan.Id) + { + DateTime newEndDate; + // 6a. If the subscription is still active, extend from current EndDate; else start from now. + if (currentSubscription.EndDate.Date >= utcNow.Date) + { + newEndDate = subscriptionPlan.Frequency switch + { + PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddMonths(1), + PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddMonths(3), + PLAN_FREQUENCY.HALF_MONTHLY => currentSubscription.EndDate.AddMonths(6), + PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddMonths(12), + _ => currentSubscription.EndDate + }; + } + else + { + newEndDate = subscriptionPlan.Frequency switch + { + PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + _ => utcNow + }; + } - // // 6b. Update subscription details - // if (model.MaxUsers != null && model.MaxUsers > 0) - // { - // currentSubscription.MaxUsers = model.MaxUsers.Value; - // } - // currentSubscription.EndDate = newEndDate; - // currentSubscription.NextBillingDate = newEndDate; - // currentSubscription.UpdateAt = utcNow; - // currentSubscription.UpdatedById = loggedInEmployee.Id; + // 6b. Update subscription details + if (model.MaxUsers != null && model.MaxUsers > 0) + { + currentSubscription.MaxUsers = model.MaxUsers.Value; + } + currentSubscription.StartDate = utcNow; + currentSubscription.EndDate = newEndDate; + currentSubscription.NextBillingDate = newEndDate; + currentSubscription.UpdateAt = utcNow; + currentSubscription.UpdatedById = loggedInEmployee.Id; - // context.TenantSubscriptions.Update(currentSubscription); - // await context.SaveChangesAsync(); + context.TenantSubscriptions.Update(currentSubscription); + await context.SaveChangesAsync(); - // _logger.LogInfo("Subscription renewed: Tenant={TenantId}, Plan={PlanId}, NewEnd={EndDate}", - // model.TenantId, model.PlanId, newEndDate); + _logger.LogInfo("Subscription renewed: Tenant={TenantId}, Plan={PlanId}, NewEnd={EndDate}", + model.TenantId, model.PlanId, newEndDate); - // return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); - // } + return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); + } - // // 7. Else, change plan: new subscription record, close the old if exists. - // await using var transaction = await context.Database.BeginTransactionAsync(); - // try - // { - // // 7a. Compute new plan dates - // var endDate = model.Frequency switch - // { - // PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - // PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - // PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), - // PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - // _ => utcNow - // }; + // 7. Else, change plan: new subscription record, close the old if exists. + await using var transaction = await context.Database.BeginTransactionAsync(); + try + { + // 7a. Compute new plan dates + var endDate = subscriptionPlan.Frequency switch + { + PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), + PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + _ => utcNow + }; - // var newSubscription = new TenantSubscriptions - // { - // TenantId = model.TenantId, - // PlanId = model.PlanId, - // StatusId = activePlanStatus, - // CreatedAt = utcNow, - // MaxUsers = model.MaxUsers ?? (currentSubscription?.MaxUsers ?? subscriptionPlan.MaxUser), - // CreatedById = loggedInEmployee.Id, - // CurrencyId = model.CurrencyId, - // StartDate = utcNow, - // EndDate = endDate, - // NextBillingDate = endDate, - // IsTrial = currentSubscription?.IsTrial ?? false, - // AutoRenew = currentSubscription?.AutoRenew ?? false - // }; - // context.TenantSubscriptions.Add(newSubscription); + var newSubscription = new TenantSubscriptions + { + TenantId = model.TenantId, + PlanId = model.PlanId, + StatusId = activePlanStatus, + CreatedAt = utcNow, + MaxUsers = model.MaxUsers ?? (currentSubscription?.MaxUsers ?? subscriptionPlan.MaxUser), + CreatedById = loggedInEmployee.Id, + CurrencyId = model.CurrencyId, + StartDate = utcNow, + EndDate = endDate, + NextBillingDate = endDate, + IsTrial = currentSubscription?.IsTrial ?? false, + AutoRenew = currentSubscription?.AutoRenew ?? false + }; + context.TenantSubscriptions.Add(newSubscription); - // // 7b. If an old subscription exists, cancel it. - // if (currentSubscription != null) - // { - // currentSubscription.IsCancelled = true; - // currentSubscription.CancellationDate = utcNow; - // currentSubscription.UpdateAt = utcNow; - // currentSubscription.UpdatedById = loggedInEmployee.Id; - // context.TenantSubscriptions.Update(currentSubscription); - // } - // await context.SaveChangesAsync(); - // _logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}", - // model.TenantId, model.PlanId); + // 7b. If an old subscription exists, cancel it. + if (currentSubscription != null) + { + currentSubscription.IsCancelled = true; + currentSubscription.CancellationDate = utcNow; + currentSubscription.UpdateAt = utcNow; + currentSubscription.UpdatedById = loggedInEmployee.Id; + context.TenantSubscriptions.Update(currentSubscription); + } + await context.SaveChangesAsync(); + _logger.LogInfo("Subscription plan changed: Tenant={TenantId}, NewPlan={PlanId}", + model.TenantId, model.PlanId); - // // 8. Update tenant permissions based on subscription features. - // var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); - // if (features == null) - // { - // _logger.LogInfo("No features for Plan={PlanId}.", model.PlanId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no features)", 200)); - // } + // 8. Update tenant permissions based on subscription features. + var features = await _featureDetailsHelper.GetFeatureDetails(subscriptionPlan.FeaturesId); + if (features == null) + { + _logger.LogInfo("No features for Plan={PlanId}.", model.PlanId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no features)", 200)); + } - // // 8a. Async helper to get all permission IDs for a given module. - // async Task> GetPermissionsForFeaturesAsync(List? featureIds) - // { - // if (featureIds == null || featureIds.Count == 0) return new List(); + // 8a. Async helper to get all permission IDs for a given module. + async Task> GetPermissionsForFeaturesAsync(List? featureIds) + { + if (featureIds == null || featureIds.Count == 0) return new List(); - // await using var ctx = await _dbContextFactory.CreateDbContextAsync(); - // return await ctx.FeaturePermissions.AsNoTracking() - // .Where(fp => featureIds.Contains(fp.FeatureId)) - // .Select(fp => fp.Id) - // .ToListAsync(); - // } + await using var ctx = await _dbContextFactory.CreateDbContextAsync(); + return await ctx.FeaturePermissions.AsNoTracking() + .Where(fp => featureIds.Contains(fp.FeatureId)) + .Select(fp => fp.Id) + .ToListAsync(); + } - // // 8b. Fetch all module permissions concurrently. - // var projectPermTask = GetPermissionsForFeaturesAsync(features.Modules?.ProjectManagement?.FeatureId); - // var attendancePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Attendance?.FeatureId); - // var directoryPermTask = GetPermissionsForFeaturesAsync(features.Modules?.Directory?.FeatureId); - // var expensePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Expense?.FeatureId); - // var employeePermTask = GetPermissionsForFeaturesAsync(new List { EmployeeFeatureId }); // assumed defined + // 8b. Fetch all module permissions concurrently. + var projectPermTask = GetPermissionsForFeaturesAsync(features.Modules?.ProjectManagement?.FeatureId); + var attendancePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Attendance?.FeatureId); + var directoryPermTask = GetPermissionsForFeaturesAsync(features.Modules?.Directory?.FeatureId); + var expensePermTask = GetPermissionsForFeaturesAsync(features.Modules?.Expense?.FeatureId); + var employeePermTask = GetPermissionsForFeaturesAsync(new List { EmployeeFeatureId }); // assumed defined - // await Task.WhenAll(projectPermTask, attendancePermTask, directoryPermTask, expensePermTask, employeePermTask); + await Task.WhenAll(projectPermTask, attendancePermTask, directoryPermTask, expensePermTask, employeePermTask); - // // 8c. Prepare add and remove permission lists. - // var newPermissionIds = new List(); - // var revokePermissionIds = new List(); + // 8c. Prepare add and remove permission lists. + var newPermissionIds = new List(); + var revokePermissionIds = new List(); - // void ProcessPerms(bool? enabled, List ids) - // { - // if (enabled == true) newPermissionIds.AddRange(ids); - // else revokePermissionIds.AddRange(ids); - // } - // ProcessPerms(features.Modules?.ProjectManagement?.Enabled, projectPermTask.Result); - // ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result); - // ProcessPerms(features.Modules?.Directory?.Enabled, directoryPermTask.Result); - // ProcessPerms(features.Modules?.Expense?.Enabled, expensePermTask.Result); + void ProcessPerms(bool? enabled, List ids) + { + if (enabled == true) newPermissionIds.AddRange(ids); + else revokePermissionIds.AddRange(ids); + } + ProcessPerms(features.Modules?.ProjectManagement?.Enabled, projectPermTask.Result); + ProcessPerms(features.Modules?.Attendance?.Enabled, attendancePermTask.Result); + ProcessPerms(features.Modules?.Directory?.Enabled, directoryPermTask.Result); + ProcessPerms(features.Modules?.Expense?.Enabled, expensePermTask.Result); - // newPermissionIds = newPermissionIds.Distinct().ToList(); - // revokePermissionIds = revokePermissionIds.Distinct().ToList(); + newPermissionIds = newPermissionIds.Distinct().ToList(); + revokePermissionIds = revokePermissionIds.Distinct().ToList(); - // // 8d. Find root employee & role for this tenant. - // var rootEmployee = await context.Employees - // .Include(e => e.ApplicationUser) - // .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); + // 8d. Find root employee & role for this tenant. + var rootEmployee = await context.Employees + .Include(e => e.ApplicationUser) + .FirstOrDefaultAsync(e => e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false) && e.TenantId == model.TenantId); - // if (rootEmployee == null) - // { - // _logger.LogWarning("No root employee for Tenant={TenantId}.", model.TenantId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root employee)", 200)); - // } + if (rootEmployee == null) + { + _logger.LogWarning("No root employee for Tenant={TenantId}.", model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root employee)", 200)); + } - // var rootRoleId = await context.EmployeeRoleMappings - // .AsNoTracking() - // .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) - // .Select(er => er.RoleId) - // .FirstOrDefaultAsync(); + var rootRoleId = await context.EmployeeRoleMappings + .AsNoTracking() + .Where(er => er.EmployeeId == rootEmployee.Id && er.TenantId == model.TenantId) + .Select(er => er.RoleId) + .FirstOrDefaultAsync(); - // if (rootRoleId == Guid.Empty) - // { - // _logger.LogWarning("No root role for Employee={EmployeeId}, Tenant={TenantId}.", rootEmployee.Id, model.TenantId); - // await transaction.CommitAsync(); - // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root role)", 200)); - // } + if (rootRoleId == Guid.Empty) + { + _logger.LogWarning("No root role for Employee={EmployeeId}, Tenant={TenantId}.", rootEmployee.Id, model.TenantId); + await transaction.CommitAsync(); + return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription updated (no root role)", 200)); + } - // var dbOldRolePerms = await context.RolePermissionMappings.Where(x => x.ApplicationRoleId == rootRoleId).ToListAsync(); - // var oldPermIds = dbOldRolePerms.Select(rp => rp.FeaturePermissionId).ToList(); + var dbOldRolePerms = await context.RolePermissionMappings.Where(x => x.ApplicationRoleId == rootRoleId).ToListAsync(); + var oldPermIds = dbOldRolePerms.Select(rp => rp.FeaturePermissionId).ToList(); - // // 8e. Prevent accidental loss of basic employee permissions. - // if (oldPermIds.Count - revokePermissionIds.Count <= 4 && revokePermissionIds.Any()) - // { - // var employeePerms = employeePermTask.Result; - // revokePermissionIds = revokePermissionIds.Where(pid => !employeePerms.Contains(pid)).ToList(); - // } + // 8e. Prevent accidental loss of basic employee permissions. + if ((oldPermIds.Count - revokePermissionIds.Count) >= 4 && revokePermissionIds.Any()) + { + var employeePerms = employeePermTask.Result; + revokePermissionIds = revokePermissionIds.Where(pid => !employeePerms.Contains(pid)).ToList(); + } - // // 8f. Prepare permission-mapping records to add/remove. - // var mappingsToRemove = dbOldRolePerms.Where(rp => revokePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); - // var mappingsToAdd = newPermissionIds - // .Where(pid => !oldPermIds.Contains(pid)) - // .Select(pid => new RolePermissionMappings { ApplicationRoleId = rootRoleId, FeaturePermissionId = pid }) - // .ToList(); + // 8f. Prepare permission-mapping records to add/remove. + var mappingsToRemove = dbOldRolePerms.Where(rp => revokePermissionIds.Contains(rp.FeaturePermissionId)).ToList(); + var mappingsToAdd = newPermissionIds + .Where(pid => !oldPermIds.Contains(pid)) + .Select(pid => new RolePermissionMappings { ApplicationRoleId = rootRoleId, FeaturePermissionId = pid }) + .ToList(); - // if (mappingsToAdd.Any()) - // { - // context.RolePermissionMappings.AddRange(mappingsToAdd); - // _logger.LogInfo("Permissions granted: {Count} for Role={RoleId}", mappingsToAdd.Count, rootRoleId); - // } - // if (mappingsToRemove.Any()) - // { - // context.RolePermissionMappings.RemoveRange(mappingsToRemove); - // _logger.LogInfo("Permissions revoked: {Count} for Role={RoleId}", mappingsToRemove.Count, rootRoleId); - // } + if (mappingsToAdd.Any()) + { + context.RolePermissionMappings.AddRange(mappingsToAdd); + _logger.LogInfo("Permissions granted: {Count} for Role={RoleId}", mappingsToAdd.Count, rootRoleId); + } + if (mappingsToRemove.Any()) + { + context.RolePermissionMappings.RemoveRange(mappingsToRemove); + _logger.LogInfo("Permissions revoked: {Count} for Role={RoleId}", mappingsToRemove.Count, rootRoleId); + } - // await context.SaveChangesAsync(); - // await transaction.CommitAsync(); + await context.SaveChangesAsync(); + await transaction.CommitAsync(); - // _logger.LogInfo("Tenant subscription and permissions updated: Tenant={TenantId}", model.TenantId); + _logger.LogInfo("Tenant subscription and permissions updated: Tenant={TenantId}", model.TenantId); - // return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription successfully updated", 200)); - // } - // catch (DbUpdateException dbEx) - // { - // await transaction.RollbackAsync(); - // _logger.LogError(dbEx, "Database exception updating subscription for TenantId={TenantId}", model.TenantId); - // return StatusCode(500, ApiResponse.ErrorResponse("Internal database error", ExceptionMapper(dbEx), 500)); - // } - // catch (Exception ex) - // { - // await transaction.RollbackAsync(); - // _logger.LogError(ex, "General exception for TenantId={TenantId}", model.TenantId); - // return StatusCode(500, ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(ex), 500)); - // } - //} + return Ok(ApiResponse.SuccessResponse(newSubscription, "Tenant subscription successfully updated", 200)); + } + catch (DbUpdateException dbEx) + { + await transaction.RollbackAsync(); + _logger.LogError(dbEx, "Database exception updating subscription for TenantId={TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal database error", ExceptionMapper(dbEx), 500)); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "General exception for TenantId={TenantId}", model.TenantId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(ex), 500)); + } + } From cbcae9fb5780e45cc5757432edfed7894f81094e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 11:08:24 +0530 Subject: [PATCH 098/125] Optimized the CreateSubscriptionPlan API --- .../TenantModels/SubscriptionPlan.cs | 2 +- .../Controllers/TenantController.cs | 279 ++++++++---------- 2 files changed, 121 insertions(+), 160 deletions(-) diff --git a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs index e4c1f37..4bdf838 100644 --- a/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs +++ b/Marco.Pms.Model/TenantModels/SubscriptionPlan.cs @@ -10,6 +10,6 @@ public enum PLAN_FREQUENCY { - MONTHLY = 0, QUARTERLY = 1, HALF_MONTHLY = 2, YEARLY = 3 + MONTHLY = 0, QUARTERLY = 1, HALF_YEARLY = 2, YEARLY = 3 } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 21fa0c8..c8e712b 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -69,6 +69,7 @@ namespace Marco.Pms.Services.Controllers /// The number of records to return per page. /// The page number to retrieve. /// A paginated list of tenants matching the criteria. + [HttpGet("list")] public async Task GetTenantList([FromQuery] string? searchString, string? filter, int pageSize = 20, int pageNumber = 1) { @@ -617,7 +618,7 @@ namespace Marco.Pms.Services.Controllers { PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), _ => utcNow // default if unknown }; @@ -845,7 +846,7 @@ namespace Marco.Pms.Services.Controllers { PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddMonths(1), PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddMonths(3), - PLAN_FREQUENCY.HALF_MONTHLY => currentSubscription.EndDate.AddMonths(6), + PLAN_FREQUENCY.HALF_YEARLY => currentSubscription.EndDate.AddMonths(6), PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddMonths(12), _ => currentSubscription.EndDate }; @@ -856,7 +857,7 @@ namespace Marco.Pms.Services.Controllers { PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), _ => utcNow }; @@ -891,7 +892,7 @@ namespace Marco.Pms.Services.Controllers { PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_MONTHLY => utcNow.AddMonths(6), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), _ => utcNow }; @@ -1047,8 +1048,6 @@ namespace Marco.Pms.Services.Controllers } } - - #endregion #region =================================================================== Subscription Plan APIs =================================================================== @@ -1110,183 +1109,81 @@ namespace Marco.Pms.Services.Controllers } } - - + /// + /// Creates a new subscription plan with details for each frequency (monthly, quarterly, half-yearly, yearly). + /// Only employees with root status and 'ManageTenants' permission can create plans. + /// [HttpPost("create/subscription-plan")] - public async Task CreateSubscriptionPlan1([FromBody] SubscriptionPlanDto model) + public async Task CreateSubscriptionPlan([FromBody] SubscriptionPlanDto model) { + // Step 1: Authenticate and check permissions var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); await using var _context = await _dbContextFactory.CreateDbContextAsync(); using var scope = _serviceScopeFactory.CreateScope(); - var _permissionService = scope.ServiceProvider.GetRequiredService(); - // A root user should have access regardless of the specific permission. + // Permission check: root user or explicit ManageTenants permission var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - - if (!hasPermission || !isRootUser) + if (!(hasPermission && isRootUser)) { - _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to create a subscription plan.", loggedInEmployee.Id); return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } + _logger.LogInfo("User {EmployeeId} authorized to create subscription plan.", loggedInEmployee.Id); + + // Step 2: Map DTO to entity and persist the base SubscriptionPlan var plan = _mapper.Map(model); _context.SubscriptionPlans.Add(plan); - List response = new List(); - - if (model.MonthlyPlan != null) - { - var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.MonthlyPlan.CurrencyId); - if (currencyMaster == null) - { - return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); - } - - var monthlyPlan = _mapper.Map(model.MonthlyPlan); - var features = _mapper.Map(model.MonthlyPlan.Features); - - try - { - await _featureDetailsHelper.AddFeatureDetails(features); - } - catch (Exception ex) - { - _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); - } - - monthlyPlan.PlanId = plan.Id; - monthlyPlan.Frequency = PLAN_FREQUENCY.MONTHLY; - monthlyPlan.FeaturesId = features.Id; - monthlyPlan.CreatedById = loggedInEmployee.Id; - monthlyPlan.CreateAt = DateTime.UtcNow; - - _context.SubscriptionPlanDetails.Add(monthlyPlan); - var VM = _mapper.Map(monthlyPlan); - VM.PlanName = plan.PlanName; - VM.Description = plan.Description; - VM.Currency = currencyMaster; - response.Add(VM); - } - - if (model.QuarterlyPlan != null) - { - var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.QuarterlyPlan.CurrencyId); - if (currencyMaster == null) - { - return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); - } - - var quarterlyPlan = _mapper.Map(model.QuarterlyPlan); - var features = _mapper.Map(model.QuarterlyPlan.Features); - - try - { - await _featureDetailsHelper.AddFeatureDetails(features); - } - catch (Exception ex) - { - _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); - } - - quarterlyPlan.PlanId = plan.Id; - quarterlyPlan.Frequency = PLAN_FREQUENCY.QUARTERLY; - quarterlyPlan.FeaturesId = features.Id; - quarterlyPlan.CreatedById = loggedInEmployee.Id; - quarterlyPlan.CreateAt = DateTime.UtcNow; - - _context.SubscriptionPlanDetails.Add(quarterlyPlan); - var VM = _mapper.Map(quarterlyPlan); - VM.PlanName = plan.PlanName; - VM.Description = plan.Description; - VM.Currency = currencyMaster; - response.Add(VM); - } - if (model.HalfYearlyPlan != null) - { - var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.HalfYearlyPlan.CurrencyId); - if (currencyMaster == null) - { - return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); - } - - var halfYearlyPlan = _mapper.Map(model.HalfYearlyPlan); - var features = _mapper.Map(model.HalfYearlyPlan.Features); - - try - { - await _featureDetailsHelper.AddFeatureDetails(features); - } - catch (Exception ex) - { - _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); - } - - halfYearlyPlan.PlanId = plan.Id; - halfYearlyPlan.Frequency = PLAN_FREQUENCY.HALF_MONTHLY; - halfYearlyPlan.FeaturesId = features.Id; - halfYearlyPlan.CreatedById = loggedInEmployee.Id; - halfYearlyPlan.CreateAt = DateTime.UtcNow; - - _context.SubscriptionPlanDetails.Add(halfYearlyPlan); - var VM = _mapper.Map(halfYearlyPlan); - VM.PlanName = plan.PlanName; - VM.Description = plan.Description; - VM.Currency = currencyMaster; - response.Add(VM); - } - if (model.YearlyPlan != null) - { - var currencyMaster = await _context.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.YearlyPlan.CurrencyId); - if (currencyMaster == null) - { - return NotFound(ApiResponse.ErrorResponse("Currency not found", "Currency not found", 404)); - } - - var yearlyPlan = _mapper.Map(model.YearlyPlan); - var features = _mapper.Map(model.YearlyPlan.Features); - - try - { - await _featureDetailsHelper.AddFeatureDetails(features); - } - catch (Exception ex) - { - _logger.LogError(ex, "Exception occured while saving feature in mongoDB"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500)); - } - - yearlyPlan.PlanId = plan.Id; - yearlyPlan.Frequency = PLAN_FREQUENCY.YEARLY; - yearlyPlan.FeaturesId = features.Id; - yearlyPlan.CreatedById = loggedInEmployee.Id; - yearlyPlan.CreateAt = DateTime.UtcNow; - - _context.SubscriptionPlanDetails.Add(yearlyPlan); - var VM = _mapper.Map(yearlyPlan); - VM.PlanName = plan.PlanName; - VM.Description = plan.Description; - VM.Currency = currencyMaster; - response.Add(VM); - } - try { await _context.SaveChangesAsync(); + _logger.LogInfo("Base subscription plan {PlanId} saved by user {EmployeeId}.", plan.Id, loggedInEmployee.Id); } catch (DbUpdateException dbEx) { - _logger.LogError(dbEx, "Database Exception occured while saving subscription plan"); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500)); + _logger.LogError(dbEx, "Database exception occurred while saving the base subscription plan."); + return StatusCode(500, ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(dbEx), 500)); } - return StatusCode(201, ApiResponse.SuccessResponse(response, "Plan Created Successfully", 201)); - } + // Step 3: Prepare tasks for each plan frequency + var frequencies = new[] + { + (model.MonthlyPlan, PLAN_FREQUENCY.MONTHLY), + (model.QuarterlyPlan, PLAN_FREQUENCY.QUARTERLY), + (model.HalfYearlyPlan, PLAN_FREQUENCY.HALF_YEARLY), + (model.YearlyPlan, PLAN_FREQUENCY.YEARLY) + }; + var tasks = frequencies + .Select(f => CreateSubscriptionPlanDetails(f.Item1, plan, loggedInEmployee, f.Item2)) + .ToArray(); + + // Await all frequency tasks + await Task.WhenAll(tasks); + + // Step 4: Collect successful plan details or return errors if any + var responseList = new List(); + for (int i = 0; i < tasks.Length; i++) + { + var result = tasks[i].Result; + if (result.StatusCode == 200 && result.Data != null) + { + responseList.Add(result.Data); + } + // status code 400 - skip, e.g. missing data for this frequency + else if (result.StatusCode != 400) + { + _logger.LogWarning("Failed to create plan details for {Frequency}: {Error}", frequencies[i].Item2, result.Message); + return StatusCode(result.StatusCode, result); + } + } + + _logger.LogInfo("Subscription plan {PlanId} created successfully with {DetailCount} details.", plan.Id, responseList.Count); + return StatusCode(201, ApiResponse.SuccessResponse(responseList, "Plan Created Successfully", 201)); + } #endregion @@ -1347,7 +1244,6 @@ namespace Marco.Pms.Services.Controllers return false; } } - private TenantFilter? TryDeserializeFilter(string? filter) { if (string.IsNullOrWhiteSpace(filter)) @@ -1387,6 +1283,71 @@ namespace Marco.Pms.Services.Controllers return expenseFilter; } + /// + /// Handles the creation and persistence of SubscriptionPlanDetails for a particular frequency. + /// + private async Task> CreateSubscriptionPlanDetails(SubscriptionPlanDetailsDto? model, SubscriptionPlan plan, Employee loggedInEmployee, PLAN_FREQUENCY frequency) + { + if (model == null) + { + _logger.LogInfo("No plan detail provided for {Frequency} - skipping.", frequency); + return ApiResponse.ErrorResponse("Invalid", "No data provided for this frequency", 400); + } + + await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); + + // Fetch currency master record + var currencyMaster = await _dbContext.CurrencyMaster.AsNoTracking().FirstOrDefaultAsync(c => c.Id == model.CurrencyId); + if (currencyMaster == null) + { + _logger.LogWarning("Currency with Id {CurrencyId} not found for plan {PlanId}/{Frequency}.", model.CurrencyId, plan.Id, frequency); + return ApiResponse.ErrorResponse("Currency not found", "Specified currency not found", 404); + } + + // Map to entity and create related feature details + var planDetails = _mapper.Map(model); + var features = _mapper.Map(model.Features); + + try + { + await _featureDetailsHelper.AddFeatureDetails(features); + _logger.LogInfo("FeatureDetails for plan {PlanId}/{Frequency} saved in MongoDB.", plan.Id, frequency); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occurred while saving features in MongoDB for {PlanId}/{Frequency}.", plan.Id, frequency); + return ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(ex), 500); + } + + planDetails.PlanId = plan.Id; + planDetails.Frequency = frequency; + planDetails.FeaturesId = features.Id; + planDetails.CreatedById = loggedInEmployee.Id; + planDetails.CreateAt = DateTime.UtcNow; + + _dbContext.SubscriptionPlanDetails.Add(planDetails); + + // Prepare view model + var VM = _mapper.Map(planDetails); + VM.PlanName = plan.PlanName; + VM.Description = plan.Description; + VM.Features = features; + VM.Currency = currencyMaster; + + try + { + await _dbContext.SaveChangesAsync(); + _logger.LogInfo("Subscription plan details for {PlanId}/{Frequency} saved to SQL.", plan.Id, frequency); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database exception occurred while saving plan details for {PlanId}/{Frequency}.", plan.Id, frequency); + return ApiResponse.ErrorResponse("Internal error occurred", ExceptionMapper(dbEx), 500); + } + + return ApiResponse.SuccessResponse(VM, "Success", 200); + } + #endregion } } From fb1f34f950d161104b0dac42b0b1f32c7e0ac486 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 12:14:18 +0530 Subject: [PATCH 099/125] Added new condition for checking the permission for expense Action API --- Marco.Pms.Services/Service/ExpensesService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index cc3fbaa..cfcac91 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -674,7 +674,7 @@ namespace Marco.Pms.Services.Service var permissionService = scope.ServiceProvider.GetRequiredService(); foreach (var permission in requiredPermissions) { - if (await permissionService.HasPermission(permission.PermissionId, loggedInEmployee.Id)) + if (await permissionService.HasPermission(permission.PermissionId, loggedInEmployee.Id) && model.StatusId != Review) { hasPermission = true; break; @@ -847,7 +847,7 @@ namespace Marco.Pms.Services.Service try { await _context.SaveChangesAsync(); - _logger.LogInfo("Successfully updated project {ProjectId} by user {UserId}.", id, loggedInEmployee.Id); + _logger.LogInfo("Successfully updated Expense {ExpenseId} by user {UserId}.", id, loggedInEmployee.Id); } catch (DbUpdateConcurrencyException ex) { From 6b4e229f6bb273057946b7416e1bf9077ebc8900 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 12:16:46 +0530 Subject: [PATCH 100/125] Added Currency in subscription list VM --- .../ViewModels/Tenant/TenantDetailsVM.cs | 6 +++- .../Controllers/TenantController.cs | 35 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs index d9af662..b174a3a 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs @@ -25,7 +25,11 @@ namespace Marco.Pms.Model.ViewModels.Tenant public bool IsSuperTenant { get; set; } = false; public int ActiveEmployees { get; set; } public int InActiveEmployees { get; set; } - public object? Projects { get; set; } + public int? ActiveProjects { get; set; } + public int? InProgressProjects { get; set; } + public int? OnHoldProjects { get; set; } + public int? InActiveProjects { get; set; } + public int? CompletedProjects { get; set; } public DateTime? ExpiryDate { get; set; } public DateTime? NextBillingDate { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index c8e712b..d5b94b2 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -39,7 +39,13 @@ namespace Marco.Pms.Services.Controllers private readonly UserHelper _userHelper; private readonly FeatureDetailsHelper _featureDetailsHelper; - private readonly static Guid activeStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); + private readonly static Guid projectActiveStatus = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); + private readonly static Guid projectInProgressStatus = Guid.Parse("cdad86aa-8a56-4ff4-b633-9c629057dfef"); + private readonly static Guid projectOnHoldStatus = Guid.Parse("603e994b-a27f-4e5d-a251-f3d69b0498ba"); + private readonly static Guid projectInActiveStatus = Guid.Parse("ef1c356e-0fe0-42df-a5d3-8daee355492d"); + private readonly static Guid projectCompletedStatus = Guid.Parse("33deaef9-9af1-4f2a-b443-681ea0d04f81"); + + private readonly static Guid tenantActiveStatus = Guid.Parse("62b05792-5115-4f99-8ff5-e8374859b191"); private readonly static Guid activePlanStatus = Guid.Parse("cd3a68ea-41fd-42f0-bd0c-c871c7337727"); private readonly static Guid EmployeeFeatureId = Guid.Parse("81ab8a87-8ccd-4015-a917-0627cee6a100"); private readonly static string AdminRoleName = "Admin"; @@ -270,7 +276,11 @@ namespace Marco.Pms.Services.Controllers var planTask = Task.Run(async () => { await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.TenantSubscriptions.AsNoTracking().Where(ts => ts.TenantId == tenant.Id && !ts.IsCancelled && ts.Plan != null).FirstOrDefaultAsync(); + return await _dbContext.TenantSubscriptions + .Include(ts => ts.Plan).ThenInclude(sp => sp!.Plan) + .AsNoTracking() + .Where(ts => ts.TenantId == tenant.Id && ts.Plan != null) + .OrderBy(ts => ts.CreatedBy).ToListAsync(); }); var projectTask = Task.Run(async () => { @@ -279,12 +289,6 @@ namespace Marco.Pms.Services.Controllers .Include(p => p.ProjectStatus) .AsNoTracking() .Where(p => p.TenantId == tenant.Id) - .GroupBy(p => p.ProjectStatusId) - .Select(g => new - { - Status = g.Where(p => p.ProjectStatus != null && p.ProjectStatus.Id == g.Key).Select(p => p.ProjectStatus).FirstOrDefault(), - ProjectsCount = g.Where(p => p.ProjectStatusId == g.Key).Count() - }) .ToListAsync(); }); @@ -292,25 +296,30 @@ namespace Marco.Pms.Services.Controllers var employees = employeeTask.Result; var projects = projectTask.Result; - var currentPlan = planTask.Result; + var plans = planTask.Result; var createdBy = createdByTask.Result; var activeEmployeesCount = employees.Where(e => e.IsActive).Count(); var inActiveEmployeesCount = employees.Where(e => !e.IsActive).Count(); + var currentPlan = plans.FirstOrDefault(ts => !ts.IsCancelled); var expiryDate = currentPlan?.EndDate; var nextBillingDate = currentPlan?.NextBillingDate; var response = _mapper.Map(tenant); response.ActiveEmployees = activeEmployeesCount; response.InActiveEmployees = inActiveEmployeesCount; - response.Projects = projects; + response.ActiveProjects = projects.Where(p => p.ProjectStatusId == projectActiveStatus).Count(); + response.InProgressProjects = projects.Where(p => p.ProjectStatusId == projectInProgressStatus).Count(); + response.OnHoldProjects = projects.Where(p => p.ProjectStatusId == projectOnHoldStatus).Count(); + response.InActiveProjects = projects.Where(p => p.ProjectStatusId == projectInActiveStatus).Count(); + response.CompletedProjects = projects.Where(p => p.ProjectStatusId == projectCompletedStatus).Count(); response.ExpiryDate = expiryDate; response.NextBillingDate = nextBillingDate; response.CreatedBy = createdBy; - return Ok(); + return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); } // POST api/ @@ -403,7 +412,7 @@ namespace Marco.Pms.Services.Controllers var tenant = _mapper.Map(model); - tenant.TenantStatusId = activeStatus; + tenant.TenantStatusId = tenantActiveStatus; tenant.CreatedById = loggedInEmployee.Id; tenant.IsSuperTenant = false; @@ -1066,7 +1075,7 @@ namespace Marco.Pms.Services.Controllers await using var _context = await _dbContextFactory.CreateDbContextAsync(); // Load subscription plans with optional frequency filtering - IQueryable query = _context.SubscriptionPlanDetails.Include(sp => sp.Plan); + IQueryable query = _context.SubscriptionPlanDetails.Include(sp => sp.Plan).Include(sp => sp.Currency); if (frequency.HasValue) { From c210e6e3f26779f4058172072086200ab5b2d376 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 12:41:32 +0530 Subject: [PATCH 101/125] Added the Tenant Profile API --- .../Tenant/SubscriptionPlanDetailsVM.cs | 19 ++++++++++--------- .../ViewModels/Tenant/TenantDetailsVM.cs | 1 + .../Controllers/TenantController.cs | 5 ++++- .../MappingProfiles/MappingProfile.cs | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs index f30f99e..71012c8 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs @@ -1,5 +1,6 @@ using Marco.Pms.Model.Master; -using Marco.Pms.Model.TenantModels.MongoDBModel; +using Marco.Pms.Model.TenantModels; +using Marco.Pms.Model.ViewModels.Activities; namespace Marco.Pms.Model.ViewModels.Tenant { @@ -8,14 +9,14 @@ namespace Marco.Pms.Model.ViewModels.Tenant public Guid Id { get; set; } public string? PlanName { get; set; } public string? Description { get; set; } - public double PriceQuarterly { get; set; } - public double PriceMonthly { get; set; } - public double PriceHalfYearly { get; set; } - public double PriceYearly { get; set; } - public int TrialDays { get; set; } - public double MaxUser { get; set; } - public double MaxStorage { get; set; } - public FeatureDetails? Features { get; set; } + public double Price { get; set; } + public PLAN_FREQUENCY Frequency { get; set; } + public DateTime StartDate { get; set; } + public DateTime EndDate { get; set; } + public DateTime CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + public BasicEmployeeVM? updatedBy { get; set; } public CurrencyMaster? Currency { get; set; } } } diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs index b174a3a..7edbb45 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs @@ -33,5 +33,6 @@ namespace Marco.Pms.Model.ViewModels.Tenant public DateTime? ExpiryDate { get; set; } public DateTime? NextBillingDate { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } + public List? SubscriptionHistery { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index d5b94b2..fa48dce 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -277,6 +277,9 @@ namespace Marco.Pms.Services.Controllers { await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); return await _dbContext.TenantSubscriptions + .Include(sp => sp!.CreatedBy) + .Include(sp => sp!.UpdatedBy) + .Include(sp => sp!.Currency) .Include(ts => ts.Plan).ThenInclude(sp => sp!.Plan) .AsNoTracking() .Where(ts => ts.TenantId == tenant.Id && ts.Plan != null) @@ -317,7 +320,7 @@ namespace Marco.Pms.Services.Controllers response.ExpiryDate = expiryDate; response.NextBillingDate = nextBillingDate; response.CreatedBy = createdBy; - + response.SubscriptionHistery = _mapper.Map>(plans); return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index adc7214..47552a4 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -43,6 +43,23 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Description, opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Description : "") ); + CreateMap() + .ForMember( + dest => dest.PlanName, + opt => opt.MapFrom(src => src.Plan!.Plan != null ? src.Plan.Plan.PlanName : "") + ) + .ForMember( + dest => dest.Description, + opt => opt.MapFrom(src => src.Plan!.Plan != null ? src.Plan.Plan.Description : "") + ) + .ForMember( + dest => dest.Price, + opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Price : 0) + ) + .ForMember( + dest => dest.Frequency, + opt => opt.MapFrom(src => src.Plan != null ? src.Plan.Frequency : PLAN_FREQUENCY.MONTHLY) + ); CreateMap(); CreateMap(); From 9ef7946d8978d43575e25164bcc46b4778ff689b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 15:05:48 +0530 Subject: [PATCH 102/125] Teannt porfile API Optimized --- .../Controllers/TenantController.cs | 158 +++++++++++++++++- 1 file changed, 150 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index fa48dce..5a7b390 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -57,13 +57,13 @@ namespace Marco.Pms.Services.Controllers UserHelper userHelper, FeatureDetailsHelper featureDetailsHelper) { - _dbContextFactory = dbContextFactory; - _serviceScopeFactory = serviceScopeFactory; - _logger = logger; - _userManager = userManager; - _mapper = mapper; - _userHelper = userHelper; - _featureDetailsHelper = featureDetailsHelper; + _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); ; + _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); ; + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); ; + _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); ; + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); ; + _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); ; + _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); ; } #region =================================================================== Tenant APIs =================================================================== @@ -211,7 +211,7 @@ namespace Marco.Pms.Services.Controllers // GET api//5 [HttpGet("details/{id}")] - public async Task GetDetails(Guid id) + private async Task GetTenantDetails(Guid id) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -325,6 +325,148 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); } + [HttpGet("details/{id}")] + public async Task GetTenantDetailsAsync(Guid id) + { + _logger.LogInfo("GetTenantDetails started for TenantId: {TenantId}", id); + + // Get currently logged-in employee info + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("No logged-in employee found for the request."); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + } + + // Check permissions using a single service scope to avoid overhead + bool hasManagePermission, hasModifyPermission, hasViewPermission; + using (var scope = _serviceScopeFactory.CreateScope()) + { + var permissionService = scope.ServiceProvider.GetRequiredService(); + + var manageTask = permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + var modifyTask = permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); + var viewTask = permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id); + + await Task.WhenAll(manageTask, modifyTask, viewTask); + + hasManagePermission = manageTask.Result; + hasModifyPermission = modifyTask.Result; + hasViewPermission = viewTask.Result; + } + + if (!hasManagePermission && !hasModifyPermission && !hasViewPermission) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to access tenant details without the required permissions.", loggedInEmployee.Id); + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + // Create a single DbContext for main tenant fetch and related data requests + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + + // Fetch tenant details with related Industry and TenantStatus in a single query + var tenant = await _context.Tenants + .Include(t => t.Industry) + .Include(t => t.TenantStatus) + .AsNoTracking() + .FirstOrDefaultAsync(t => t.Id == id); + + if (tenant == null) + { + _logger.LogWarning("Tenant {TenantId} not found in database", id); + return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + } + _logger.LogInfo("Tenant {TenantId} found.", tenant.Id); + + // Fetch dependent data in parallel to improve performance + var employeesTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees + .Include(e => e.ApplicationUser) + .Where(e => e.TenantId == tenant.Id) + .AsNoTracking() + .ToListAsync(); + }); + + var createdByTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees + .AsNoTracking() + .Where(e => e.Id == tenant.CreatedById) + .Select(e => _mapper.Map(e)) + .FirstOrDefaultAsync(); + }); + + var plansTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.TenantSubscriptions + .Include(sp => sp.CreatedBy) + .ThenInclude(e => e!.JobRole) + .Include(sp => sp.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Include(sp => sp.Currency) + .Include(ts => ts.Plan).ThenInclude(sp => sp.Plan) + .Where(ts => ts.TenantId == tenant.Id && ts.Plan != null) + .AsNoTracking() + .OrderBy(ts => ts.CreatedBy) + .ToListAsync(); + }); + + var projectsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Projects + .Include(p => p.ProjectStatus) + .Where(p => p.TenantId == tenant.Id) + .AsNoTracking() + .ToListAsync(); + }); + + await Task.WhenAll(employeesTask, createdByTask, plansTask, projectsTask); + + var employees = employeesTask.Result; + var createdBy = createdByTask.Result; + var plans = plansTask.Result; + var projects = projectsTask.Result; + + // Calculate active/inactive employees count + var activeEmployeesCount = employees.Count(e => e.IsActive); + var inActiveEmployeesCount = employees.Count - activeEmployeesCount; + + // Filter current active (non-cancelled) subscription plan + var currentPlan = plans.FirstOrDefault(ts => !ts.IsCancelled); + var expiryDate = currentPlan?.EndDate; + var nextBillingDate = currentPlan?.NextBillingDate; + + // Map Tenant entity to TenantDetailsVM response model + var response = _mapper.Map(tenant); + response.ActiveEmployees = activeEmployeesCount; + response.InActiveEmployees = inActiveEmployeesCount; + + // Count projects by status + response.ActiveProjects = projects.Count(p => p.ProjectStatusId == projectActiveStatus); + response.InProgressProjects = projects.Count(p => p.ProjectStatusId == projectInProgressStatus); + response.OnHoldProjects = projects.Count(p => p.ProjectStatusId == projectOnHoldStatus); + response.InActiveProjects = projects.Count(p => p.ProjectStatusId == projectInActiveStatus); + response.CompletedProjects = projects.Count(p => p.ProjectStatusId == projectCompletedStatus); + + response.ExpiryDate = expiryDate; + response.NextBillingDate = nextBillingDate; + response.CreatedBy = createdBy; + + // Map subscription history plans to DTO + response.SubscriptionHistery = _mapper.Map>(plans); + + _logger.LogInfo("Tenant details fetched successfully for TenantId: {TenantId}", tenant.Id); + + return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); + } + + // POST api/ [HttpPost("create")] public async Task CreateTenant([FromBody] CreateTenantDto model) From f02eb32143ea41452f17182e6838ce8eca779f35 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 6 Aug 2025 15:10:55 +0530 Subject: [PATCH 103/125] Changed status code 401 to 403 --- .../Controllers/TenantController.cs | 121 +----------------- 1 file changed, 3 insertions(+), 118 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 5a7b390..8df2fc9 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -210,121 +210,6 @@ namespace Marco.Pms.Services.Controllers } // GET api//5 - [HttpGet("details/{id}")] - private async Task GetTenantDetails(Guid id) - { - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - - await using var _context = await _dbContextFactory.CreateDbContextAsync(); - - var manageTenantsTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var _permissionService = scope.ServiceProvider.GetRequiredService(); - return await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - }); - var modifyTenantTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var _permissionService = scope.ServiceProvider.GetRequiredService(); - return await _permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); - }); - var viewTenantTask = Task.Run(async () => - { - using var scope = _serviceScopeFactory.CreateScope(); - var _permissionService = scope.ServiceProvider.GetRequiredService(); - return await _permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id); - }); - - await Task.WhenAll(manageTenantsTask, modifyTenantTask, viewTenantTask); - - var hasManageTenantsPermission = manageTenantsTask.Result; - var hasModifyTenantPermission = modifyTenantTask.Result; - var hasViewTenantPermission = viewTenantTask.Result; - - if (!hasManageTenantsPermission && !hasModifyTenantPermission && !hasViewTenantPermission) - { - _logger.LogWarning("Permission denied: User {EmployeeId} attempted to add subscription without permission or root access.", - loggedInEmployee.Id); - - return StatusCode(403, - ApiResponse.ErrorResponse("Access denied", - "User does not have the required permissions for this action.", 403)); - } - - var tenant = await _context.Tenants - .Include(t => t.Industry) - .Include(t => t.TenantStatus) - .AsNoTracking() - .FirstOrDefaultAsync(t => t.Id == id); - if (tenant == null) - { - _logger.LogWarning("Tenant {TenantId} not found in database", id); - return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); - } - - var employeeTask = Task.Run(async () => - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.Employees.Include(e => e.ApplicationUser).AsNoTracking().Where(e => e.TenantId == tenant.Id).ToListAsync(); - }); - var createdByTask = Task.Run(async () => - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.Employees.AsNoTracking().Where(e => e.Id == tenant.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefaultAsync(); - }); - var planTask = Task.Run(async () => - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.TenantSubscriptions - .Include(sp => sp!.CreatedBy) - .Include(sp => sp!.UpdatedBy) - .Include(sp => sp!.Currency) - .Include(ts => ts.Plan).ThenInclude(sp => sp!.Plan) - .AsNoTracking() - .Where(ts => ts.TenantId == tenant.Id && ts.Plan != null) - .OrderBy(ts => ts.CreatedBy).ToListAsync(); - }); - var projectTask = Task.Run(async () => - { - await using var _dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await _dbContext.Projects - .Include(p => p.ProjectStatus) - .AsNoTracking() - .Where(p => p.TenantId == tenant.Id) - .ToListAsync(); - }); - - await Task.WhenAll(employeeTask, projectTask, planTask, createdByTask); - - var employees = employeeTask.Result; - var projects = projectTask.Result; - var plans = planTask.Result; - var createdBy = createdByTask.Result; - - var activeEmployeesCount = employees.Where(e => e.IsActive).Count(); - var inActiveEmployeesCount = employees.Where(e => !e.IsActive).Count(); - - var currentPlan = plans.FirstOrDefault(ts => !ts.IsCancelled); - var expiryDate = currentPlan?.EndDate; - var nextBillingDate = currentPlan?.NextBillingDate; - - var response = _mapper.Map(tenant); - response.ActiveEmployees = activeEmployeesCount; - response.InActiveEmployees = inActiveEmployeesCount; - response.ActiveProjects = projects.Where(p => p.ProjectStatusId == projectActiveStatus).Count(); - response.InProgressProjects = projects.Where(p => p.ProjectStatusId == projectInProgressStatus).Count(); - response.OnHoldProjects = projects.Where(p => p.ProjectStatusId == projectOnHoldStatus).Count(); - response.InActiveProjects = projects.Where(p => p.ProjectStatusId == projectInActiveStatus).Count(); - response.CompletedProjects = projects.Where(p => p.ProjectStatusId == projectCompletedStatus).Count(); - response.ExpiryDate = expiryDate; - response.NextBillingDate = nextBillingDate; - response.CreatedBy = createdBy; - response.SubscriptionHistery = _mapper.Map>(plans); - - return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); - } - [HttpGet("details/{id}")] public async Task GetTenantDetailsAsync(Guid id) { @@ -335,7 +220,7 @@ namespace Marco.Pms.Services.Controllers if (loggedInEmployee == null) { _logger.LogWarning("No logged-in employee found for the request."); - return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + return StatusCode(403, ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 403)); } // Check permissions using a single service scope to avoid overhead @@ -485,7 +370,7 @@ namespace Marco.Pms.Services.Controllers if (loggedInEmployee == null) { // This case should ideally be handled by an [Authorize] attribute, but it's good practice to double-check. - return Unauthorized(ApiResponse.ErrorResponse("Authentication required", "User is not logged in.", 401)); + return StatusCode(403, ApiResponse.ErrorResponse("Authentication required", "User is not logged in.", 403)); } var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); @@ -729,7 +614,7 @@ namespace Marco.Pms.Services.Controllers if (loggedInEmployee == null) { _logger.LogWarning("No logged-in employee found."); - return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 401)); + return StatusCode(403, ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 403)); } await using var _context = await _dbContextFactory.CreateDbContextAsync(); From 9c6bd2c05390d4aafa72c958af1cc81e032c2677 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 7 Aug 2025 09:45:03 +0530 Subject: [PATCH 104/125] Added update tenant API in tenant controller --- .../Dtos/Tenant/UpdateTenantDto.cs | 21 ++++ .../Controllers/TenantController.cs | 99 ++++++++++++++++++- .../MappingProfiles/MappingProfile.cs | 9 ++ 3 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs diff --git a/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs new file mode 100644 index 0000000..7578ecb --- /dev/null +++ b/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs @@ -0,0 +1,21 @@ +namespace Marco.Pms.Model.Dtos.Tenant +{ + public class UpdateTenantDto + { + public Guid Id { get; set; } + public required string FirstName { get; set; } + public required string LastName { get; set; } + public string? Description { get; set; } + public string? DomainName { get; set; } + public required string BillingAddress { get; set; } + public string? TaxId { get; set; } + public string? logoImage { get; set; } + public required string OrganizationName { get; set; } + public string? OfficeNumber { get; set; } + public required string ContactNumber { get; set; } + //public required DateTime OnBoardingDate { get; set; } + public required string OrganizationSize { get; set; } + public required Guid IndustryId { get; set; } + public required string Reference { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 8df2fc9..ad1b874 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -294,7 +294,7 @@ namespace Marco.Pms.Services.Controllers .Include(sp => sp.UpdatedBy) .ThenInclude(e => e!.JobRole) .Include(sp => sp.Currency) - .Include(ts => ts.Plan).ThenInclude(sp => sp.Plan) + .Include(ts => ts.Plan).ThenInclude(sp => sp!.Plan) .Where(ts => ts.TenantId == tenant.Id && ts.Plan != null) .AsNoTracking() .OrderBy(ts => ts.CreatedBy) @@ -587,12 +587,103 @@ namespace Marco.Pms.Services.Controllers } } - // PUT api//5 - [HttpPut("{id}")] - public void Put(int id, [FromBody] string value) + /// + /// Updates tenant and root employee details for a specified tenant ID. + /// + /// ID of the tenant to update + /// Details to update + /// Result of the operation + + [HttpPut("edit/{id}")] + public async Task UpdateTenant(Guid id, [FromBody] UpdateTenantDto model) { + _logger.LogInfo("UpdateTenant called for TenantId: {TenantId} by user.", id); + + // 1. Retrieve the logged-in employee information + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("Unauthorized access - User not logged in."); + return StatusCode(403, ApiResponse.ErrorResponse("Unauthorized", "User must be logged in.", 403)); + } + + // 2. Check permissions using a single service scope to avoid overhead + bool hasManagePermission, hasModifyPermission; + using (var scope = _serviceScopeFactory.CreateScope()) + { + var permissionService = scope.ServiceProvider.GetRequiredService(); + + var manageTask = permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + var modifyTask = permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); + + await Task.WhenAll(manageTask, modifyTask); + + hasManagePermission = manageTask.Result; + hasModifyPermission = modifyTask.Result; + } + + if (!hasManagePermission && !hasModifyPermission) + { + _logger.LogWarning("Access denied: User {EmployeeId} lacks required permissions for UpdateTenant on TenantId: {TenantId}.", loggedInEmployee.Id, id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } + + // 3. Use a single DbContext instance for data access + await using var context = await _dbContextFactory.CreateDbContextAsync(); + + // 4. Fetch tenant (with related Industry, TenantStatus), tracking enabled for updates + var tenant = await context.Tenants + .Include(t => t.Industry) + .Include(t => t.TenantStatus) + .FirstOrDefaultAsync(t => t.Id == id); + + if (tenant == null) + { + _logger.LogWarning("Tenant not found: ID {TenantId}", id); + return NotFound(ApiResponse.ErrorResponse("Tenant not found", "Tenant not found", 404)); + } + + _logger.LogInfo("Tenant {TenantId} fetched for update.", tenant.Id); + + // 5. Map update DTO properties to the tenant entity + _mapper.Map(model, tenant); + + // 6. Fetch root employee for the tenant (includes ApplicationUser) + var rootEmployee = await context.Employees + .Include(e => e.ApplicationUser) + .FirstOrDefaultAsync(e => e.TenantId == tenant.Id && e.ApplicationUser != null && (e.ApplicationUser.IsRootUser ?? false)); + + if (rootEmployee == null) + { + _logger.LogWarning("Root employee not found for tenant {TenantId}", id); + return NotFound(ApiResponse.ErrorResponse("Root employee not found", "Root employee not found", 404)); + } + + // 7. Update root employee details + rootEmployee.FirstName = model.FirstName; + rootEmployee.LastName = model.LastName; + rootEmployee.PhoneNumber = model.ContactNumber; + rootEmployee.CurrentAddress = model.BillingAddress; + + // 8. Save changes to DB + try + { + await context.SaveChangesAsync(); + _logger.LogInfo("Tenant {TenantId} and root employee updated successfully.", tenant.Id); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error updating Tenant {TenantId} or root employee.", tenant.Id); + return StatusCode(500, ApiResponse.ErrorResponse("Error updating tenant", "Unexpected error occurred while updating tenant.", 500)); + } + + // 9. Map updated tenant to ViewModel for response + var response = _mapper.Map(tenant); + + return Ok(ApiResponse.SuccessResponse(response, "Tenant updated successfully", 200)); } + // DELETE api//5 [HttpDelete("{id}")] public void Delete(int id) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 47552a4..c390c3c 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -33,6 +33,15 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Name, opt => opt.MapFrom(src => src.OrganizationName) ); + CreateMap() + .ForMember( + dest => dest.ContactName, + opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}") + ) + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.OrganizationName) + ); CreateMap() .ForMember( From 9b241a0c700bad6193b110474a66e6b4ded4b919 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 7 Aug 2025 15:03:52 +0530 Subject: [PATCH 105/125] Made MPIN to be 4 digit --- 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 429a38b..67dd74a 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -750,7 +750,7 @@ namespace MarcoBMS.Services.Controllers .FirstOrDefaultAsync(e => e.Id == generateMPINDto.EmployeeId && e.TenantId == tenantId); // Validate employee and MPIN input - if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 6 || !generateMPINDto.MPIN.All(char.IsDigit)) + if (requestEmployee == null || string.IsNullOrWhiteSpace(generateMPINDto.MPIN) || generateMPINDto.MPIN.Length != 4 || !generateMPINDto.MPIN.All(char.IsDigit)) { _logger.LogWarning("Employee {EmployeeId} provided invalid information to generate MPIN", loggedInEmployee.Id); return BadRequest(ApiResponse.ErrorResponse("Provided invalid information", "Provided invalid information", 400)); From 7f0dd1c08aed11ae8579f7de095e6f1407775a7c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 8 Aug 2025 12:20:02 +0530 Subject: [PATCH 106/125] Sloved the rebase issue --- Marco.Pms.DataAccess/Data/ApplicationDbContext.cs | 2 -- Marco.Pms.Services/Program.cs | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index f1a1700..f9695d1 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -849,8 +849,6 @@ namespace Marco.Pms.DataAccess.Data ); - ); - modelBuilder.Entity().HasData( new CurrencyMaster { diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index a5c9ac8..4ca90bc 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,3 +1,4 @@ +using Marco.Pms.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers; using Marco.Pms.Helpers.CacheHelper; From ac0843ffe7807899b37fb222718f1212e5f76819 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 11 Aug 2025 11:05:21 +0530 Subject: [PATCH 107/125] Solved migration error occured while rebasing --- .../Data/ApplicationDbContext.cs | 20 - ...61007_Added_Subscription_Related_Tables.cs | 38 +- .../ApplicationDbContextModelSnapshot.cs | 347 +++++++----------- Marco.Pms.Model/TenantModels/Tenant.cs | 2 +- Marco.Pms.Model/Utilities/TenantRelation.cs | 2 +- .../Controllers/TenantController.cs | 1 - .../MappingProfiles/MappingProfile.cs | 1 - Marco.Pms.Services/Service/ProjectServices.cs | 2 +- 8 files changed, 140 insertions(+), 273 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index f9695d1..37b8c1c 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -11,7 +11,6 @@ using Marco.Pms.Model.Mail; using Marco.Pms.Model.Master; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; -using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.Utilities; using Microsoft.AspNetCore.Http; @@ -718,25 +717,6 @@ namespace Marco.Pms.DataAccess.Data } ); - modelBuilder.Entity().HasData(new Module - { - Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), - Name = "Project", - Description = "Project Module", - Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02" - }, new Module - { - Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), - Name = "Employee", - Description = "Employee Module", - Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637" - }, new Module - { - Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), - Name = "Masters", - Description = "Masters Module", - Key = "504ec132-e6a9-422f-8f85-050602cfce05" - }); modelBuilder.Entity().HasData( new SubscriptionStatus { diff --git a/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs index 5de2a37..73e2ee4 100644 --- a/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs +++ b/Marco.Pms.DataAccess/Migrations/20250804061007_Added_Subscription_Related_Tables.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -13,25 +12,6 @@ namespace Marco.Pms.DataAccess.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { - migrationBuilder.CreateTable( - name: "CurrencyMaster", - columns: table => new - { - Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), - CurrencyCode = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - CurrencyName = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Symbol = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - IsActive = table.Column(type: "tinyint(1)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CurrencyMaster", x => x.Id); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.CreateTable( name: "SubscriptionStatus", columns: table => new @@ -154,20 +134,6 @@ namespace Marco.Pms.DataAccess.Migrations }) .Annotation("MySql:CharSet", "utf8mb4"); - migrationBuilder.InsertData( - table: "CurrencyMaster", - columns: new[] { "Id", "CurrencyCode", "CurrencyName", "IsActive", "Symbol" }, - values: new object[,] - { - { new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), "JPY", "Japanese Yen", true, "¥" }, - { new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), "USD", "US Dollar", true, "$" }, - { new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), "GBP", "Pound Sterling", true, "£" }, - { new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), "EUR", "Euro", true, "€" }, - { new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), "INR", "Indian Rupee", true, "₹" }, - { new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), "CNY", "Chinese Yuan (Renminbi)", true, "¥" }, - { new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), "RUB", "Russian Ruble", true, "₽" } - }); - migrationBuilder.InsertData( table: "SubscriptionStatus", columns: new[] { "Id", "Name" }, @@ -236,8 +202,6 @@ namespace Marco.Pms.DataAccess.Migrations migrationBuilder.DropTable( name: "SubscriptionStatus"); - migrationBuilder.DropTable( - name: "CurrencyMaster"); } } } diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 41db417..ac6dd3f 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1235,61 +1235,6 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("RolePermissionMappings"); }); - modelBuilder.Entity("Marco.Pms.Model.TenantModel.Tenant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("char(36)"); - - b.Property("ContactName") - .HasColumnType("longtext"); - - b.Property("ContactNumber") - .HasColumnType("longtext"); - - b.Property("Description") - .HasColumnType("longtext"); - - b.Property("DomainName") - .HasColumnType("longtext"); - - b.Property("IndustryId") - .HasColumnType("char(36)"); - - b.Property("IsActive") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .HasColumnType("longtext"); - - b.Property("OnBoardingDate") - .HasColumnType("datetime(6)"); - - b.Property("OragnizationSize") - .HasColumnType("longtext"); - - b.HasKey("Id"); - - b.HasIndex("IndustryId"); - - b.ToTable("Tenants"); - - b.HasData( - new - { - Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), - ContactName = "Admin", - ContactNumber = "123456789", - Description = "", - DomainName = "www.marcobms.org", - IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), - IsActive = true, - Name = "MarcoBMS", - OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), - OragnizationSize = "100-200" - }); - }); - modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => { b.Property("Id") @@ -3151,7 +3096,87 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("JobRoles"); }); - modelBuilder.Entity("Marco.Pms.Model.TenantModel.Tenant", b => + 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() @@ -3247,86 +3272,6 @@ namespace Marco.Pms.DataAccess.Migrations }); }); - 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.TenantSubscriptions", b => { b.Property("Id") @@ -3667,7 +3612,7 @@ namespace Marco.Pms.DataAccess.Migrations .WithMany() .HasForeignKey("ReportedById"); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3710,7 +3655,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3737,7 +3682,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3758,7 +3703,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3787,7 +3732,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3810,7 +3755,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Authentication.MPINDetails", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3821,7 +3766,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Authentication.OTPDetails", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3848,7 +3793,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3871,7 +3816,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3911,7 +3856,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3945,7 +3890,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -3989,7 +3934,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4023,7 +3968,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4064,7 +4009,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4089,7 +4034,7 @@ namespace Marco.Pms.DataAccess.Migrations .WithMany() .HasForeignKey("JobRoleId"); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4116,7 +4061,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4131,7 +4076,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4166,15 +4111,6 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired(); }); - modelBuilder.Entity("Marco.Pms.Model.TenantModel.Tenant", b => - { - b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") - .WithMany() - .HasForeignKey("IndustryId"); - - b.Navigation("Industry"); - }); - modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => { b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") @@ -4189,7 +4125,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4210,7 +4146,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4279,7 +4215,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4314,7 +4250,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4339,7 +4275,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4409,7 +4345,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4432,7 +4368,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4485,7 +4421,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4496,7 +4432,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4518,18 +4454,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.PaymentModeMatser", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Tenant"); - }); - - modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => - { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4540,7 +4465,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4551,7 +4476,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4562,7 +4487,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4579,7 +4504,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4598,7 +4523,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4623,7 +4548,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4644,7 +4569,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4663,7 +4588,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4690,7 +4615,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", null) + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4699,7 +4624,7 @@ namespace Marco.Pms.DataAccess.Migrations modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => { - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) @@ -4708,23 +4633,6 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Tenant"); }); - modelBuilder.Entity("Marco.Pms.Model.TenantModel.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.SubscriptionPlanDetails", b => { b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") @@ -4758,6 +4666,23 @@ namespace Marco.Pms.DataAccess.Migrations 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") @@ -4784,7 +4709,7 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.TenantModel.Tenant", "Tenant") + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") .OnDelete(DeleteBehavior.Cascade) diff --git a/Marco.Pms.Model/TenantModels/Tenant.cs b/Marco.Pms.Model/TenantModels/Tenant.cs index d8b1567..8cb3640 100644 --- a/Marco.Pms.Model/TenantModels/Tenant.cs +++ b/Marco.Pms.Model/TenantModels/Tenant.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using System.ComponentModel.DataAnnotations.Schema; -namespace Marco.Pms.Model.TenantModel +namespace Marco.Pms.Model.TenantModels { public class Tenant { diff --git a/Marco.Pms.Model/Utilities/TenantRelation.cs b/Marco.Pms.Model/Utilities/TenantRelation.cs index 76e6974..eed9917 100644 --- a/Marco.Pms.Model/Utilities/TenantRelation.cs +++ b/Marco.Pms.Model/Utilities/TenantRelation.cs @@ -1,4 +1,4 @@ -using Marco.Pms.Model.TenantModel; +using Marco.Pms.Model.TenantModels; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using System.ComponentModel.DataAnnotations.Schema; diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index ad1b874..e6a23e9 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -6,7 +6,6 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; -using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.Utilities; diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 1503de1..4a40536 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -12,7 +12,6 @@ using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; -using Marco.Pms.Model.TenantModel; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.ViewModels.Activities; diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 3117674..9f09654 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -7,7 +7,7 @@ using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.Projects; -using Marco.Pms.Model.TenantModel; +using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Employee; using Marco.Pms.Model.ViewModels.Projects; From 21e1a7322cc53edf420de64c13c01af87651023b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 11 Aug 2025 11:43:46 +0530 Subject: [PATCH 108/125] Saving the tenant subscription modification logs in mongo DB --- .../FeatureDetailsHelper.cs | 2 +- Marco.Pms.Services/Controllers/TenantController.cs | 13 ++++++++++++- Marco.Pms.Services/Program.cs | 1 - 3 files changed, 13 insertions(+), 3 deletions(-) rename Marco.Pms.Helpers/{CacheHelper => Utility}/FeatureDetailsHelper.cs (98%) diff --git a/Marco.Pms.Helpers/CacheHelper/FeatureDetailsHelper.cs b/Marco.Pms.Helpers/Utility/FeatureDetailsHelper.cs similarity index 98% rename from Marco.Pms.Helpers/CacheHelper/FeatureDetailsHelper.cs rename to Marco.Pms.Helpers/Utility/FeatureDetailsHelper.cs index da17988..b8d4096 100644 --- a/Marco.Pms.Helpers/CacheHelper/FeatureDetailsHelper.cs +++ b/Marco.Pms.Helpers/Utility/FeatureDetailsHelper.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using MongoDB.Driver; -namespace Marco.Pms.CacheHelper +namespace Marco.Pms.Helpers.Utility { public class FeatureDetailsHelper { diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index e6a23e9..64f6a17 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -1,9 +1,10 @@ using AutoMapper; -using Marco.Pms.CacheHelper; using Marco.Pms.DataAccess.Data; +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.MongoDBModels.Utility; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Roles; using Marco.Pms.Model.TenantModels; @@ -922,6 +923,7 @@ namespace Marco.Pms.Services.Controllers // 3. Get PermissionServices from DI inside a fresh scope (rarely needed, but retained for your design). using var scope = _serviceScopeFactory.CreateScope(); var permissionService = scope.ServiceProvider.GetRequiredService(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); // 4. Check user permissions: must be both Root user and have ManageTenants permission. var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; @@ -967,6 +969,7 @@ namespace Marco.Pms.Services.Controllers // 6. If the tenant already has this plan, extend/renew it. if (currentSubscription != null && currentSubscription.PlanId == subscriptionPlan.Id) { + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(currentSubscription); DateTime newEndDate; // 6a. If the subscription is still active, extend from current EndDate; else start from now. if (currentSubscription.EndDate.Date >= utcNow.Date) @@ -1009,6 +1012,14 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Subscription renewed: Tenant={TenantId}, Plan={PlanId}, NewEnd={EndDate}", model.TenantId, model.PlanId, newEndDate); + await _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = currentSubscription.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, "SubscriptionPlanModificationLog"); + return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); } diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index 4ca90bc..a5c9ac8 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -1,4 +1,3 @@ -using Marco.Pms.CacheHelper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers; using Marco.Pms.Helpers.CacheHelper; From d9a454ca28b25c5454d26a7688f3cc9a7c28fbe2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 12 Aug 2025 14:23:53 +0530 Subject: [PATCH 109/125] Added the update logs in mongoDB while updating tenant --- .../Dtos/Tenant/UpdateTenantDto.cs | 2 -- .../Controllers/TenantController.cs | 30 ++++++++++++++++++- .../MappingProfiles/MappingProfile.cs | 4 --- .../appsettings.Development.json | 2 +- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs b/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs index 7578ecb..0d15c03 100644 --- a/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs +++ b/Marco.Pms.Model/Dtos/Tenant/UpdateTenantDto.cs @@ -10,10 +10,8 @@ public required string BillingAddress { get; set; } public string? TaxId { get; set; } public string? logoImage { get; set; } - public required string OrganizationName { get; set; } public string? OfficeNumber { get; set; } public required string ContactNumber { get; set; } - //public required DateTime OnBoardingDate { get; set; } public required string OrganizationSize { get; set; } public required Guid IndustryId { get; set; } public required string Reference { get; set; } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 64f6a17..983c4ca 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -609,9 +609,11 @@ namespace Marco.Pms.Services.Controllers // 2. Check permissions using a single service scope to avoid overhead bool hasManagePermission, hasModifyPermission; + UtilityMongoDBHelper _updateLogHelper; using (var scope = _serviceScopeFactory.CreateScope()) { var permissionService = scope.ServiceProvider.GetRequiredService(); + _updateLogHelper = scope.ServiceProvider.GetRequiredService(); var manageTask = permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); var modifyTask = permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); @@ -635,6 +637,7 @@ namespace Marco.Pms.Services.Controllers var tenant = await context.Tenants .Include(t => t.Industry) .Include(t => t.TenantStatus) + .AsNoTracking() .FirstOrDefaultAsync(t => t.Id == id); if (tenant == null) @@ -645,6 +648,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Tenant {TenantId} fetched for update.", tenant.Id); + var tenantObject = _updateLogHelper.EntityToBsonDocument(tenant); // 5. Map update DTO properties to the tenant entity _mapper.Map(model, tenant); @@ -658,7 +662,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogWarning("Root employee not found for tenant {TenantId}", id); return NotFound(ApiResponse.ErrorResponse("Root employee not found", "Root employee not found", 404)); } - + var employeeobject = _updateLogHelper.EntityToBsonDocument(rootEmployee); // 7. Update root employee details rootEmployee.FirstName = model.FirstName; rootEmployee.LastName = model.LastName; @@ -668,6 +672,7 @@ namespace Marco.Pms.Services.Controllers // 8. Save changes to DB try { + context.Tenants.Update(tenant); await context.SaveChangesAsync(); _logger.LogInfo("Tenant {TenantId} and root employee updated successfully.", tenant.Id); } @@ -677,6 +682,29 @@ namespace Marco.Pms.Services.Controllers return StatusCode(500, ApiResponse.ErrorResponse("Error updating tenant", "Unexpected error occurred while updating tenant.", 500)); } + var tenantTaks = Task.Run(async () => + { + await _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = tenant.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = tenantObject, + UpdatedAt = DateTime.UtcNow + }, "TenantModificationLog"); + }); + var employeeTaks = Task.Run(async () => + { + await _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = rootEmployee.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = employeeobject, + UpdatedAt = DateTime.UtcNow + }, "EmployeeModificationLog"); + }); + + await Task.WhenAll(tenantTaks, employeeTaks); + // 9. Map updated tenant to ViewModel for response var response = _mapper.Map(tenant); diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 4a40536..aad81de 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -47,10 +47,6 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.ContactName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}") - ) - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.OrganizationName) ); CreateMap() diff --git a/Marco.Pms.Services/appsettings.Development.json b/Marco.Pms.Services/appsettings.Development.json index d6ea6a3..e7fdcee 100644 --- a/Marco.Pms.Services/appsettings.Development.json +++ b/Marco.Pms.Services/appsettings.Development.json @@ -49,6 +49,6 @@ "MongoDB": { "SerilogDatabaseUrl": "mongodb://localhost:27017/DotNetLogs", "ConnectionString": "mongodb://localhost:27017/MarcoBMS_Caches?socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500", - "ModificationConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalDev?authSource=admin&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500" + "ModificationConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalDev?authSource=admin&eplicaSet=rs01&directConnection=true" } } From f19f759752720da9a72ff50aea810bc057fdcf9f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 12 Aug 2025 14:49:23 +0530 Subject: [PATCH 110/125] Added suspend tenant API --- .../Controllers/TenantController.cs | 93 ++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 983c4ca..620591b 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -713,9 +713,98 @@ namespace Marco.Pms.Services.Controllers // DELETE api//5 - [HttpDelete("{id}")] - public void Delete(int id) + [HttpDelete("delete/{id}")] + public async Task DeleteTenant(Guid id, [FromQuery] bool isActive = false) { + var action = isActive ? "activation" : "deactivation"; + _logger.LogInfo("Attempting tenant {Action} for ID: {TenantId}", action, id); + + // --- 1. Authentication & Authorization --- + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("Unauthorized tenant status update attempt. User is not logged in."); + return StatusCode(403, ApiResponse.ErrorResponse("Unauthorized", "User must be logged in to perform this action.", 403)); + } + + using var scope = _serviceScopeFactory.CreateScope(); + var _permissionService = scope.ServiceProvider.GetRequiredService(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + if (!hasPermission && !(loggedInEmployee.ApplicationUser?.IsRootUser ?? false)) + { + _logger.LogWarning( + "Permission Denied: User {EmployeeId} attempted tenant status update for Tenant {TenantId} without 'ManageTenants' permission.", + loggedInEmployee.Id, id); + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have the required permissions for this action.", 403)); + } + + // --- 2. Data Retrieval --- + await using var context = await _dbContextFactory.CreateDbContextAsync(); + var tenant = await context.Tenants + // Include related data only if it's required by the TenantVM mapping. + // If not, removing these improves performance. + .Include(t => t.Industry) + .Include(t => t.TenantStatus) + .FirstOrDefaultAsync(t => t.Id == id); + + if (tenant == null) + { + _logger.LogWarning("Tenant status update failed: Tenant with ID {TenantId} not found.", id); + return NotFound(ApiResponse.ErrorResponse("Not Found", $"Tenant with ID '{id}' was not found.", 404)); + } + + // --- 3. Logic & State Change --- + // Efficiency: If the state is already what is being requested, do nothing. + if (tenant.IsActive == isActive) + { + var currentStatus = isActive ? "already active" : "already inactive"; + _logger.LogInfo("No action needed. Tenant {TenantId} is {Status}.", tenant.Id, currentStatus); + var noChangeMessage = $"Tenant was {currentStatus}. No changes were made."; + return Ok(ApiResponse.SuccessResponse(_mapper.Map(tenant), noChangeMessage, 200)); + } + + // Capture the state *before* modification for the audit log. + var tenantOldStateBson = _updateLogHelper.EntityToBsonDocument(tenant); + tenant.IsActive = isActive; + + // --- 4. Database Persistence --- + try + { + await context.SaveChangesAsync(); + _logger.LogInfo("Successfully updated Tenant {TenantId} IsActive status to {IsActive}.", tenant.Id, isActive); + } + catch (DbUpdateException ex) // Be more specific with exceptions if possible. + { + _logger.LogError(ex, "Database error occurred while updating status for Tenant {TenantId}.", tenant.Id); + return StatusCode(500, ApiResponse.ErrorResponse("Database Error", "An error occurred while saving changes to the database.", 500)); + } + catch (Exception ex) + { + _logger.LogError(ex, "An unexpected error occurred while updating status for Tenant {TenantId}.", tenant.Id); + return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred.", 500)); + } + + // --- 5. Audit Logging --- + // This runs after the DB save is confirmed. + // Note: If this call fails, the audit log will be missing for a successful DB change. + // For critical systems, consider a more robust outbox pattern. + await _updateLogHelper.PushToUpdateLogsAsync(new UpdateLogsObject + { + EntityId = tenant.Id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = tenantOldStateBson, + UpdatedAt = DateTime.UtcNow + }, "TenantModificationLog"); + _logger.LogInfo("Audit log created for status change of Tenant {TenantId} by User {EmployeeId}.", tenant.Id, loggedInEmployee.Id); + + + // --- 6. Prepare and Return Response --- + var responseData = _mapper.Map(tenant); + var successMessage = $"Tenant successfully {(isActive ? "activated" : "deactivated")}."; + + return Ok(ApiResponse.SuccessResponse(responseData, successMessage, 200)); } From 3d6926864d40c522ad45dfa81ece3036f6001312 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 14 Aug 2025 11:06:55 +0530 Subject: [PATCH 111/125] Added the current plan details in tenant details API --- Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs | 1 + Marco.Pms.Services/Controllers/TenantController.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs index 7edbb45..fb31f1f 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs @@ -34,5 +34,6 @@ namespace Marco.Pms.Model.ViewModels.Tenant public DateTime? NextBillingDate { get; set; } public BasicEmployeeVM? CreatedBy { get; set; } public List? SubscriptionHistery { get; set; } + public SubscriptionPlanDetailsVM? CurrentPlan { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 620591b..92873eb 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -343,6 +343,7 @@ namespace Marco.Pms.Services.Controllers response.NextBillingDate = nextBillingDate; response.CreatedBy = createdBy; + response.CurrentPlan = _mapper.Map(currentPlan); // Map subscription history plans to DTO response.SubscriptionHistery = _mapper.Map>(plans); From d8870b814076dba001c6a0bb23113daad32c1654 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 16 Aug 2025 16:59:36 +0530 Subject: [PATCH 112/125] Added default entries for the tenant in master tables depending upon its plan --- .../Data/ApplicationDbContext.cs | 7 +- .../Tenant/SubscriptionPlanDetailsVM.cs | 1 + .../ViewModels/Tenant/TenantDetailsVM.cs | 1 + .../Controllers/TenantController.cs | 86 ++++- Marco.Pms.Services/Program.cs | 1 + .../Service/MasterDataService.cs | 337 ++++++++++++++++++ 6 files changed, 430 insertions(+), 3 deletions(-) create mode 100644 Marco.Pms.Services/Service/MasterDataService.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 37b8c1c..f9c4813 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -301,7 +301,8 @@ namespace Marco.Pms.DataAccess.Data Level = 2, IsDefault = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }, new TicketPriorityMaster + }, + new TicketPriorityMaster { Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), Name = "High", @@ -309,7 +310,8 @@ namespace Marco.Pms.DataAccess.Data Level = 3, IsDefault = true, TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") - }, new TicketPriorityMaster + }, + new TicketPriorityMaster { Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), Name = "Critical", @@ -346,6 +348,7 @@ namespace Marco.Pms.DataAccess.Data TenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26") } ); + modelBuilder.Entity().HasData( new WorkCategoryMaster { diff --git a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs index 71012c8..e137ef4 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/SubscriptionPlanDetailsVM.cs @@ -10,6 +10,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant public string? PlanName { get; set; } public string? Description { get; set; } public double Price { get; set; } + public double MaxUsers { get; set; } public PLAN_FREQUENCY Frequency { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } diff --git a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs index fb31f1f..8d01b42 100644 --- a/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs +++ b/Marco.Pms.Model/ViewModels/Tenant/TenantDetailsVM.cs @@ -23,6 +23,7 @@ namespace Marco.Pms.Model.ViewModels.Tenant public string Reference { get; set; } = string.Empty; public bool IsActive { get; set; } = true; public bool IsSuperTenant { get; set; } = false; + public int SeatsAvailable { get; set; } public int ActiveEmployees { get; set; } public int InActiveEmployees { get; set; } public int? ActiveProjects { get; set; } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 92873eb..fe6e521 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -338,7 +338,7 @@ namespace Marco.Pms.Services.Controllers response.OnHoldProjects = projects.Count(p => p.ProjectStatusId == projectOnHoldStatus); response.InActiveProjects = projects.Count(p => p.ProjectStatusId == projectInActiveStatus); response.CompletedProjects = projects.Count(p => p.ProjectStatusId == projectCompletedStatus); - + response.SeatsAvailable = (int)(currentPlan?.MaxUsers ?? 1) - activeEmployeesCount; response.ExpiryDate = expiryDate; response.NextBillingDate = nextBillingDate; response.CreatedBy = createdBy; @@ -1013,6 +1013,25 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Removed {Count} role permission mappings for role {RoleId}", deleteMappings.Count, roleId); } + var _masteData = scope.ServiceProvider.GetRequiredService(); + + if (features.Modules?.ProjectManagement?.Enabled ?? false) + { + var workCategoryMaster = _masteData.GetWorkCategoriesData(tenant.Id); + var workStatusMaster = _masteData.GetWorkStatusesData(tenant.Id); + + _context.WorkCategoryMasters.AddRange(workCategoryMaster); + _context.WorkStatusMasters.AddRange(workStatusMaster); + } + if (features.Modules?.Expense?.Enabled ?? false) + { + var expensesTypeMaster = _masteData.GetExpensesTypeesData(tenant.Id); + var paymentModeMatser = _masteData.GetPaymentModesData(tenant.Id); + + _context.ExpensesTypeMaster.AddRange(expensesTypeMaster); + _context.PaymentModeMatser.AddRange(paymentModeMatser); + } + await _context.SaveChangesAsync(); await transaction.CommitAsync(); @@ -1138,6 +1157,8 @@ namespace Marco.Pms.Services.Controllers UpdatedAt = DateTime.UtcNow }, "SubscriptionPlanModificationLog"); + + return Ok(ApiResponse.SuccessResponse(currentSubscription, "Subscription renewed/extended", 200)); } @@ -1285,6 +1306,69 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo("Permissions revoked: {Count} for Role={RoleId}", mappingsToRemove.Count, rootRoleId); } + var _masteData = scope.ServiceProvider.GetRequiredService(); + + if (features.Modules?.ProjectManagement?.Enabled ?? false) + { + var workCategoryMaster = _masteData.GetWorkCategoriesData(tenant.Id); + var workStatusMaster = _masteData.GetWorkStatusesData(tenant.Id); + + var workCategoryTask = Task.Run(async () => + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + return await _context.WorkCategoryMasters.AnyAsync(wc => wc.IsSystem && wc.TenantId == tenant.Id); + }); + var workStatusTask = Task.Run(async () => + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + return await _context.WorkStatusMasters.AnyAsync(ws => ws.IsSystem && ws.TenantId == tenant.Id); + }); + + await Task.WhenAll(workCategoryTask, workStatusTask); + + var workCategoryExist = workCategoryTask.Result; + var workStatusExist = workStatusTask.Result; + if (!workCategoryExist) + { + context.WorkCategoryMasters.AddRange(workCategoryMaster); + } + if (!workStatusExist) + { + context.WorkStatusMasters.AddRange(workStatusMaster); + } + } + if (features.Modules?.Expense?.Enabled ?? false) + { + var expensesTypeMaster = _masteData.GetExpensesTypeesData(tenant.Id); + var paymentModeMatser = _masteData.GetPaymentModesData(tenant.Id); + + var expensesTypeTask = Task.Run(async () => + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + var expensesTypeNames = expensesTypeMaster.Select(et => et.Name).ToList(); + return await _context.ExpensesTypeMaster.AnyAsync(et => expensesTypeNames.Contains(et.Name) && et.TenantId == tenant.Id); + }); + var paymentModeTask = Task.Run(async () => + { + await using var _context = await _dbContextFactory.CreateDbContextAsync(); + var paymentModeNames = paymentModeMatser.Select(py => py.Name).ToList(); + return await _context.PaymentModeMatser.AnyAsync(py => paymentModeNames.Contains(py.Name) && py.TenantId == tenant.Id); + }); + + await Task.WhenAll(expensesTypeTask, paymentModeTask); + + var expensesTypeExist = expensesTypeTask.Result; + var paymentModeExist = paymentModeTask.Result; + if (!expensesTypeExist) + { + context.ExpensesTypeMaster.AddRange(expensesTypeMaster); + } + if (!paymentModeExist) + { + context.PaymentModeMatser.AddRange(paymentModeMatser); + } + } + await context.SaveChangesAsync(); await transaction.CommitAsync(); diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index a5c9ac8..702836e 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -172,6 +172,7 @@ builder.Services.AddTransient(); #region Customs Services 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/MasterDataService.cs b/Marco.Pms.Services/Service/MasterDataService.cs new file mode 100644 index 0000000..d2ea959 --- /dev/null +++ b/Marco.Pms.Services/Service/MasterDataService.cs @@ -0,0 +1,337 @@ +using Marco.Pms.Model.Forum; +using Marco.Pms.Model.Master; + +namespace Marco.Pms.Services.Service +{ + public class MasterDataService + { + public List GetTicketStatusesData(Guid tenantId) + { + return new List + { + new TicketStatusMaster + { + Id = Guid.NewGuid(), + Name = "New", + Description = "This is a newly created issue.", + ColorCode = "#FFCC99", + IsDefault = true, + TenantId = tenantId + }, + new TicketStatusMaster + { + Id = Guid.NewGuid(), + Name = "Assigned", + Description = "Assigned to employee or team of employees", + ColorCode = "#E6FF99", + IsDefault = true, + TenantId = tenantId + }, + new TicketStatusMaster + { + Id = Guid.NewGuid(), + Name = "In Progress", + Description = "These issues are currently in progress", + ColorCode = "#99E6FF", + IsDefault = true, + TenantId = tenantId + }, + new TicketStatusMaster + { + Id = Guid.NewGuid(), + Name = "In Review", + Description = "These issues are currently under review", + ColorCode = "#8592a3", + IsDefault = true, + TenantId = tenantId + }, + new TicketStatusMaster + { + Id = Guid.NewGuid(), + Name = "Done", + Description = "The following issues are resolved and closed", + ColorCode = "#B399FF", + IsDefault = true, + TenantId = tenantId + } + }; + } + public List GetTicketTypesData(Guid tenantId) + { + return new List + { + new TicketTypeMaster + { + Id = Guid.NewGuid(), + Name = "Quality Issue", + Description = "An identified problem that affects the performance, reliability, or standards of a product or service", + IsDefault = true, + TenantId = tenantId + }, + new TicketTypeMaster + { + Id = Guid.NewGuid(), + Name = "Help Desk", + Description = "A support service that assists users with technical issues, requests, or inquiries.", + IsDefault = true, + TenantId = tenantId + } + }; + } + public List GetTicketPrioritysData(Guid tenantId) + { + return new List + { + new TicketPriorityMaster + { + Id = Guid.NewGuid(), + Name = "Low", + ColorCode = "008000", + Level = 1, + IsDefault = true, + TenantId = tenantId + }, + new TicketPriorityMaster + { + Id = Guid.NewGuid(), + Name = "Medium", + ColorCode = "FFFF00", + Level = 2, + IsDefault = true, + TenantId = tenantId + }, + new TicketPriorityMaster + { + Id = Guid.NewGuid(), + Name = "High", + ColorCode = "#FFA500", + Level = 3, + IsDefault = true, + TenantId = tenantId + }, + new TicketPriorityMaster + { + Id = Guid.NewGuid(), + Name = "Critical", + ColorCode = "#FFA500", + Level = 4, + IsDefault = true, + TenantId = tenantId + }, + new TicketPriorityMaster + { + Id = Guid.NewGuid(), + Name = "Urgent", + ColorCode = "#FF0000", + Level = 5, + IsDefault = true, + TenantId = tenantId + } + }; + } + public List GetTicketTagsData(Guid tenantId) + { + return new List + { + new TicketTagMaster + { + Id = Guid.NewGuid(), + Name = "Quality Issue", + ColorCode = "#e59866", + IsDefault = true, + TenantId = tenantId + }, + new TicketTagMaster + { + Id = Guid.NewGuid(), + Name = "Help Desk", + ColorCode = "#85c1e9", + IsDefault = true, + TenantId = tenantId + } + }; + } + public List GetWorkCategoriesData(Guid tenantId) + { + return new List + { + new WorkCategoryMaster + { + Id = Guid.NewGuid(), + Name = "Fresh Work", + Description = "Created new task in a professional or creative context", + IsSystem = true, + TenantId = tenantId + }, + new WorkCategoryMaster + { + Id = Guid.NewGuid(), + Name = "Rework", + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + TenantId = tenantId + }, + new WorkCategoryMaster + { + Id = Guid.NewGuid(), + Name = "Quality Issue", + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + TenantId = tenantId + } + }; + } + public List GetWorkStatusesData(Guid tenantId) + { + return new List + { + new WorkStatusMaster + { + Id = Guid.NewGuid(), + Name = "Approve", + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + TenantId = tenantId + }, + new WorkStatusMaster + { + Id = Guid.NewGuid(), + Name = "Partially Approve", + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + TenantId = tenantId + }, + new WorkStatusMaster + { + Id = Guid.NewGuid(), + Name = "NCR", + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + TenantId = tenantId + } + }; + } + public List GetExpensesTypeesData(Guid tenantId) + { + return new List + { + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Procurement", + Description = "Materials, equipment and supplies purchased for site operations.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Transport", + Description = "Vehicle fuel, logistics services and delivery of goods or personnel.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Travelling", + Description = "Delivery of personnel.", + NoOfPersonsRequired = true, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Mobilization", + Description = "Site setup costs including equipment deployment and temporary infrastructure.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Employee Welfare", + Description = " Worker amenities like snacks, meals, safety gear, accommodation, medical support etc.", + NoOfPersonsRequired = true, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Maintenance & Utilities", + Description = "Machinery servicing, electricity, water, and temporary office needs.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Vendor/Supplier Payments", + Description = "Scheduled payments for external services or goods.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + }, + new ExpensesTypeMaster + { + Id = Guid.NewGuid(), + Name = "Compliance & Safety", + Description = "Government fees, insurance, inspections and safety-related expenditures.", + NoOfPersonsRequired = false, + IsActive = true, + TenantId = tenantId + } + }; + } + public List GetPaymentModesData(Guid tenantId) + { + return new List + { + new PaymentModeMatser + { + Id = Guid.NewGuid(), + Name = "Cash", + Description = "Physical currency; still used for small or informal transactions.", + IsActive = true, + TenantId = tenantId + }, + new PaymentModeMatser + { + Id = Guid.NewGuid(), + Name = "Cheque", + Description = "Paper-based payment order; less common now due to processing delays and fraud risks.", + IsActive = true, + TenantId = tenantId + }, + new PaymentModeMatser + { + Id = Guid.NewGuid(), + Name = "NetBanking", + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + TenantId = tenantId + }, + new PaymentModeMatser + { + Id = Guid.NewGuid(), + Name = "UPI", + Description = "Real-time bank-to-bank transfer using mobile apps; widely used for peer-to-peer and merchant payments.", + IsActive = true, + TenantId = tenantId + } + }; + } + public List GetData(Guid tenantId) + { + return new List + { + }; + } + } +} From d240a79e49150f7b895b35bc7fdaa0a2253fbdd4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 16 Aug 2025 17:15:01 +0530 Subject: [PATCH 113/125] Assigning the root employee to default when creating the tenant --- Marco.Pms.Services/Controllers/TenantController.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index fe6e521..d05f0c3 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -352,7 +352,6 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Tenant profile fetched successfully", 200)); } - // POST api/ [HttpPost("create")] public async Task CreateTenant([FromBody] CreateTenantDto model) @@ -551,6 +550,17 @@ namespace Marco.Pms.Services.Controllers }; _context.Projects.Add(project); + var projectAllocation = new ProjectAllocation + { + ProjectId = project.Id, + EmployeeId = employeeUser.Id, + AllocationDate = model.OnBoardingDate, + IsActive = true, + JobRoleId = adminJobRole.Id, + TenantId = tenant.Id + }; + _context.ProjectAllocations.Add(projectAllocation); + // All entities are now added to the context. Save them all in a single database operation. await _context.SaveChangesAsync(); From 288c0fe492ee4a562dff8ae86f39e34243cebfd4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 16 Aug 2025 17:26:42 +0530 Subject: [PATCH 114/125] Adding the days to end date while adding or updating subscription rather than months --- .../Controllers/TenantController.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index d05f0c3..cb5ca10 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -874,10 +874,10 @@ namespace Marco.Pms.Services.Controllers // Prepare subscription dates based on frequency var endDate = subscriptionPlan.Frequency switch { - PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), - PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), + PLAN_FREQUENCY.MONTHLY => utcNow.AddDays(30), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddDays(90), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddDays(120), + PLAN_FREQUENCY.YEARLY => utcNow.AddDays(360), _ => utcNow // default if unknown }; @@ -1123,10 +1123,10 @@ namespace Marco.Pms.Services.Controllers { newEndDate = subscriptionPlan.Frequency switch { - PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddMonths(1), - PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddMonths(3), - PLAN_FREQUENCY.HALF_YEARLY => currentSubscription.EndDate.AddMonths(6), - PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddMonths(12), + PLAN_FREQUENCY.MONTHLY => currentSubscription.EndDate.AddDays(30), + PLAN_FREQUENCY.QUARTERLY => currentSubscription.EndDate.AddDays(90), + PLAN_FREQUENCY.HALF_YEARLY => currentSubscription.EndDate.AddDays(120), + PLAN_FREQUENCY.YEARLY => currentSubscription.EndDate.AddDays(360), _ => currentSubscription.EndDate }; } @@ -1134,11 +1134,11 @@ namespace Marco.Pms.Services.Controllers { newEndDate = subscriptionPlan.Frequency switch { - PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), - PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - _ => utcNow + PLAN_FREQUENCY.MONTHLY => utcNow.AddDays(30), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddDays(90), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddDays(120), + PLAN_FREQUENCY.YEARLY => utcNow.AddDays(360), + _ => utcNow // default if unknown }; } @@ -1179,11 +1179,11 @@ namespace Marco.Pms.Services.Controllers // 7a. Compute new plan dates var endDate = subscriptionPlan.Frequency switch { - PLAN_FREQUENCY.MONTHLY => utcNow.AddMonths(1), - PLAN_FREQUENCY.QUARTERLY => utcNow.AddMonths(3), - PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddMonths(6), - PLAN_FREQUENCY.YEARLY => utcNow.AddMonths(12), - _ => utcNow + PLAN_FREQUENCY.MONTHLY => utcNow.AddDays(30), + PLAN_FREQUENCY.QUARTERLY => utcNow.AddDays(90), + PLAN_FREQUENCY.HALF_YEARLY => utcNow.AddDays(120), + PLAN_FREQUENCY.YEARLY => utcNow.AddDays(360), + _ => utcNow // default if unknown }; var newSubscription = new TenantSubscriptions From cf161e4a047b80aa3c9d6d7ff91749ccef61272e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 18 Aug 2025 11:46:42 +0530 Subject: [PATCH 115/125] Only sending the feature that tenant has permission of --- .../Controllers/FeatureController.cs | 126 +++++++++++++++--- .../Controllers/TenantController.cs | 14 +- Marco.Pms.Services/Helpers/GeneralHelper.cs | 123 ++++++++++++++++- .../MappingProfiles/MappingProfile.cs | 3 + 4 files changed, 241 insertions(+), 25 deletions(-) diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index 779a4b0..f1706be 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -1,9 +1,11 @@ -using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.Entitlements; -using Marco.Pms.Model.Mapper; +using AutoMapper; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Master; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Master; +using Marco.Pms.Services.Helpers; +using MarcoBMS.Services.Helpers; +using MarcoBMS.Services.Service; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -15,43 +17,133 @@ namespace MarcoBMS.Services.Controllers public class FeatureController : ControllerBase { private readonly ApplicationDbContext _context; + private readonly GeneralHelper _generalHelper; + //private readonly UserHelper _userHelper; + private readonly IMapper _mapper; + private readonly ILoggingService _logger; + private readonly Guid tenantId; - - public FeatureController(ApplicationDbContext context) + public FeatureController(ApplicationDbContext context, GeneralHelper generalHelper, UserHelper userHelper, IMapper mapper, ILoggingService logger) { _context = context; + _generalHelper = generalHelper; + //_userHelper = userHelper; + _mapper = mapper; + _logger = logger; + tenantId = userHelper.GetTenantId(); } - private ICollection GetFeaturePermissionVMs(Feature model) + private ICollection GetFeaturePermissionVM(Feature model) { - ICollection features = []; - if (model.FeaturePermissions != null) + if (model.FeaturePermissions == null) { - foreach (FeaturePermission permission in model.FeaturePermissions) - { - FeaturePermissionVM item = permission.ToFeaturePermissionVMFromFeaturePermission(); - features.Add(item); - } + return []; } - return features.OrderBy(f => f.Name).ToList(); + + ICollection features = model.FeaturePermissions.Select(p => _mapper.Map(p)).OrderBy(f => f.Name).ToList(); + return features; } - [HttpGet] + [HttpGet("features")] public async Task GetAllFeatures() { - var roles = await _context.Features.Include("FeaturePermissions").Include("Module").ToListAsync(); + List featureIds = await _generalHelper.GetFeatureIdsByTenentId(tenantId); + var roles = await _context.Features + .Include(f => f.FeaturePermissions) + .Include(f => f.Module) + .Where(f => featureIds.Contains(f.Id)) + .ToListAsync(); var rolesVM = roles.Select(c => new FeatureVM() { Id = c.Id, Name = c.Name, Description = c.Description, - FeaturePermissions = GetFeaturePermissionVMs(c), + FeaturePermissions = GetFeaturePermissionVM(c), ModuleId = c.ModuleId, ModuleName = c.Module != null ? c.Module.Name : string.Empty, IsActive = c.IsActive }).OrderBy(f => f.Name).ToList(); return Ok(ApiResponse.SuccessResponse(rolesVM, "Success.", 200)); } + + /// + /// Converts FeaturePermissions from Feature entity into FeaturePermissionVM collection. + /// + /// Feature entity from DB + /// Collection of FeaturePermissionVM, ordered by Name + private ICollection GetFeaturePermissionVMs(Feature model) + { + if (model.FeaturePermissions == null || !model.FeaturePermissions.Any()) + { + _logger.LogInfo("No feature permissions found for Feature: {FeatureId}", model.Id); + return new List(); + } + + // Project and order feature permissions + var features = model.FeaturePermissions + .Select(p => _mapper.Map(p)) + .OrderBy(f => f.Name) + .ToList(); + + _logger.LogDebug("Mapped {Count} feature permissions for Feature: {FeatureId}", features.Count, model.Id); + return features; + } + + /// + /// API endpoint to fetch all features and their permissions for the given tenant. + /// + [HttpGet] + public async Task GetAllFeaturesAsync() + { + try + { + _logger.LogInfo("Fetching all features for tenant: {TenantId}", tenantId); + + // Step 1: Get tenant-specific FeatureIds + List featureIds = await _generalHelper.GetFeatureIdsByTenentIdAsync(tenantId); + if (featureIds == null || !featureIds.Any()) + { + _logger.LogWarning("No features found for tenant: {TenantId}", tenantId); + return Ok(ApiResponse.SuccessResponse(new List(), "No features found.", 200)); + } + + _logger.LogDebug("Retrieved {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); + + // Step 2: Query Features with related FeaturePermissions & Module + var features = await _context.Features + .AsNoTracking() // Optimization: Read-only query + .Include(f => f.FeaturePermissions) + .Include(f => f.Module) + .Where(f => featureIds.Contains(f.Id)) + .ToListAsync(); + + _logger.LogDebug("Fetched {Count} features from DB for tenant: {TenantId}", features.Count, tenantId); + + // Step 3: Map features to ViewModels + var featureVMs = features + .Select(c => new FeatureVM + { + Id = c.Id, + Name = c.Name, + Description = c.Description, + FeaturePermissions = GetFeaturePermissionVMs(c), + ModuleId = c.ModuleId, + ModuleName = c.Module?.Name ?? string.Empty, + IsActive = c.IsActive + }) + .OrderBy(f => f.Name) + .ToList(); + + _logger.LogInfo("Returning {Count} features for tenant: {TenantId}", featureVMs.Count, tenantId); + + return Ok(ApiResponse.SuccessResponse(featureVMs, "Success.", 200)); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error while fetching features for tenant: {TenantId}", tenantId); + return StatusCode(500, ApiResponse.ErrorResponse("An unexpected error occurred.", 500)); + } + } } } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index cb5ca10..ec6362f 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -57,13 +57,13 @@ namespace Marco.Pms.Services.Controllers UserHelper userHelper, FeatureDetailsHelper featureDetailsHelper) { - _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); ; - _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); ; - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); ; - _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); ; - _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); ; - _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); ; - _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); ; + _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); + _serviceScopeFactory = serviceScopeFactory ?? throw new ArgumentNullException(nameof(serviceScopeFactory)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); + _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper)); + _userHelper = userHelper ?? throw new ArgumentNullException(nameof(userHelper)); + _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); } #region =================================================================== Tenant APIs =================================================================== diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index 8669811..7284490 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -1,4 +1,5 @@ using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using MarcoBMS.Services.Service; @@ -11,13 +12,16 @@ namespace Marco.Pms.Services.Helpers private readonly IDbContextFactory _dbContextFactory; private readonly ApplicationDbContext _context; // Keeping this for direct scoped context use where appropriate private readonly ILoggingService _logger; + private readonly FeatureDetailsHelper _featureDetailsHelper; public GeneralHelper(IDbContextFactory dbContextFactory, ApplicationDbContext context, - ILoggingService logger) + ILoggingService logger, + FeatureDetailsHelper featureDetailsHelper) { _dbContextFactory = dbContextFactory ?? throw new ArgumentNullException(nameof(dbContextFactory)); _context = context ?? throw new ArgumentNullException(nameof(context)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _featureDetailsHelper = featureDetailsHelper ?? throw new ArgumentNullException(nameof(featureDetailsHelper)); } public async Task> GetProjectInfraFromDB(Guid projectId) { @@ -211,5 +215,122 @@ namespace Marco.Pms.Services.Helpers return new List(); } } + + public async Task> GetFeatureIdsByTenentId(Guid tenantId) + { + var tenantSubscription = await _context.TenantSubscriptions.Include(ts => ts.Plan) + .FirstOrDefaultAsync(ts => ts.TenantId == tenantId && ts.Plan != null && !ts.IsCancelled && ts.EndDate.Date < DateTime.UtcNow.Date); + + if (tenantSubscription == null) + { + _logger.LogWarning("Cannot found the tenant subscription for tenant {TenantId}", tenantId); + return new List(); + } + var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); + if (featureDetails == null) + { + _logger.LogWarning("Cannot found the feature details for tenant {TenantId}", tenantId); + return new List(); + } + var featureIds = new List(); + if (featureDetails.Modules!.Attendance!.Enabled) + { + featureIds.AddRange(featureDetails.Modules.Attendance.FeatureId); + } + if (featureDetails.Modules.ProjectManagement!.Enabled) + { + featureIds.AddRange(featureDetails.Modules.ProjectManagement.FeatureId); + } + if (featureDetails.Modules.Directory!.Enabled) + { + featureIds.AddRange(featureDetails.Modules.Directory.FeatureId); + } + if (featureDetails.Modules.Expense!.Enabled) + { + featureIds.AddRange(featureDetails.Modules.Expense.FeatureId); + } + + return featureIds; + } + + /// + /// Retrieves all enabled feature IDs for a given tenant based on their active subscription. + /// + /// The unique identifier of the tenant. + /// A list of feature IDs available for the tenant. + public async Task> GetFeatureIdsByTenentIdAsync(Guid tenantId) + { + try + { + _logger.LogInfo("Fetching feature IDs for tenant: {TenantId}", tenantId); + + // Step 1: Get active tenant subscription with plan + var tenantSubscription = await _context.TenantSubscriptions + .Include(ts => ts.Plan) + .AsNoTracking() // Optimization: Read-only query, no need to track + .FirstOrDefaultAsync(ts => + ts.TenantId == tenantId && + ts.Plan != null && + !ts.IsCancelled && + ts.EndDate.Date >= DateTime.UtcNow.Date); // FIX: Subscription should not be expired + + if (tenantSubscription == null) + { + _logger.LogWarning("No active subscription found for tenant: {TenantId}", tenantId); + return new List(); + } + + _logger.LogDebug("Active subscription found for tenant: {TenantId}, PlanId: {PlanId}", + tenantId, tenantSubscription.Plan!.Id); + + // Step 2: Get feature details from Plan + var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); + + if (featureDetails == null) + { + _logger.LogWarning("No feature details found for tenant: {TenantId}, PlanId: {PlanId}", + tenantId, tenantSubscription.Plan!.Id); + return new List(); + } + + // Step 3: Collect all enabled feature IDs from modules + var featureIds = new List { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be") }; + + if (featureDetails.Modules?.Attendance?.Enabled == true) + { + featureIds.AddRange(featureDetails.Modules.Attendance.FeatureId); + _logger.LogDebug("Added Attendance module features for tenant: {TenantId}", tenantId); + } + + if (featureDetails.Modules?.ProjectManagement?.Enabled == true) + { + featureIds.AddRange(featureDetails.Modules.ProjectManagement.FeatureId); + _logger.LogDebug("Added Project Management module features for tenant: {TenantId}", tenantId); + } + + if (featureDetails.Modules?.Directory?.Enabled == true) + { + featureIds.AddRange(featureDetails.Modules.Directory.FeatureId); + _logger.LogDebug("Added Directory module features for tenant: {TenantId}", tenantId); + } + + if (featureDetails.Modules?.Expense?.Enabled == true) + { + featureIds.AddRange(featureDetails.Modules.Expense.FeatureId); + _logger.LogDebug("Added Expense module features for tenant: {TenantId}", tenantId); + } + + _logger.LogInfo("Returning {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); + + return featureIds.Distinct().ToList(); + } + catch (Exception ex) + { + // Step 4: Handle unexpected errors + _logger.LogError(ex, "Error retrieving feature IDs for tenant: {TenantId}", tenantId); + return new List(); + } + } + } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index aad81de..00e008a 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -4,6 +4,7 @@ using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Master; using Marco.Pms.Model.MongoDBModels; @@ -221,6 +222,8 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Master ======================================================= + CreateMap(); + #region ======================================================= Expenses Type Master ======================================================= CreateMap() From 90a2b23c1a53c4ca0bdffaabd14f99f22956eed7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 18 Aug 2025 12:41:00 +0530 Subject: [PATCH 116/125] Added the condition to check if it is the root tenant --- .../Controllers/FeatureController.cs | 67 +++++-------------- Marco.Pms.Services/Helpers/GeneralHelper.cs | 40 +---------- 2 files changed, 20 insertions(+), 87 deletions(-) diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index f1706be..05ded40 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -33,40 +33,6 @@ namespace MarcoBMS.Services.Controllers tenantId = userHelper.GetTenantId(); } - private ICollection GetFeaturePermissionVM(Feature model) - { - if (model.FeaturePermissions == null) - { - return []; - } - - ICollection features = model.FeaturePermissions.Select(p => _mapper.Map(p)).OrderBy(f => f.Name).ToList(); - return features; - } - - [HttpGet("features")] - public async Task GetAllFeatures() - { - List featureIds = await _generalHelper.GetFeatureIdsByTenentId(tenantId); - var roles = await _context.Features - .Include(f => f.FeaturePermissions) - .Include(f => f.Module) - .Where(f => featureIds.Contains(f.Id)) - .ToListAsync(); - - var rolesVM = roles.Select(c => new FeatureVM() - { - Id = c.Id, - Name = c.Name, - Description = c.Description, - FeaturePermissions = GetFeaturePermissionVM(c), - ModuleId = c.ModuleId, - ModuleName = c.Module != null ? c.Module.Name : string.Empty, - IsActive = c.IsActive - }).OrderBy(f => f.Name).ToList(); - return Ok(ApiResponse.SuccessResponse(rolesVM, "Success.", 200)); - } - /// /// Converts FeaturePermissions from Feature entity into FeaturePermissionVM collection. /// @@ -100,24 +66,27 @@ namespace MarcoBMS.Services.Controllers { _logger.LogInfo("Fetching all features for tenant: {TenantId}", tenantId); - // Step 1: Get tenant-specific FeatureIds - List featureIds = await _generalHelper.GetFeatureIdsByTenentIdAsync(tenantId); - if (featureIds == null || !featureIds.Any()) + var featureQuery = _context.Features + .AsNoTracking(); // Optimization: Read-only query + if (tenantId != Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26")) { - _logger.LogWarning("No features found for tenant: {TenantId}", tenantId); - return Ok(ApiResponse.SuccessResponse(new List(), "No features found.", 200)); + + // Step 1: Get tenant-specific FeatureIds + List featureIds = await _generalHelper.GetFeatureIdsByTenentIdAsync(tenantId); + if (featureIds == null || !featureIds.Any()) + { + _logger.LogWarning("No features found for tenant: {TenantId}", tenantId); + return Ok(ApiResponse.SuccessResponse(new List(), "No features found.", 200)); + } + _logger.LogDebug("Retrieved {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); + + // Step 2: Query Features with related FeaturePermissions & Module + featureQuery = featureQuery.Where(f => featureIds.Contains(f.Id)); } - _logger.LogDebug("Retrieved {Count} feature IDs for tenant: {TenantId}", featureIds.Count, tenantId); - - // Step 2: Query Features with related FeaturePermissions & Module - var features = await _context.Features - .AsNoTracking() // Optimization: Read-only query - .Include(f => f.FeaturePermissions) - .Include(f => f.Module) - .Where(f => featureIds.Contains(f.Id)) - .ToListAsync(); - + var features = await featureQuery + .Include(f => f.FeaturePermissions) + .Include(f => f.Module).ToListAsync(); _logger.LogDebug("Fetched {Count} features from DB for tenant: {TenantId}", features.Count, tenantId); // Step 3: Map features to ViewModels diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index 7284490..93f256f 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -216,43 +216,6 @@ namespace Marco.Pms.Services.Helpers } } - public async Task> GetFeatureIdsByTenentId(Guid tenantId) - { - var tenantSubscription = await _context.TenantSubscriptions.Include(ts => ts.Plan) - .FirstOrDefaultAsync(ts => ts.TenantId == tenantId && ts.Plan != null && !ts.IsCancelled && ts.EndDate.Date < DateTime.UtcNow.Date); - - if (tenantSubscription == null) - { - _logger.LogWarning("Cannot found the tenant subscription for tenant {TenantId}", tenantId); - return new List(); - } - var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); - if (featureDetails == null) - { - _logger.LogWarning("Cannot found the feature details for tenant {TenantId}", tenantId); - return new List(); - } - var featureIds = new List(); - if (featureDetails.Modules!.Attendance!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Attendance.FeatureId); - } - if (featureDetails.Modules.ProjectManagement!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.ProjectManagement.FeatureId); - } - if (featureDetails.Modules.Directory!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Directory.FeatureId); - } - if (featureDetails.Modules.Expense!.Enabled) - { - featureIds.AddRange(featureDetails.Modules.Expense.FeatureId); - } - - return featureIds; - } - /// /// Retrieves all enabled feature IDs for a given tenant based on their active subscription. /// @@ -283,6 +246,8 @@ namespace Marco.Pms.Services.Helpers _logger.LogDebug("Active subscription found for tenant: {TenantId}, PlanId: {PlanId}", tenantId, tenantSubscription.Plan!.Id); + var featureIds = new List { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be") }; + // Step 2: Get feature details from Plan var featureDetails = await _featureDetailsHelper.GetFeatureDetails(tenantSubscription.Plan!.FeaturesId); @@ -294,7 +259,6 @@ namespace Marco.Pms.Services.Helpers } // Step 3: Collect all enabled feature IDs from modules - var featureIds = new List { new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be") }; if (featureDetails.Modules?.Attendance?.Enabled == true) { From bc935282a59590bf6fa31ee2ad9e913bf4021fc1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 20 Aug 2025 12:12:12 +0530 Subject: [PATCH 117/125] Restrict the user creation if the maximum user limit is reached --- .../Controllers/EmployeeController.cs | 18 ++++++++++------- Marco.Pms.Services/Helpers/GeneralHelper.cs | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index cdc28ed..8093471 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -9,6 +9,7 @@ using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Employee; +using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Hubs; using Marco.Pms.Services.Service; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -36,6 +37,7 @@ namespace MarcoBMS.Services.Controllers private readonly IEmailSender _emailSender; private readonly EmployeeHelper _employeeHelper; private readonly UserHelper _userHelper; + private readonly GeneralHelper _generalHelper; private readonly IConfiguration _configuration; private readonly ILoggingService _logger; private readonly IHubContext _signalR; @@ -47,13 +49,14 @@ namespace MarcoBMS.Services.Controllers public EmployeeController(UserManager userManager, IEmailSender emailSender, ApplicationDbContext context, EmployeeHelper employeeHelper, UserHelper userHelper, IConfiguration configuration, ILoggingService logger, - IHubContext signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper) + IHubContext signalR, PermissionServices permission, IProjectServices projectServices, IMapper mapper, GeneralHelper generalHelper) { _context = context; _userManager = userManager; _emailSender = emailSender; _employeeHelper = employeeHelper; _userHelper = userHelper; + _generalHelper = generalHelper; _configuration = configuration; _logger = logger; _signalR = signalR; @@ -191,6 +194,7 @@ namespace MarcoBMS.Services.Controllers var response = await employeeQuery.Take(10).Select(e => _mapper.Map(e)).ToListAsync(); return Ok(ApiResponse.SuccessResponse(response, $"{response.Count} records of employees fetched successfully", 200)); } + [HttpGet] [Route("search/{name}/{projectid?}")] public async Task SearchEmployee(string name, Guid? projectid) @@ -233,11 +237,6 @@ namespace MarcoBMS.Services.Controllers return _userHelper.GetTenantId(); } - //[HttpPost("manage/quick")] - //public async Task CreateQuickUser([FromBody] CreateQuickUserDto model) - //{ - // return Ok("Pending implementation"); - //} [HttpPost("manage")] public async Task CreateUser([FromBody] CreateUserDto model) @@ -294,7 +293,12 @@ namespace MarcoBMS.Services.Controllers TenantId = tenantId }; - + var isSeatsAvaiable = await _generalHelper.CheckSeatsRemaningAsync(tenantId); + if (!isSeatsAvaiable) + { + _logger.LogWarning("Maximum number of users reached for Tenant {TenantId}", tenantId); + return BadRequest(ApiResponse.ErrorResponse("Maximum number of users reached. Cannot add new user", "Maximum number of users reached. Cannot add new user", 400)); + } // Create Identity User var result = await _userManager.CreateAsync(user, "User@123"); if (!result.Succeeded) diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index 93f256f..db7547d 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -296,5 +296,25 @@ namespace Marco.Pms.Services.Helpers } } + public async Task CheckSeatsRemaningAsync(Guid tenantId) + { + var totalSeatsTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.TenantSubscriptions.Where(ts => ts.TenantId == tenantId && !ts.IsCancelled).Select(ts => ts.MaxUsers).FirstOrDefaultAsync(); + }); + var totalSeatsTakenTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Employees.Where(e => e.TenantId == tenantId && e.IsActive).CountAsync(); + }); + await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask); + + var totalSeats = totalSeatsTask.Result; + var totalSeatsTaken = totalSeatsTakenTask.Result; + + return totalSeats >= totalSeatsTaken; + } + } } From 307c7c96c206606752b6bed534309d7d0e1cab1b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 20 Aug 2025 12:19:16 +0530 Subject: [PATCH 118/125] Optimized the helper function --- Marco.Pms.Services/Helpers/GeneralHelper.cs | 85 +++++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/Marco.Pms.Services/Helpers/GeneralHelper.cs b/Marco.Pms.Services/Helpers/GeneralHelper.cs index db7547d..45cdb13 100644 --- a/Marco.Pms.Services/Helpers/GeneralHelper.cs +++ b/Marco.Pms.Services/Helpers/GeneralHelper.cs @@ -296,24 +296,79 @@ namespace Marco.Pms.Services.Helpers } } - public async Task CheckSeatsRemaningAsync(Guid tenantId) + /// + /// Checks whether the tenant still has available seats (MaxUsers not exceeded). + /// + /// The ID of the tenant to check. + /// True if seats are available; otherwise false. + public async Task CheckSeatsRemainingAsync(Guid tenantId) { - var totalSeatsTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.TenantSubscriptions.Where(ts => ts.TenantId == tenantId && !ts.IsCancelled).Select(ts => ts.MaxUsers).FirstOrDefaultAsync(); - }); - var totalSeatsTakenTask = Task.Run(async () => - { - await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.Where(e => e.TenantId == tenantId && e.IsActive).CountAsync(); - }); - await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask); + _logger.LogInfo("Checking seats remaining for TenantId: {TenantId}", tenantId); - var totalSeats = totalSeatsTask.Result; - var totalSeatsTaken = totalSeatsTakenTask.Result; + try + { + // Run both queries concurrently + var totalSeatsTask = GetMaxSeatsAsync(tenantId); + var totalSeatsTakenTask = GetActiveEmployeesCountAsync(tenantId); - return totalSeats >= totalSeatsTaken; + await Task.WhenAll(totalSeatsTask, totalSeatsTakenTask); + + var totalSeats = await totalSeatsTask; + var totalSeatsTaken = await totalSeatsTakenTask; + + _logger.LogInfo( + "TenantId: {TenantId} | TotalSeats: {TotalSeats} | SeatsTaken: {SeatsTaken}", + tenantId, totalSeats, totalSeatsTaken); + + bool seatsAvailable = totalSeats >= totalSeatsTaken; + + _logger.LogDebug("TenantId: {TenantId} | Seats Available: {SeatsAvailable}", + tenantId, seatsAvailable); + + return seatsAvailable; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error checking seats for TenantId: {TenantId}", tenantId); + throw; + } + } + + /// + /// Retrieves the maximum number of allowed seats (MaxUsers) for a tenant. + /// + private async Task GetMaxSeatsAsync(Guid tenantId) + { + _logger.LogDebug("Fetching maximum seats for TenantId: {TenantId}", tenantId); + + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + + var maxSeats = await dbContext.TenantSubscriptions + .Where(ts => ts.TenantId == tenantId && !ts.IsCancelled) + .Select(ts => ts.MaxUsers) + .FirstOrDefaultAsync(); + + _logger.LogDebug("TenantId: {TenantId} | MaxSeats: {MaxSeats}", tenantId, maxSeats); + + return maxSeats; + } + + /// + /// Counts the number of active employees for a tenant. + /// + private async Task GetActiveEmployeesCountAsync(Guid tenantId) + { + _logger.LogDebug("Counting active employees for TenantId: {TenantId}", tenantId); + + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + + var activeEmployees = await dbContext.Employees + .Where(e => e.TenantId == tenantId && e.IsActive) + .CountAsync(); + + _logger.LogDebug("TenantId: {TenantId} | ActiveEmployees: {ActiveEmployees}", tenantId, activeEmployees); + + return activeEmployees; } } From 0de2e3f75d290a925a6ab7e9ba0adf76a7fe4587 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 21 Aug 2025 09:50:10 +0530 Subject: [PATCH 119/125] Corrected the typo in method name --- Marco.Pms.Services/Controllers/EmployeeController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 8093471..c23fca3 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -293,7 +293,7 @@ namespace MarcoBMS.Services.Controllers TenantId = tenantId }; - var isSeatsAvaiable = await _generalHelper.CheckSeatsRemaningAsync(tenantId); + var isSeatsAvaiable = await _generalHelper.CheckSeatsRemainingAsync(tenantId); if (!isSeatsAvaiable) { _logger.LogWarning("Maximum number of users reached for Tenant {TenantId}", tenantId); From 7eabd4fa73ce80d37d3f8b514c3fc985ea30afcc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 22 Aug 2025 10:17:54 +0530 Subject: [PATCH 120/125] Added the tenant ID in emplyee profile --- Marco.Pms.Model/Mapper/EmployeeMapper.cs | 3 ++- Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Model/Mapper/EmployeeMapper.cs b/Marco.Pms.Model/Mapper/EmployeeMapper.cs index 8086496..61bac16 100644 --- a/Marco.Pms.Model/Mapper/EmployeeMapper.cs +++ b/Marco.Pms.Model/Mapper/EmployeeMapper.cs @@ -36,7 +36,8 @@ namespace Marco.Pms.Model.Mapper Photo = base64String, IsActive = model.IsActive, IsSystem = model.IsSystem, - JoiningDate = model.JoiningDate + JoiningDate = model.JoiningDate, + TenantId = model.TenantId }; } public static BasicEmployeeVM ToBasicEmployeeVMFromEmployee(this Employee employee) diff --git a/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs b/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs index 8373ec2..93e125a 100644 --- a/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs +++ b/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs @@ -28,6 +28,7 @@ public string? ApplicationUserId { get; set; } public Guid? JobRoleId { get; set; } + public Guid TenantId { get; set; } public bool IsSystem { get; set; } public string? JobRole { get; set; } From 88a7a90bfed953a7ece2ac22ed6dad6da178eede Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 22 Aug 2025 12:55:07 +0530 Subject: [PATCH 121/125] Getting the permission through different scope --- .../Controllers/TenantController.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index ec6362f..00303d0 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -227,11 +227,23 @@ namespace Marco.Pms.Services.Controllers bool hasManagePermission, hasModifyPermission, hasViewPermission; using (var scope = _serviceScopeFactory.CreateScope()) { - var permissionService = scope.ServiceProvider.GetRequiredService(); - var manageTask = permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - var modifyTask = permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); - var viewTask = permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id); + + var manageTask = Task.Run(async () => + { + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); + }); + var modifyTask = Task.Run(async () => + { + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ModifyTenant, loggedInEmployee.Id); + }); + var viewTask = Task.Run(async () => + { + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(PermissionsMaster.ViewTenant, loggedInEmployee.Id); + }); await Task.WhenAll(manageTask, modifyTask, viewTask); From 6f7fad1ae4c9e8dac6e46c4b70ad69bb5c54d2c7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 22 Aug 2025 14:50:59 +0530 Subject: [PATCH 122/125] Added a new validation to check if the tenant is it's own tenant --- Marco.Pms.Services/Controllers/TenantController.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 00303d0..7e4e960 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -258,6 +258,12 @@ namespace Marco.Pms.Services.Controllers return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } + if ((hasModifyPermission || hasViewPermission) && id != loggedInEmployee.TenantId) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to access tenant details of other tenant.", loggedInEmployee.Id); + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } // Create a single DbContext for main tenant fetch and related data requests await using var _context = await _dbContextFactory.CreateDbContextAsync(); @@ -652,7 +658,12 @@ namespace Marco.Pms.Services.Controllers _logger.LogWarning("Access denied: User {EmployeeId} lacks required permissions for UpdateTenant on TenantId: {TenantId}.", loggedInEmployee.Id, id); return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } - + if (hasModifyPermission && id != loggedInEmployee.TenantId) + { + _logger.LogWarning("Permission denied: User {EmployeeId} attempted to access tenant details of other tenant.", loggedInEmployee.Id); + return StatusCode(403, + ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); + } // 3. Use a single DbContext instance for data access await using var context = await _dbContextFactory.CreateDbContextAsync(); From 540c3e75fd65845682c896e21faa6bf03857a8ac Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 22 Aug 2025 17:27:53 +0530 Subject: [PATCH 123/125] Changed the logic of validating --- Marco.Pms.Services/Controllers/TenantController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 7e4e960..236fb26 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -258,7 +258,7 @@ namespace Marco.Pms.Services.Controllers return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } - if ((hasModifyPermission || hasViewPermission) && id != loggedInEmployee.TenantId) + if (!hasManagePermission && (hasModifyPermission || hasViewPermission) && id != loggedInEmployee.TenantId) { _logger.LogWarning("Permission denied: User {EmployeeId} attempted to access tenant details of other tenant.", loggedInEmployee.Id); return StatusCode(403, @@ -658,7 +658,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogWarning("Access denied: User {EmployeeId} lacks required permissions for UpdateTenant on TenantId: {TenantId}.", loggedInEmployee.Id, id); return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); } - if (hasModifyPermission && id != loggedInEmployee.TenantId) + if (!hasManagePermission && hasModifyPermission && id != loggedInEmployee.TenantId) { _logger.LogWarning("Permission denied: User {EmployeeId} attempted to access tenant details of other tenant.", loggedInEmployee.Id); return StatusCode(403, From bd4f1d5e691a686827bfde483b7a77e65e100e0c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 23 Aug 2025 11:42:11 +0530 Subject: [PATCH 124/125] Added the IsRoot user Field in employee profile VM --- Marco.Pms.Model/Mapper/EmployeeMapper.cs | 1 + Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs | 1 + Marco.Pms.Services/Helpers/EmployeeHelper.cs | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Model/Mapper/EmployeeMapper.cs b/Marco.Pms.Model/Mapper/EmployeeMapper.cs index 61bac16..b82bccc 100644 --- a/Marco.Pms.Model/Mapper/EmployeeMapper.cs +++ b/Marco.Pms.Model/Mapper/EmployeeMapper.cs @@ -35,6 +35,7 @@ namespace Marco.Pms.Model.Mapper PhoneNumber = model.PhoneNumber, Photo = base64String, IsActive = model.IsActive, + IsRootUser = model.ApplicationUser!.IsRootUser!.Value, IsSystem = model.IsSystem, JoiningDate = model.JoiningDate, TenantId = model.TenantId diff --git a/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs b/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs index 93e125a..c7eda37 100644 --- a/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs +++ b/Marco.Pms.Model/ViewModels/Employee/EmployeeVM.cs @@ -21,6 +21,7 @@ public string? AadharNumber { get; set; } public bool IsActive { get; set; } = true; + public bool IsRootUser { get; set; } public string? PanNumber { get; set; } public string? Photo { get; set; } // To store the captured photo diff --git a/Marco.Pms.Services/Helpers/EmployeeHelper.cs b/Marco.Pms.Services/Helpers/EmployeeHelper.cs index 09dcbe2..d1dc50b 100644 --- a/Marco.Pms.Services/Helpers/EmployeeHelper.cs +++ b/Marco.Pms.Services/Helpers/EmployeeHelper.cs @@ -29,7 +29,7 @@ namespace MarcoBMS.Services.Helpers { var result = await _context.Employees.Where(c => c.ApplicationUserId == ApplicationUserID && c.IsActive == true).ToListAsync(); - return await _context.Employees.Where(c => c.ApplicationUserId == ApplicationUserID && c.IsActive == true).SingleOrDefaultAsync() ?? new Employee { }; + return await _context.Employees.Include(e => e.ApplicationUser).Where(c => c.ApplicationUserId == ApplicationUserID && c.ApplicationUser != null && c.IsActive == true).SingleOrDefaultAsync() ?? new Employee { }; } catch (Exception ex) { From 68027ded777179d2ae6dc65f07af9210043e1ba0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 23 Aug 2025 13:07:20 +0530 Subject: [PATCH 125/125] If user has manage tenant permission then only showing the tenants he/she created --- .../Controllers/TenantController.cs | 17 +++++++++++++---- Marco.Pms.Services/Helpers/UserHelper.cs | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 236fb26..7371661 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -88,20 +88,24 @@ namespace Marco.Pms.Services.Controllers try { // --- 1. PERMISSION CHECK --- + var currentTenant = await _userHelper.GetCurrentTenant(); + if (currentTenant == null) + { + _logger.LogWarning("Authentication failed: No logged-in tenant found."); + return StatusCode(403, ApiResponse.ErrorResponse("Authentication required", "Tenant not found", 403)); + } var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); if (loggedInEmployee == null) { - // This case should be handled by the [Authorize] attribute. - // This check is a safeguard. _logger.LogWarning("Authentication failed: No logged-in employee found."); return StatusCode(403, ApiResponse.ErrorResponse("Authentication required", "User is not logged in.", 403)); } // A root user should have access regardless of the specific permission. - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + var isSuperTenant = currentTenant.IsSuperTenant; var hasPermission = await _permissionService.HasPermission(PermissionsMaster.ManageTenants, loggedInEmployee.Id); - if (!hasPermission || !isRootUser) + if (!hasPermission && !isSuperTenant) { _logger.LogWarning("Permission denied: User {EmployeeId} attempted to list tenants without 'ManageTenants' permission or root access.", loggedInEmployee.Id); return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have the required permissions for this action.", 403)); @@ -114,6 +118,11 @@ namespace Marco.Pms.Services.Controllers // Start with a base IQueryable. Filters will be appended to this. var tenantQuery = _context.Tenants.Where(t => t.IsActive); + if (hasPermission && !isSuperTenant) + { + tenantQuery = tenantQuery.Where(t => t.Id == currentTenant.Id || t.CreatedById == loggedInEmployee.Id); + } + // Apply advanced filters from the JSON filter object. var tenantFilter = TryDeserializeFilter(filter); if (tenantFilter != null) diff --git a/Marco.Pms.Services/Helpers/UserHelper.cs b/Marco.Pms.Services/Helpers/UserHelper.cs index fabc0f3..0b93db4 100644 --- a/Marco.Pms.Services/Helpers/UserHelper.cs +++ b/Marco.Pms.Services/Helpers/UserHelper.cs @@ -1,9 +1,10 @@ -using System.Security.Claims; -using Marco.Pms.DataAccess.Data; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; +using Marco.Pms.Model.TenantModels; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; +using System.Security.Claims; namespace MarcoBMS.Services.Helpers { @@ -25,6 +26,15 @@ namespace MarcoBMS.Services.Helpers var tenant = _httpContextAccessor.HttpContext?.User.FindFirst("TenantId")?.Value; return (tenant != null ? Guid.Parse(tenant) : Guid.Empty); } + public async Task GetCurrentTenant() + { + var tenantId = _httpContextAccessor.HttpContext?.User.FindFirst("TenantId")?.Value; + if (tenantId != null) + { + return await _context.Tenants.FirstOrDefaultAsync(t => t.Id == Guid.Parse(tenantId)); + } + return null; + } public async Task GetCurrentUserAsync() {