From f9213b6040b6980b30729ce91a2763f6d0d57bc7 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 21 Jul 2025 18:21:51 +0530 Subject: [PATCH] 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" + } }