From 6b8ba85a311e544e8c6c6561d518b12532831403 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 15:06:56 +0530 Subject: [PATCH 01/58] added commented job progreaasion API --- .../Controllers/DashboardController.cs | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index eee93bd..edccc51 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1074,5 +1074,79 @@ namespace Marco.Pms.Services.Controllers ApiResponse.ErrorResponse("An error occurred while fetching pending expenses.", "An error occurred while fetching pending expenses.", 500)); // [Error Response] } } + + //[HttpGet("job/progression")] + //public async Task GetJobProgressionAsync([FromQuery] Guid? projectId) + //{ + // Guid AssignedStatus = Guid.Parse("cfa1886d-055f-4ded-84c6-42a2a8a14a66"); + // Guid InProgressStatus = Guid.Parse("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"); + // Guid ReviewDoneStatus = Guid.Parse("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"); + // Guid ClosedStatus = Guid.Parse("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"); + + // if (tenantId == Guid.Empty) + // { + // _logger.LogWarning("Invalid request: TenantId is empty on progression endpoint"); + // return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "Provided Invalid TenantId", 400)); + // } + + // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + // var jobIds = await _context.JobEmployeeMappings + // .Where(jem => jem.AssigneeId == loggedInEmployee.Id && jem.TenantId == tenantId) + // .Select(jem => jem.JobTicketId) + // .ToListAsync(); + + // if (projectId.HasValue) + // { + // var hasPermission = await _permissionServices.HasServiceProjectPermission(loggedInEmployee.Id, projectId.Value); + // if (!hasPermission) + // { + // return StatusCode(403, + // ApiResponse.ErrorResponse("You do not have permission to access this resource", "You do not have permission to access this resource", 403)); + // } + // var jobs = await _context.JobTickets + // .Include(jt => jt.Project) + // .Include(jt => jt.CreatedBy).ThenInclude(e => e!.JobRole) + // .Where(jt => jt.ProjectId == projectId.Value + // && jt.StatusId != ReviewDoneStatus + // && jt.StatusId != ClosedStatus + // && jt.Project != null + // && jt.CreatedBy != null + // && jt.TenantId == tenantId) + // .ToListAsync(); + + // var inProgressJobIds = jobs.Where(jt => jt.StatusId == InProgressStatus).Select(jt => jt.Id).ToList(); + + // var latestTagIns = await _context.JobAttendance + // .Include(ja => ja.Employee) + // .Where(ja => inProgressJobIds.Contains(ja.JobTicketId) + // && ja.Action == TAGGING_MARK_TYPE.TAG_IN + // && ja.TaggedOutAt == null + // && ja.TenantId == tenantId) + // .GroupBy(ja => ja.JobTicketId) + // .Select(g => new + // { + // JobTicketId = g.Key, + // Employee = g.Select(ja => ja.Employee).FirstOrDefault(), + // TagInAt = g.Max(ja => ja.TaggedInAt) + // }) + // .ToListAsync(); + + // var assignedJobs = jobs + // .Where(jt => jt.StatusId == AssignedStatus) + // .Take(5) + // .Select(jt => new + // { + // Project = jt.Project!.Name, + // AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, + // Title = jt.Title, + // AssignedAt = jt.CreatedAt, + + // }) + // .ToList(); + // var inProgressJobs = jobs.Where(jt => jt.StatusId == InProgressStatus).Take(5).ToList(); + // var selfAssignedJobs = jobs.Where(jt => jobIds.Contains(jt.Id)).Take(5).ToList(); + // } + // return Ok(); + //} } } -- 2.43.0 From a6177adb4398e8b950b1aa8be6a3c5ada8e224f9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 18:38:13 +0530 Subject: [PATCH 02/58] Added PurchaseInvoice Related Tables --- .../Data/ApplicationDbContext.cs | 88 +- ...PurchaseInvoice_Related_Tables.Designer.cs | 9385 +++++++++++++++++ ...08_Added_PurchaseInvoice_Related_Tables.cs | 423 + .../ApplicationDbContextModelSnapshot.cs | 528 +- .../Expenses/AdvancePaymentTransaction.cs | 5 - .../PurchaseInvoice/DeliveryChallanDetails.cs | 75 + .../PurchaseInvoice/InvoiceAttachmentType.cs | 9 + .../PurchaseInvoiceAttachment.cs | 61 + .../PurchaseInvoice/PurchaseInvoiceDetails.cs | 205 + .../PurchaseInvoice/PurchaseInvoicePayment.cs | 89 + .../PurchaseInvoice/PurchaseInvoiceStatus.cs | 11 + Marco.Pms.Services/Service/ExpensesService.cs | 21 +- 12 files changed, 10885 insertions(+), 15 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/DeliveryChallanDetails.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/InvoiceAttachmentType.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/PurchaseInvoicePayment.cs create mode 100644 Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceStatus.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index b07ca7a..e1990e9 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -14,6 +14,7 @@ using Marco.Pms.Model.Master; using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.PaymentGetway; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.Roles; using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.TenantModels; @@ -238,6 +239,15 @@ namespace Marco.Pms.DataAccess.Data #endregion + #region ======================================================= Purchase Invoice ======================================================= + public DbSet PurchaseInvoiceDetails { get; set; } + public DbSet DeliveryChallanDetails { get; set; } + public DbSet PurchaseInvoiceAttachments { get; set; } + public DbSet PurchaseInvoicePayments { get; set; } + public DbSet PurchaseInvoiceStatus { get; set; } + public DbSet InvoiceAttachmentTypes { get; set; } + #endregion + protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -554,8 +564,84 @@ namespace Marco.Pms.DataAccess.Data } ); - } + modelBuilder.Entity().HasData( + new InvoiceAttachmentType + { + Id = Guid.Parse("ca294108-a586-4207-88c8-163b24305ddc"), + Name = "Delivery Challan", + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt." + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Name = "E Way Bill", + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000." + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("3ca08288-0a74-4850-9948-0783aa975b84"), + Name = "Tax Invoice", + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC)." + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Name = "E-Invoice", + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code." + } + ); + modelBuilder.Entity().HasData( + new PurchaseInvoiceStatus + { + Id = Guid.Parse("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Name = "Draft", + DisplayName = "Draft", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + Color = "#8592a3" + }, + new PurchaseInvoiceStatus + { + Id = Guid.Parse("16b10201-1651-465c-b2fd-236bdef86f95"), + Name = "Review Pending", + DisplayName = "Submit for Review", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + Color = "#696cff" + }, + new PurchaseInvoiceStatus + { + Id = Guid.Parse("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Name = "Rejected by Reviewer", + DisplayName = "Reject", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + Color = "#ff3e1d" + }, + new PurchaseInvoiceStatus + { + Id = Guid.Parse("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Name = "Approval Pending", + DisplayName = "Mark as Reviewed", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + Color = "#03c3ec" + }, + new PurchaseInvoiceStatus + { + Id = Guid.Parse("58de9cef-811f-46a4-814d-0069b64d98a9"), + Name = "Rejected by Approver", + DisplayName = "Reject", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + Color = "#ff3e1d" + }, + new PurchaseInvoiceStatus + { + Id = Guid.Parse("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Name = "Approved", + DisplayName = "Mark as Approved", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + Color = "#71dd37" + } + ); + } private static void ManageApplicationStructure(ModelBuilder modelBuilder) { // Configure ApplicationRole to Tenant relationship (if Tenant exists) diff --git a/Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.Designer.cs b/Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.Designer.cs new file mode 100644 index 0000000..d07ec21 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.Designer.cs @@ -0,0 +1,9385 @@ +// +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("20251125130508_Added_PurchaseInvoice_Related_Tables")] + partial class Added_PurchaseInvoice_Related_Tables + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.12") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + //MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("ApprovedDate") + .HasColumnType("datetime(6)"); + + b.Property("AssignedBy") + .HasColumnType("char(36)"); + + b.Property("AssignmentDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletedTask") + .HasColumnType("double"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("ParentTaskId") + .HasColumnType("char(36)"); + + b.Property("PlannedTask") + .HasColumnType("double"); + + b.Property("ReportedById") + .HasColumnType("char(36)"); + + b.Property("ReportedDate") + .HasColumnType("datetime(6)"); + + b.Property("ReportedTask") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WorkItemId") + .HasColumnType("char(36)"); + + b.Property("WorkStatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("AssignedBy"); + + b.HasIndex("ReportedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("WorkItemId"); + + b.HasIndex("WorkStatusId"); + + b.ToTable("TaskAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ReferenceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TaskAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CommentDate") + .HasColumnType("datetime(6)"); + + b.Property("CommentedBy") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CommentedBy"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TaskAllocationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TaskMembers"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Activity") + .HasColumnType("int"); + + b.Property("ApprovedAt") + .HasColumnType("datetime(6)"); + + b.Property("ApprovedById") + .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("RequestedAt") + .HasColumnType("datetime(6)"); + + b.Property("RequestedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RequestedById"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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.Collection.Invoice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BasicAmount") + .HasColumnType("double"); + + b.Property("BilledToId") + .HasColumnType("char(36)"); + + b.Property("ClientSubmitedDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ExceptedPaymentDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MarkAsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BilledToId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .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("PaymentAdjustmentHeads"); + + b.HasData( + new + { + Id = new Guid("dbdc047f-a2d2-4db0-b0e6-b9d9f923a0f1"), + Description = "An advance payment is a sum paid before receiving goods or services, often to secure a transaction or cover initial costs.", + IsActive = true, + Name = "Advance payment", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("66c3c241-8b52-4327-a5ad-c1faf102583e"), + Description = "The base amount refers to the principal sum or original value used as a reference in financial calculations, excluding taxes, fees, or additional charges.", + IsActive = true, + Name = "Base Amount", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0d70cb2e-827e-44fc-90a5-c2c55ba51ba9"), + Description = "TDS, or Tax Deducted at Source, is a system under the Indian Income Tax Act where tax is deducted at the point of income generation—such as salary, interest, or rent—and remitted to the government to prevent tax evasion and ensure timely collection.", + IsActive = true, + Name = "Tax Deducted at Source (TDS)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("95f35acd-d979-4177-91ea-fd03a00e49ff"), + Description = "Retention refers to a company's ability to keep customers, employees, or profits over time, commonly measured as a percentage and critical for long-term business sustainability and growth.", + IsActive = true, + Name = "Retention", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("3f09b19a-8d45-4cf2-be27-f4f09b38b9f7"), + Description = "Tax is a mandatory financial charge imposed by a government on individuals or entities to fund public services and government operations, without direct benefit to the taxpayer.", + IsActive = true, + Name = "Tax", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ec5e6a5f-ce62-44e5-8911-8426bbb4dde8"), + Description = "A penalty in the context of taxation is a financial sanction imposed by the government on individuals or entities for non-compliance with tax laws, such as late filing, underreporting income, or failure to pay taxes, and is typically calculated as a percentage of the tax due or a fixed amount.", + IsActive = true, + Name = "Penalty", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("50584332-1cb7-4359-9721-c8ea35040881"), + Description = "Utility fees are recurring charges for essential services such as electricity, water, gas, sewage, waste disposal, internet, and telecommunications, typically based on usage and necessary for operating a home or business.", + IsActive = true, + Name = "Utility fees", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("ReceivedInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("HasApplicationAccess") + .HasColumnType("tinyint(1)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .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("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }, + new + { + Id = new Guid("dbf17591-09fe-4c93-9e1a-12db8f5cc5de"), + Description = "Collection Admin is a permission that grants a user full administrative control over collections, including creating, editing, managing access, and deleting collections within a system.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Collection Admin" + }, + new + { + Id = new Guid("c8d7eea5-4033-4aad-9ebe-76de49896830"), + Description = "View Collection is a permission that allows users to see and browse assets or items within a collection without making any modifications or edits to its contents.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "View Collection" + }, + new + { + Id = new Guid("b93141fd-dbd3-4051-8f57-bf25d18e3555"), + Description = "Authorizes users to create new collections for organizing related resources and managing access", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Create Collection" + }, + new + { + Id = new Guid("455187b4-fef1-41f9-b3d0-025d0b6302c3"), + Description = "Ability to modify collection properties, content, and access rights.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Edit Collection" + }, + new + { + Id = new Guid("061d9ccd-85b4-4cb0-be06-2f9f32cebb72"), + Description = " Enables entry and processing of payment transactions.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Add Payment" + }, + new + { + Id = new Guid("6382ea8b-aff2-4cd2-a48f-a652b35825d8"), + Description = "Manage Recurring Template payment permission allows authorized users to set up, modify, and execute automated recurring payments using predefined templates, ensuring secure and controlled handling of repetitive financial transactions.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "Manage Recurring" + }, + new + { + Id = new Guid("7ddf2fba-c44d-4fe3-b4ec-690ff70be2e3"), + Description = "The \"View All Recurring Template payment permission\" generally allows users to see and access all recurring payment templates in the system, enabling them to review, manage, and process recurring transactions efficiently.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View All Recurring" + }, + new + { + Id = new Guid("e5d21efe-573d-4a16-a0f8-414d3e442e78"), + Description = "View Self Recurring Template payment permission allows a user to view and access their own recurring payment templates without editing rights.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View Self Recurring" + }, + new + { + Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), + Description = "Allow user to create new organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Add Organization" + }, + new + { + Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), + Description = "Allow the user to update the basic information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Edit Organization" + }, + new + { + Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), + Description = "Allow the user to view information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "View Organization" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", 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("CurrentBalance") + .HasColumnType("double"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("FinanceUIdPostfix") + .HasColumnType("int"); + + b.Property("FinanceUIdPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TenantId"); + + b.ToTable("AdvancePaymentTransactions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseUId") + .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("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAttachmentRequried") + .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("ExpenseCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + IsAttachmentRequried = 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("a1cc95ed-b276-4a3e-9f00-0a249b522d64"), + NextStatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("RecurringPaymentStatus"); + + b.HasData( + new + { + Id = new Guid("da462422-13b2-45cc-a175-910a225f6fc8"), + Name = "Active" + }, + new + { + Id = new Guid("3ec864d2-8bf5-42fb-ba70-5090301dd816"), + Name = "De-Activated" + }, + new + { + Id = new Guid("306856fb-5655-42eb-bf8b-808bb5e84725"), + Name = "Completed" + }, + new + { + Id = new Guid("8bfc9346-e092-4a80-acbf-515ae1ef6868"), + Name = "Paused" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("de04b6c7-a5cd-4a61-88b0-b43b0008202e"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseStatusId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAdvancePayment") + .HasColumnType("tinyint(1)"); + + b.Property("IsExpenseCreated") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaidTransactionId") + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("RecurringPaymentId") + .HasColumnType("char(36)"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("ExpenseStatusId"); + + b.HasIndex("PaidById"); + + b.HasIndex("RecurringPaymentId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PaymentRequests"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentRequestAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", 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("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVariable") + .HasColumnType("tinyint(1)"); + + b.Property("LatestPRGeneratedAt") + .HasColumnType("datetime(6)"); + + b.Property("NextStrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("NotifyTo") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentBufferDays") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("StrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RecurringPayments"); + }); + + 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.ActivityGroupMaster", 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit for Review", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }, + new + { + Id = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + Color = "#0E9F6E", + Description = "Create new Expense.", + DisplayName = "Create Expense", + IsActive = true, + IsSystem = true, + Name = "Done" + }); + }); + + 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("IsAttachmentRequried") + .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"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("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("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + Description = "Collection Management is a feature that enables organizations to track, organize, and manage the status and recovery of receivables or assets efficiently throughout their lifecycle, supporting systematic follow-up and resolution of outstanding accounts.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Collection Management" + }, + new + { + Id = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + Description = "Recurring Template Management is the automated creation and scheduling of repetitive tasks, processes, or transactions using predefined templates at set intervals to ensure consistent and efficient workflow execution without manual recreation each time.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Recurring Template Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + Description = "Managing all organization related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Organization Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.ToTable("GlobalActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.ToTable("GlobalActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalServiceMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("GlobalServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }, + new + { + Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), + Description = "Finance Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Finance" + }); + }); + + 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.HasKey("Id"); + + 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" + }, + 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" + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking" + }, + 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" + }, + new + { + Id = new Guid("a820f240-5e9a-4ae9-9091-8a7aa7720cea"), + Description = "A credit card is a payment card that allows you to borrow funds from a financial institution to pay for goods and services", + IsActive = true, + Name = "Credit card" + }, + new + { + Id = new Guid("95697409-baf6-4f78-86ab-42d93d9569a8"), + Description = "A debit card is a payment card that deducts funds directly from the cardholder's bank account when a purchase is made.", + IsActive = true, + Name = "Debit Card" + }, + new + { + Id = new Guid("f67beee6-6763-4108-922c-03bd86b9178d"), + Description = "When a bill is paid using the amount received in advance from a company.", + IsActive = true, + Name = "Advance Payment" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", 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("ServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("StatusUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationHierarchyId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationHierarchyId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TenantId"); + + b.ToTable("OrgHierarchyLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("ServiceId"); + + b.ToTable("OrgServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("OrgTypeMasters"); + + b.HasData( + new + { + Id = new Guid("5ee49bcd-b6d3-482f-9aaf-484afe04abec"), + Name = "Service Provider" + }, + new + { + Id = new Guid("a283356a-9b02-4029-afb7-e65c703efdd4"), + Name = "Sub-Contractor" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + + b.HasData( + new + { + Id = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + Address = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactNumber = "123456789", + ContactPerson = "Admin", + CreatedAt = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "admin@marcoaiot.com", + IsActive = true, + Name = "MarcoBMS", + SPRID = 5400L + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("ReportToId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ReportToId"); + + b.HasIndex("TenantId"); + + b.ToTable("OrganizationHierarchies"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletionDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationTypeId") + .HasColumnType("char(36)"); + + b.Property("ParentOrganizationId") + .HasColumnType("char(36)"); + + b.Property("ProjectServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("OrganizationTypeId"); + + b.HasIndex("ParentOrganizationId"); + + b.HasIndex("ProjectServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActualEndDate") + .HasColumnType("datetime(6)"); + + b.Property("ActualStartDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime(6)"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ReassignedDate") + .HasColumnType("datetime(6)"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PaymentGetway.PaymentDetail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EncryptedDetails") + .HasColumnType("longblob"); + + b.Property("Method") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Nonce") + .HasColumnType("longblob"); + + b.Property("OrderId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Status") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Tag") + .HasColumnType("longblob"); + + b.HasKey("Id"); + + b.ToTable("PaymentDetails"); + }); + + 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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PMCId") + .HasColumnType("char(36)"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("PromoterId") + .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("PMCId"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("PromoterId"); + + 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", + PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + 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.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + + 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.ServiceProject.JobAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("JobCommentId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("JobCommentId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TaggedInAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedInTime") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendance"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobAttendanceId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("MarkedAt") + .HasColumnType("datetime(6)"); + + b.Property("MarkedTIme") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobAttendanceId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssigneeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssigneeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobEmployeeMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("JobStatus"); + + b.HasData( + new + { + Id = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + DisplayName = "New", + Level = 1, + Name = "New" + }, + new + { + Id = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + DisplayName = "Assigned", + Level = 2, + Name = "Assigned" + }, + new + { + Id = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + DisplayName = "In Progress", + Level = 3, + Name = "In Progress" + }, + new + { + Id = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + DisplayName = "Work Done", + Level = 4, + Name = "Work Done" + }, + new + { + Id = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + DisplayName = "Review Done", + Level = 5, + Name = "Review Done" + }, + new + { + Id = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + DisplayName = "Closed", + Level = 6, + Name = "Closed" + }, + new + { + Id = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + DisplayName = "On Hold", + Level = 7, + Name = "On Hold" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobStatusMappings"); + + b.HasData( + new + { + Id = new Guid("024e1810-6a57-4a0d-8d2e-be88da79fcd4"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cb0db140-87fa-4a6f-812d-2834bd0f53a9"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("42f24930-387e-4f51-9c2d-3e29ffaaf02a"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c83c23-09be-40fd-9d05-f44795d8dee8"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8c4ecdae-7435-4475-8389-15bc453561a1"), + NextStatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a44b0a66-ee33-47e7-a01f-6b8d9b621543"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7165ecee-10e3-4fc0-85d2-6d93d5b11776"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("87891499-e45d-406b-bf22-722db1beedc9"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dc986ec4-858e-4c98-b330-4a5c98c91f07"), + NextStatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ca8b4358-3122-4aaa-bcf8-0b66e4ab313a"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5602d32c-290e-48a3-83dd-91af6d12ed46"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9c2918be-b3c1-46fb-a03b-14dd613e1021"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ab974bdb-2d8f-4ddc-9b71-bd6d198bae75"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2787c903-1b39-4e7d-a0f2-3bb2309bb341"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("76bc5551-8f80-469d-ba23-95d7e746c9a9"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("JobTagId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("JobTagId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", 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("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsArchive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectBranchId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectBranchId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobTickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactInformation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ProjectBranches"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("ContactEmail") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPhone") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ServiceProjects"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectServiceMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ServiceProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceProjectTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceProjectId"); + + b.HasIndex("ServiceProjectTagId"); + + b.ToTable("ServiceProjectTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.TeamRoleMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TeamRoleMasters"); + + b.HasData( + new + { + Id = new Guid("8cfbf16f-7d3b-4c29-af5b-18935f20aa7b"), + Description = "A Support role involves assisting users or customers by resolving technical or service-related issues, answering inquiries, and ensuring a positive experience with products or services.", + Name = "Support" + }, + new + { + Id = new Guid("145d7222-408b-4733-8a17-f417e070b8b8"), + Description = "A Service Engineer installs, maintains, repairs, and troubleshoots equipment to ensure optimal operation and customer satisfaction.", + Name = "Service Engineer" + }, + new + { + Id = new Guid("03bf5853-5e0b-4eb8-9f37-33bd999a05b3"), + Description = "A Manager oversees and coordinates a team or department to achieve organizational goals through planning, decision-making, and leadership.", + Name = "Manager" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationSize") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("TenantEnquires"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PaymentDetailId") + .HasColumnType("char(36)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PaymentDetailId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ExpiredAt") + .HasColumnType("datetime(6)"); + + b.Property("FcmToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("FCMTokenMappings"); + }); + + 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.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "RequestedBy") + .WithMany() + .HasForeignKey("RequestedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Employee"); + + b.Navigation("RequestedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.Invoice", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "BilledTo") + .WithMany() + .HasForeignKey("BilledToId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("BilledTo"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId") + .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.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("PaymentRequest"); + + b.Navigation("ProcessedBy"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.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.Expenses.PaymentRequest", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "ExpenseStatus") + .WithMany() + .HasForeignKey("ExpenseStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById"); + + b.HasOne("Marco.Pms.Model.Expenses.RecurringPayment", "RecurringPayment") + .WithMany() + .HasForeignKey("RecurringPaymentId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("ExpenseStatus"); + + b.Navigation("PaidBy"); + + b.Navigation("RecurringPayment"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PaymentRequest"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", "OrganizationHierarchy") + .WithMany() + .HasForeignKey("OrganizationHierarchyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OrganizationHierarchy"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Organization"); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportTo") + .WithMany() + .HasForeignKey("ReportToId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportTo"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", "OrganizationType") + .WithMany() + .HasForeignKey("OrganizationTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "ParentOrganization") + .WithMany() + .HasForeignKey("ParentOrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", "ProjectService") + .WithMany() + .HasForeignKey("ProjectServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("OrganizationType"); + + b.Navigation("ParentOrganization"); + + b.Navigation("ProjectService"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC") + .WithMany() + .HasForeignKey("PMCId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter") + .WithMany() + .HasForeignKey("PromoterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PMC"); + + b.Navigation("ProjectStatus"); + + b.Navigation("Promoter"); + + 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.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobComment", "JobComment") + .WithMany() + .HasForeignKey("JobCommentId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("JobComment"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + 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.ServiceProject.JobAttendance", "JobAttendance") + .WithMany() + .HasForeignKey("JobAttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("JobAttendance"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobTag", "JobTag") + .WithMany() + .HasForeignKey("JobTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobTag"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ProjectBranch", "ProjectBranch") + .WithMany() + .HasForeignKey("ProjectBranchId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("ProjectBranch"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Client"); + + b.Navigation("CreatedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById"); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "ServiceProject") + .WithMany() + .HasForeignKey("ServiceProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProjectTag", "ServiceProjectTag") + .WithMany() + .HasForeignKey("ServiceProjectTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceProject"); + + b.Navigation("ServiceProjectTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("Organization"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PaymentGetway.PaymentDetail", "PaymentDetail") + .WithMany() + .HasForeignKey("PaymentDetailId"); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("PaymentDetail"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.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/20251125130508_Added_PurchaseInvoice_Related_Tables.cs b/Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.cs new file mode 100644 index 0000000..a417698 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251125130508_Added_PurchaseInvoice_Related_Tables.cs @@ -0,0 +1,423 @@ +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_PurchaseInvoice_Related_Tables : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_AdvancePaymentTransactions_Projects_ProjectId", + table: "AdvancePaymentTransactions"); + + migrationBuilder.DropIndex( + name: "IX_AdvancePaymentTransactions_ProjectId", + table: "AdvancePaymentTransactions"); + + migrationBuilder.CreateTable( + name: "InvoiceAttachmentTypes", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_InvoiceAttachmentTypes", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "PurchaseInvoiceDetails", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UIDPrefix = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + UIDPostfix = table.Column(type: "int", nullable: false), + Title = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ProjectId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + OrganizationId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + BillingAddress = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ShippingAddress = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + PurchaseOrderNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + PurchaseOrderDate = table.Column(type: "datetime(6)", nullable: true), + SupplierId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + ProformaInvoiceNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + ProformaInvoiceDate = table.Column(type: "datetime(6)", nullable: true), + ProformaInvoiceAmount = table.Column(type: "double", nullable: true), + InvoiceNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + InvoiceDate = table.Column(type: "datetime(6)", nullable: true), + EWayBillNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + EWayBillDate = table.Column(type: "datetime(6)", nullable: true), + InvoiceReferenceNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + AcknowledgmentNumber = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + AcknowledgmentDate = table.Column(type: "datetime(6)", nullable: true), + BaseAmount = table.Column(type: "double", nullable: false), + TaxAmount = table.Column(type: "double", nullable: false), + TransportCharges = table.Column(type: "double", nullable: true), + TotalAmount = table.Column(type: "double", nullable: false), + PaymentDueDate = table.Column(type: "datetime(6)", nullable: false), + IsActive = table.Column(type: "tinyint(1)", nullable: false), + CreatedById = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + UpdatedById = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + UpdatedAt = table.Column(type: "datetime(6)", nullable: true), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_PurchaseInvoiceDetails", x => x.Id); + table.ForeignKey( + name: "FK_PurchaseInvoiceDetails_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceDetails_Employees_UpdatedById", + column: x => x.UpdatedById, + principalTable: "Employees", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_PurchaseInvoiceDetails_Organizations_OrganizationId", + column: x => x.OrganizationId, + principalTable: "Organizations", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceDetails_Organizations_SupplierId", + column: x => x.SupplierId, + principalTable: "Organizations", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceDetails_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "PurchaseInvoiceStatus", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DisplayName = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Color = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_PurchaseInvoiceStatus", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "PurchaseInvoiceAttachments", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PurchaseInvoiceId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DocumentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UploadedAt = table.Column(type: "datetime(6)", nullable: false), + UploadedById = 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_PurchaseInvoiceAttachments", x => x.Id); + table.ForeignKey( + name: "FK_PurchaseInvoiceAttachments_Documents_DocumentId", + column: x => x.DocumentId, + principalTable: "Documents", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceAttachments_Employees_UploadedById", + column: x => x.UploadedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceAttachments_PurchaseInvoiceDetails_PurchaseIn~", + column: x => x.PurchaseInvoiceId, + principalTable: "PurchaseInvoiceDetails", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoiceAttachments_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "PurchaseInvoicePayments", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + InvoiceId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PaymentReceivedDate = table.Column(type: "datetime(6)", nullable: false), + TransactionId = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Amount = table.Column(type: "double", nullable: false), + Comment = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsActive = table.Column(type: "tinyint(1)", nullable: false), + PaymentAdjustmentHeadId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + CreatedById = 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_PurchaseInvoicePayments", x => x.Id); + table.ForeignKey( + name: "FK_PurchaseInvoicePayments_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoicePayments_PaymentAdjustmentHeads_PaymentAdjust~", + column: x => x.PaymentAdjustmentHeadId, + principalTable: "PaymentAdjustmentHeads", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoicePayments_PurchaseInvoiceDetails_InvoiceId", + column: x => x.InvoiceId, + principalTable: "PurchaseInvoiceDetails", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PurchaseInvoicePayments_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "DeliveryChallanDetails", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + DeliveryChallanNumber = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DeliveryChallanDate = table.Column(type: "datetime(6)", nullable: false), + Description = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + PurchaseInvoiceId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + AttachmentId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + CreatedAt = table.Column(type: "datetime(6)", nullable: false), + CreatedById = 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_DeliveryChallanDetails", x => x.Id); + table.ForeignKey( + name: "FK_DeliveryChallanDetails_Employees_CreatedById", + column: x => x.CreatedById, + principalTable: "Employees", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DeliveryChallanDetails_PurchaseInvoiceAttachments_Attachment~", + column: x => x.AttachmentId, + principalTable: "PurchaseInvoiceAttachments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DeliveryChallanDetails_PurchaseInvoiceDetails_PurchaseInvoic~", + column: x => x.PurchaseInvoiceId, + principalTable: "PurchaseInvoiceDetails", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_DeliveryChallanDetails_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.InsertData( + table: "InvoiceAttachmentTypes", + columns: new[] { "Id", "Description", "Name" }, + values: new object[,] + { + { new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", "E Way Bill" }, + { new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", "E-Invoice" }, + { new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", "Tax Invoice" }, + { new Guid("ca294108-a586-4207-88c8-163b24305ddc"), "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", "Delivery Challan" } + }); + + migrationBuilder.InsertData( + table: "PurchaseInvoiceStatus", + columns: new[] { "Id", "Color", "Description", "DisplayName", "Name" }, + values: new object[,] + { + { new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), "#696cff", "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", "Submit for Review", "Review Pending" }, + { new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), "#ff3e1d", "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", "Reject", "Rejected by Approver" }, + { new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), "#71dd37", "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", "Mark as Approved", "Approved" }, + { new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), "#03c3ec", "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", "Mark as Reviewed", "Approval Pending" }, + { new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), "#8592a3", "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", "Draft", "Draft" }, + { new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), "#ff3e1d", "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", "Reject", "Rejected by Reviewer" } + }); + + migrationBuilder.CreateIndex( + name: "IX_DeliveryChallanDetails_AttachmentId", + table: "DeliveryChallanDetails", + column: "AttachmentId"); + + migrationBuilder.CreateIndex( + name: "IX_DeliveryChallanDetails_CreatedById", + table: "DeliveryChallanDetails", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_DeliveryChallanDetails_PurchaseInvoiceId", + table: "DeliveryChallanDetails", + column: "PurchaseInvoiceId"); + + migrationBuilder.CreateIndex( + name: "IX_DeliveryChallanDetails_TenantId", + table: "DeliveryChallanDetails", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceAttachments_DocumentId", + table: "PurchaseInvoiceAttachments", + column: "DocumentId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceAttachments_PurchaseInvoiceId", + table: "PurchaseInvoiceAttachments", + column: "PurchaseInvoiceId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceAttachments_TenantId", + table: "PurchaseInvoiceAttachments", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceAttachments_UploadedById", + table: "PurchaseInvoiceAttachments", + column: "UploadedById"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_CreatedById", + table: "PurchaseInvoiceDetails", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_OrganizationId", + table: "PurchaseInvoiceDetails", + column: "OrganizationId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_SupplierId", + table: "PurchaseInvoiceDetails", + column: "SupplierId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_TenantId", + table: "PurchaseInvoiceDetails", + column: "TenantId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_UpdatedById", + table: "PurchaseInvoiceDetails", + column: "UpdatedById"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoicePayments_CreatedById", + table: "PurchaseInvoicePayments", + column: "CreatedById"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoicePayments_InvoiceId", + table: "PurchaseInvoicePayments", + column: "InvoiceId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoicePayments_PaymentAdjustmentHeadId", + table: "PurchaseInvoicePayments", + column: "PaymentAdjustmentHeadId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoicePayments_TenantId", + table: "PurchaseInvoicePayments", + column: "TenantId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "DeliveryChallanDetails"); + + migrationBuilder.DropTable( + name: "InvoiceAttachmentTypes"); + + migrationBuilder.DropTable( + name: "PurchaseInvoicePayments"); + + migrationBuilder.DropTable( + name: "PurchaseInvoiceStatus"); + + migrationBuilder.DropTable( + name: "PurchaseInvoiceAttachments"); + + migrationBuilder.DropTable( + name: "PurchaseInvoiceDetails"); + + migrationBuilder.CreateIndex( + name: "IX_AdvancePaymentTransactions_ProjectId", + table: "AdvancePaymentTransactions", + column: "ProjectId"); + + migrationBuilder.AddForeignKey( + name: "FK_AdvancePaymentTransactions_Projects_ProjectId", + table: "AdvancePaymentTransactions", + column: "ProjectId", + principalTable: "Projects", + principalColumn: "Id"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 0535ca5..31f566e 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -2141,8 +2141,6 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("EmployeeId"); - b.HasIndex("ProjectId"); - b.HasIndex("TenantId"); b.ToTable("AdvancePaymentTransactions"); @@ -4964,6 +4962,380 @@ namespace Marco.Pms.DataAccess.Migrations b.ToTable("WorkItems"); }); + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => { b.Property("Id") @@ -7245,10 +7617,6 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Marco.Pms.Model.Projects.Project", "Project") - .WithMany() - .HasForeignKey("ProjectId"); - b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") .WithMany() .HasForeignKey("TenantId") @@ -7259,8 +7627,6 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Employee"); - b.Navigation("Project"); - b.Navigation("Tenant"); }); @@ -8190,6 +8556,152 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("WorkCategoryMaster"); }); + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => { b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) diff --git a/Marco.Pms.Model/Expenses/AdvancePaymentTransaction.cs b/Marco.Pms.Model/Expenses/AdvancePaymentTransaction.cs index 99675b3..e11ce97 100644 --- a/Marco.Pms.Model/Expenses/AdvancePaymentTransaction.cs +++ b/Marco.Pms.Model/Expenses/AdvancePaymentTransaction.cs @@ -1,5 +1,4 @@ using Marco.Pms.Model.Employees; -using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using System.ComponentModel.DataAnnotations.Schema; @@ -13,10 +12,6 @@ namespace Marco.Pms.Model.Expenses public int FinanceUIdPostfix { get; set; } public string Title { get; set; } = default!; public Guid? ProjectId { get; set; } - - [ValidateNever] - [ForeignKey("ProjectId")] - public Project? Project { get; set; } public Guid EmployeeId { get; set; } [ValidateNever] diff --git a/Marco.Pms.Model/PurchaseInvoice/DeliveryChallanDetails.cs b/Marco.Pms.Model/PurchaseInvoice/DeliveryChallanDetails.cs new file mode 100644 index 0000000..efe7472 --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/DeliveryChallanDetails.cs @@ -0,0 +1,75 @@ +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.PurchaseInvoice +{ + /// + /// Represents a detail of a delivery challan in the Purchase Invoice system. + /// This class inherits from the TenantRelation class and adds specific properties related to a delivery challan. + /// + public class DeliveryChallanDetails : TenantRelation + { + /// + /// Gets or sets the unique identifier for the delivery challan. + /// + public Guid Id { get; set; } + + /// + /// Gets or sets the delivery challan number. + /// + public string DeliveryChallanNumber { get; set; } = default!; + + /// + /// Gets or sets the date of the delivery challan. + /// + public DateTime DeliveryChallanDate { get; set; } + + /// + /// Gets or sets the description of the delivery challan. + /// + public string Description { get; set; } = default!; + + /// + /// Gets or sets the unique identifier of the associated PurchaseInvoice. + /// + public Guid PurchaseInvoiceId { get; set; } + + /// + /// Gets or sets the associated PurchaseInvoice. + /// + [ValidateNever] + [ForeignKey("PurchaseInvoiceId")] + public PurchaseInvoiceDetails? PurchaseInvoice { get; set; } + + /// + /// Gets or sets the unique identifier of the associated Attachment. + /// + public Guid AttachmentId { get; set; } + + /// + /// Gets or sets the associated Attachment. + /// + [ValidateNever] + [ForeignKey("AttachmentId")] + public PurchaseInvoiceAttachment? Attachment { get; set; } + + /// + /// Gets or sets the date and time the record was created. + /// + public DateTime CreatedAt { get; set; } + + /// + /// Gets or sets the unique identifier of the user who created the record. + /// + public Guid CreatedById { get; set; } + + /// + /// Gets or sets the user who created the record. + /// + [ValidateNever] + [ForeignKey("CreatedById")] + public Employee? CreatedBy { get; set; } + } +} diff --git a/Marco.Pms.Model/PurchaseInvoice/InvoiceAttachmentType.cs b/Marco.Pms.Model/PurchaseInvoice/InvoiceAttachmentType.cs new file mode 100644 index 0000000..d75b96a --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/InvoiceAttachmentType.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.PurchaseInvoice +{ + public class InvoiceAttachmentType + { + public Guid Id { get; set; } + public string Name { get; set; } = default!; + public string Description { get; set; } = default!; + } +} diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs new file mode 100644 index 0000000..a82c4d6 --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs @@ -0,0 +1,61 @@ +using Marco.Pms.Model.DocumentManager; +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.PurchaseInvoice +{ + /// + /// Represents an attachment for a purchase invoice. + /// + public class PurchaseInvoiceAttachment : TenantRelation + { + /// + /// Gets or sets the unique identifier for the attachment. + /// + public Guid Id { get; set; } + + /// + /// Gets or sets the unique identifier for the purchase invoice. + /// + public Guid PurchaseInvoiceId { get; set; } + + /// + /// Gets or sets the purchase invoice associated with the attachment. + /// + [ValidateNever] + [ForeignKey("PurchaseInvoiceId")] + public PurchaseInvoiceDetails? PurchaseInvoice { get; set; } + + /// + /// Gets or sets the unique identifier for the document. + /// + public Guid DocumentId { get; set; } + + /// + /// Gets or sets the document associated with the attachment. + /// + [ValidateNever] + [ForeignKey("DocumentId")] + public Document? Document { get; set; } + + /// + /// Gets or sets the date and time when the attachment was uploaded. + /// + public DateTime UploadedAt { get; set; } + + /// + /// Gets or sets the unique identifier of the employee who uploaded the attachment. + /// + public Guid UploadedById { get; set; } + + /// + /// Gets or sets the employee who uploaded the attachment. + /// + [ValidateNever] + [ForeignKey("UploadedById")] + public Employee? UploadedBy { get; set; } + } + +} diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs new file mode 100644 index 0000000..bd5a890 --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs @@ -0,0 +1,205 @@ +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.OrganizationModel; +using Marco.Pms.Model.Utilities; +using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Marco.Pms.Model.PurchaseInvoice +{ + /// + /// The PurchaseInvoiceDetails class represents a detail in a purchase invoice. + /// It contains information about the detail such as its unique identifier, title, description, billing and shipping addresses, + /// purchase order number and date, supplier information, proforma invoice details, invoice details, e-way bill details, + /// invoice reference number, acknowledgment number and date, base amount, tax amount, transport charges, total amount, and payment due date. + /// + public class PurchaseInvoiceDetails : TenantRelation + { + + /// + /// Gets or sets the unique identifier of the detail. + /// + public Guid Id { get; set; } + + /// + /// Gets or sets the prefix of the unique identifier for the detail. + /// + public string UIDPrefix { get; set; } = default!; // PUR/MMYY/ + + /// + /// Gets or sets the postfix of the unique identifier for the detail. + /// + public int UIDPostfix { get; set; } // 00001 + + /// + /// Gets or sets the title of the detail. + /// + public string Title { get; set; } = default!; + + /// + /// Gets or sets the description of the detail. + /// + public string Description { get; set; } = default!; + + /// + /// Gets or sets the unique identifier of the related project. + /// + public Guid ProjectId { get; set; } + + /// + /// Gets or sets the unique identifier of the organization related to the detail. + /// + public Guid OrganizationId { get; set; } + + /// + /// Gets or sets the related organization. + /// + [ValidateNever] + [ForeignKey("OrganizationId")] + public Organization? Organization { get; set; } + + /// + /// Gets or sets the billing address of the detail. + /// + public string BillingAddress { get; set; } = default!; + + /// + /// Gets or sets the shipping address of the detail. + /// + public string ShippingAddress { get; set; } = default!; + + /// + /// Gets or sets the purchase order number of the detail. + /// + public string? PurchaseOrderNumber { get; set; } + + /// + /// Gets or sets the purchase order date of the detail. + /// + public DateTime? PurchaseOrderDate { get; set; } + + /// + /// Gets or sets the unique identifier of the supplier related to the detail. + /// + public Guid SupplierId { get; set; } + + /// + /// Gets or sets the related supplier. + /// + [ValidateNever] + [ForeignKey("SupplierId")] + public Organization? Supplier { get; set; } + /// + /// Gets or sets the proforma invoice number of the detail. + /// + public string? ProformaInvoiceNumber { get; set; } + + /// + /// Gets or sets the proforma invoice date of the detail. + /// + public DateTime? ProformaInvoiceDate { get; set; } + + /// + /// Gets or sets the proforma invoice amount of the detail. + /// + public double? ProformaInvoiceAmount { get; set; } + + /// + /// Gets or sets the invoice number of the detail. + /// + public string? InvoiceNumber { get; set; } + + /// + /// Gets or sets the invoice date of the detail. + /// + public DateTime? InvoiceDate { get; set; } + + /// + /// Gets or sets the e-way bill number of the detail. + /// + public string? EWayBillNumber { get; set; } + + /// + /// Gets or sets the e-way bill date of the detail. + /// + public DateTime? EWayBillDate { get; set; } + + /// + /// Gets or sets the invoice reference number of the detail. + /// + public string? InvoiceReferenceNumber { get; set; } + + /// + /// Gets or sets the acknowledgment number of the detail. + /// + public string? AcknowledgmentNumber { get; set; } + + /// + /// Gets or sets the acknowledgment date of the detail. + /// + public DateTime? AcknowledgmentDate { get; set; } + + /// + /// Gets or sets the base amount of the detail. + /// + public double BaseAmount { get; set; } + + /// + /// Gets or sets the tax amount of the detail. + /// + public double TaxAmount { get; set; } + + /// + /// Gets or sets the transport charges of the detail. + /// + public double? TransportCharges { get; set; } + + /// + /// Gets or sets the total amount of the detail. + /// + public double TotalAmount { get; set; } + + /// + /// The payment due date of the detail. + /// + public DateTime PaymentDueDate { get; set; } // Defaults to 40 days from the invoice date + /// + /// Gets or sets a value indicating whether the detail is active. + /// + public bool IsActive { get; set; } + + /// + /// Gets or sets the unique identifier of the user who created the detail. + /// + public Guid CreatedById { get; set; } + + /// + /// Gets or sets the user who created the detail. + /// + [ValidateNever] + [ForeignKey("CreatedById")] + public Employee? CreatedBy { get; set; } + + /// + /// Gets or sets the date and time when the detail was created. + /// + public DateTime CreatedAt { get; set; } + + /// + /// Gets or sets the unique identifier of the user who last updated the detail. + /// + public Guid? UpdatedById { get; set; } + + /// + /// Gets or sets the user who last updated the detail. + /// + [ValidateNever] + [ForeignKey("UpdatedById")] + public Employee? UpdatedBy { get; set; } + + /// + /// Gets or sets the date and time when the detail was last updated. + /// + public DateTime? UpdatedAt { get; set; } + + } +} diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoicePayment.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoicePayment.cs new file mode 100644 index 0000000..f21324a --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoicePayment.cs @@ -0,0 +1,89 @@ +using Marco.Pms.Model.Collection; +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.PurchaseInvoice +{ + /// + /// Represents a payment made against a purchase invoice. + /// It is a subclass of TenantRelation, indicating that it is a relation between a tenant and the Marco PMS system. + /// + public class PurchaseInvoicePayment : TenantRelation + { + /// + /// Gets or sets the unique identifier of the payment. + /// + public Guid Id { get; set; } + + /// + /// Gets or sets the unique identifier of the associated purchase invoice. + /// + public Guid InvoiceId { get; set; } + + /// + /// Gets or sets the associated purchase invoice. + /// This is a navigation property that allows access to the associated PurchaseInvoiceDetails object. + /// + [ValidateNever] + [ForeignKey("InvoiceId")] + public PurchaseInvoiceDetails? Invoice { get; set; } + + /// + /// Gets or sets the date the payment was received. + /// + public DateTime PaymentReceivedDate { get; set; } + + /// + /// Gets or sets the transaction ID of the payment. + /// + public string TransactionId { get; set; } = default!; + + /// + /// Gets or sets the amount of the payment. + /// + public double Amount { get; set; } + + /// + /// Gets or sets a comment about the payment. + /// + public string Comment { get; set; } = default!; + + /// + /// Gets or sets a value indicating whether the payment is active. + /// + public bool IsActive { get; set; } = true; + + /// + /// Gets or sets the unique identifier of the payment adjustment head. + /// + public Guid PaymentAdjustmentHeadId { get; set; } + + /// + /// Gets or sets the associated payment adjustment head. + /// This is a navigation property that allows access to the associated PaymentAdjustmentHead object. + /// + [ValidateNever] + [ForeignKey("PaymentAdjustmentHeadId")] + public PaymentAdjustmentHead? PaymentAdjustmentHead { get; set; } + + /// + /// Gets or sets the date and time the record was created. + /// + public DateTime CreatedAt { get; set; } + + /// + /// Gets or sets the unique identifier of the user who created the record. + /// + public Guid CreatedById { get; set; } + + /// + /// Gets or sets the user who created the record. + /// This is a navigation property that allows access to the associated Employee object. + /// + [ValidateNever] + [ForeignKey("CreatedById")] + public Employee? CreatedBy { get; set; } + } +} diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceStatus.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceStatus.cs new file mode 100644 index 0000000..ba86f66 --- /dev/null +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceStatus.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.PurchaseInvoice +{ + public class PurchaseInvoiceStatus + { + public Guid Id { get; set; } + public string Name { get; set; } = default!; + public string DisplayName { get; set; } = default!; + public string Color { get; set; } = default!; + public string Description { get; set; } = default!; + } +} diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d157f5b..d3309b9 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -3644,7 +3644,6 @@ namespace Marco.Pms.Services.Service { // Fetch advance payment transactions for specified employee, including related navigation properties var transactions = await _context.AdvancePaymentTransactions - .Include(apt => apt.Project) .Include(apt => apt.Employee).ThenInclude(e => e!.JobRole) .Include(apt => apt.CreatedBy).ThenInclude(e => e!.JobRole) .Where(apt => apt.EmployeeId == employeeId && apt.TenantId == tenantId && apt.IsActive) @@ -3658,11 +3657,31 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("No advance payment transactions found.", null, 404); } + var projectIds = transactions.Select(pr => pr.ProjectId).ToList(); + + var infraProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).Select(p => _mapper.Map(p)).ToListAsync(); + }); + + var serviceProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ServiceProjects.Where(sp => projectIds.Contains(sp.Id) && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).ToListAsync(); + }); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result; + projects.AddRange(serviceProjectTask.Result); + // Map transactions to view model with formatted FinanceUId var response = transactions.Select(transaction => { var result = _mapper.Map(transaction); result.FinanceUId = $"{transaction.FinanceUIdPrefix}/{transaction.FinanceUIdPostfix:D5}"; + result.Project = projects.Where(p => p.Id == transaction.ProjectId).Select(p => _mapper.Map(p)).FirstOrDefault(); return result; }).ToList(); -- 2.43.0 From 8aace3e1d91d6a9c337d4a646656b3f6b9917bce Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 18:58:46 +0530 Subject: [PATCH 03/58] Added an API to get Purchase invoice status list API --- .../Controllers/MasterController.cs | 11 ++++ Marco.Pms.Services/Service/MasterService.cs | 57 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 4 ++ 3 files changed, 72 insertions(+) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 8668ee3..78cb989 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -70,6 +70,17 @@ namespace Marco.Pms.Services.Controllers #endregion + #region =================================================================== Purchase Invoice Status APIs =================================================================== + [HttpGet("purchase-invoice-status/list")] + public async Task GetPurchaseInvoiceStatus(CancellationToken ct) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.GetPurchaseInvoiceStatusAsync(loggedInEmployee, ct); + return StatusCode(response.StatusCode, response); + } + + #endregion + #region =================================================================== Currency APIs =================================================================== [HttpGet("currencies/list")] diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index ed39779..7398aab 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -187,6 +187,63 @@ namespace Marco.Pms.Services.Service } #endregion + #region =================================================================== Purchase Invoice Status APIs =================================================================== + + /// + /// Asynchronously retrieves a list of all available Purchase Invoice Statuses. + /// + /// The employee context (used for logging or future permission checks). + /// Token to observe while waiting for the task to complete. + /// A unified API response containing the list of status DTOs. + public async Task> GetPurchaseInvoiceStatusAsync(Employee loggedInEmployee, CancellationToken cancellationToken = default) + { + // 1. Structural Logging: Capture the context of who is performing the action + _logger.LogInfo("Initiating fetch of Purchase Invoice Statuses for User ID: {UserId}", loggedInEmployee.Id); + + try + { + // 2. Performance & Security: Use AsNoTracking, Select specifically (Projection), and handle CancellationToken + var invoiceStatuses = await _context.PurchaseInvoiceStatus + .AsNoTracking() // Critical for read-only queries to avoid overhead of change tracker + .OrderBy(status => status.Name) + .ToListAsync(cancellationToken); // Respect request cancellation + + // 3. Logging Success: Log the count for monitoring purposes + _logger.LogInfo("Successfully fetched {Count} Purchase Invoice Status records.", invoiceStatuses.Count); + + // 4. Strongly Typed Return: Return specific DTOs, not 'object' + return ApiResponse.SuccessResponse( + invoiceStatuses, + $"{invoiceStatuses.Count} record(s) of Purchase invoice status fetched successfully", + 200 + ); + } + catch (OperationCanceledException) + { + // Handle cases where the user cancels the request (browser closed/timeout) + _logger.LogWarning("Purchase Invoice Status fetch was cancelled by the user."); + return ApiResponse.ErrorResponse( + "Request was cancelled", + "Operation cancelled.", + 499 // Client Closed Request + ); + } + catch (Exception ex) + { + // 5. Security & Error Handling: Log full stack trace securely, return generic message to client + _logger.LogError(ex, "Critical error occurred while fetching Purchase Invoice Statuses for User ID: {UserId}", loggedInEmployee.Id); + + // NEVER return 'ex.Message' directly to the client in production (security risk) + return ApiResponse.ErrorResponse( + "An internal error occurred while processing your request. Please contact support.", + "Internal Server Error", + 500 + ); + } + } + + #endregion + #region =================================================================== Currency APIs =================================================================== public async Task> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId) diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index d5eb10c..93b71ec 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -22,6 +22,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetRecurringPaymentStatusAsync(Employee loggedInEmployee, Guid tenantId); #endregion + #region =================================================================== Purchase Invoice Status APIs =================================================================== + Task> GetPurchaseInvoiceStatusAsync(Employee loggedInEmployee, CancellationToken cancellationToken); + + #endregion #region =================================================================== Currency APIs =================================================================== Task> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From c4653b557c7bb14e40e586ccacf2b5c5a71e93e3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 19:12:29 +0530 Subject: [PATCH 04/58] Added an API to get a list of Invoice attachment types --- .../Controllers/MasterController.cs | 32 +++++++++++ Marco.Pms.Services/Service/MasterService.cs | 55 +++++++++++++++++++ .../ServiceInterfaces/IMasterService.cs | 4 ++ 3 files changed, 91 insertions(+) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 78cb989..475cd5d 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -71,16 +71,48 @@ namespace Marco.Pms.Services.Controllers #endregion #region =================================================================== Purchase Invoice Status APIs =================================================================== + + /// + /// Retrieves the purchase invoice status. + /// + /// The cancellation token. + /// The HTTP response containing the purchase invoice status. [HttpGet("purchase-invoice-status/list")] public async Task GetPurchaseInvoiceStatus(CancellationToken ct) { + // Get the currently logged-in employee. var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Retrieve the purchase invoice status asynchronously. var response = await _masterService.GetPurchaseInvoiceStatusAsync(loggedInEmployee, ct); + + // Return the HTTP response with the purchase invoice status. return StatusCode(response.StatusCode, response); } #endregion + #region =================================================================== Invoice Attachment Type APIs =================================================================== + + /// + /// Retrieves the invoice attachment types. + /// + /// The cancellation token. + /// The HTTP response containing the invoice attachment types. + [HttpGet("purchase-attachment-type/list")] + public async Task GetInvoiceAttachmentType(CancellationToken ct) + { + // Get the currently logged-in employee. + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Retrieve the invoice attachment types asynchronously. + var response = await _masterService.GetInvoiceAttachmentTypeAsync(loggedInEmployee, ct); + + // Return the HTTP response with the invoice attachment types. + return StatusCode(response.StatusCode, response); + } + #endregion + #region =================================================================== Currency APIs =================================================================== [HttpGet("currencies/list")] diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 7398aab..e55adf8 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -244,6 +244,61 @@ namespace Marco.Pms.Services.Service #endregion + #region =================================================================== Invoice Attachment Type APIs =================================================================== + + /// + /// Asynchronously retrieves the list of valid Invoice Attachment Types. + /// + /// The current user context for audit logging. + /// Token to propagate notification that operations should be canceled. + /// A standardized API response containing a list of attachment type DTOs. + public async Task> GetInvoiceAttachmentTypeAsync(Employee loggedInEmployee, CancellationToken cancellationToken = default) + { + // 1. Structured Logging: Audit WHO is requesting the data + _logger.LogInfo("Initiating fetch of Invoice Attachment Types. Requested by User ID: {UserId}", loggedInEmployee.Id); + + try + { + // 2. Database Optimization: + // - AsNoTracking(): Crucial for read-only lists. Bypasses change tracking overhead. + // - Select(): Projects directly to DTO. Fetches ONLY needed columns (SQL optimization). + var attachmentTypes = await _context.InvoiceAttachmentTypes + .AsNoTracking() + .OrderBy(type => type.Name) + .ToListAsync(cancellationToken); // 3. Pass the token to EF Core + + _logger.LogInfo("Successfully retrieved {Count} Invoice Attachment Types.", attachmentTypes.Count); + + // 4. Strong Typing: Return IEnumerable instead of 'object' + return ApiResponse.SuccessResponse( + attachmentTypes, + $"{attachmentTypes.Count} record(s) of invoice attachment type fetched successfully", + 200 + ); + } + catch (OperationCanceledException) + { + // Handle request cancellation (e.g., user navigated away) + _logger.LogWarning("Invoice Attachment Type fetch operation was canceled by the client."); + return ApiResponse.ErrorResponse("Operation canceled", "Request canceled by user", 499); + } + catch (Exception ex) + { + // 5. Security & Error Handling: + // Log the real error with stack trace internally. + _logger.LogError(ex, "Critical error fetching Invoice Attachment Types for User ID: {UserId}", loggedInEmployee.Id); + + // Return a sanitized message to the client. Never expose raw SQL errors or Stack Traces. + return ApiResponse.ErrorResponse( + "An unexpected error occurred while processing your request.", + "Internal Server Error", + 500 + ); + } + } + + #endregion + #region =================================================================== Currency APIs =================================================================== public async Task> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId) diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 93b71ec..889c8fb 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -25,6 +25,10 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Purchase Invoice Status APIs =================================================================== Task> GetPurchaseInvoiceStatusAsync(Employee loggedInEmployee, CancellationToken cancellationToken); + #endregion + #region =================================================================== Invoice Attachment Type APIs =================================================================== + Task> GetInvoiceAttachmentTypeAsync(Employee loggedInEmployee, CancellationToken cancellationToken); + #endregion #region =================================================================== Currency APIs =================================================================== Task> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From d1f5240f8ffb3c093c55a2a1c96f6697e7763371 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 19:21:35 +0530 Subject: [PATCH 05/58] Corrected the invoice attachment type APIs endpoint --- Marco.Pms.Services/Controllers/MasterController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 475cd5d..4a7b142 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -99,7 +99,7 @@ namespace Marco.Pms.Services.Controllers /// /// The cancellation token. /// The HTTP response containing the invoice attachment types. - [HttpGet("purchase-attachment-type/list")] + [HttpGet("invoice-attachment-type/list")] public async Task GetInvoiceAttachmentType(CancellationToken ct) { // Get the currently logged-in employee. -- 2.43.0 From fa1c534ba8709359a70c68834bf2325ae53c4292 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 25 Nov 2025 20:04:59 +0530 Subject: [PATCH 06/58] Added Status In Purchase Invoice Details Table --- ...n_PurchaseInvoiceDetails_Table.Designer.cs | 9411 +++++++++++++++++ ..._Status_In_PurchaseInvoiceDetails_Table.cs | 84 + .../ApplicationDbContextModelSnapshot.cs | 26 + 3 files changed, 9521 insertions(+) create mode 100644 Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.cs diff --git a/Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.Designer.cs new file mode 100644 index 0000000..c9d516d --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.Designer.cs @@ -0,0 +1,9411 @@ +// +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("20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table")] + partial class Added_Status_In_PurchaseInvoiceDetails_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("ApprovedAt") + .HasColumnType("datetime(6)"); + + b.Property("ApprovedById") + .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("RequestedAt") + .HasColumnType("datetime(6)"); + + b.Property("RequestedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RequestedById"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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.Collection.Invoice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BasicAmount") + .HasColumnType("double"); + + b.Property("BilledToId") + .HasColumnType("char(36)"); + + b.Property("ClientSubmitedDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ExceptedPaymentDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MarkAsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BilledToId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .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("PaymentAdjustmentHeads"); + + b.HasData( + new + { + Id = new Guid("dbdc047f-a2d2-4db0-b0e6-b9d9f923a0f1"), + Description = "An advance payment is a sum paid before receiving goods or services, often to secure a transaction or cover initial costs.", + IsActive = true, + Name = "Advance payment", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("66c3c241-8b52-4327-a5ad-c1faf102583e"), + Description = "The base amount refers to the principal sum or original value used as a reference in financial calculations, excluding taxes, fees, or additional charges.", + IsActive = true, + Name = "Base Amount", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0d70cb2e-827e-44fc-90a5-c2c55ba51ba9"), + Description = "TDS, or Tax Deducted at Source, is a system under the Indian Income Tax Act where tax is deducted at the point of income generation—such as salary, interest, or rent—and remitted to the government to prevent tax evasion and ensure timely collection.", + IsActive = true, + Name = "Tax Deducted at Source (TDS)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("95f35acd-d979-4177-91ea-fd03a00e49ff"), + Description = "Retention refers to a company's ability to keep customers, employees, or profits over time, commonly measured as a percentage and critical for long-term business sustainability and growth.", + IsActive = true, + Name = "Retention", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("3f09b19a-8d45-4cf2-be27-f4f09b38b9f7"), + Description = "Tax is a mandatory financial charge imposed by a government on individuals or entities to fund public services and government operations, without direct benefit to the taxpayer.", + IsActive = true, + Name = "Tax", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ec5e6a5f-ce62-44e5-8911-8426bbb4dde8"), + Description = "A penalty in the context of taxation is a financial sanction imposed by the government on individuals or entities for non-compliance with tax laws, such as late filing, underreporting income, or failure to pay taxes, and is typically calculated as a percentage of the tax due or a fixed amount.", + IsActive = true, + Name = "Penalty", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("50584332-1cb7-4359-9721-c8ea35040881"), + Description = "Utility fees are recurring charges for essential services such as electricity, water, gas, sewage, waste disposal, internet, and telecommunications, typically based on usage and necessary for operating a home or business.", + IsActive = true, + Name = "Utility fees", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("ReceivedInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("HasApplicationAccess") + .HasColumnType("tinyint(1)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .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("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }, + new + { + Id = new Guid("dbf17591-09fe-4c93-9e1a-12db8f5cc5de"), + Description = "Collection Admin is a permission that grants a user full administrative control over collections, including creating, editing, managing access, and deleting collections within a system.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Collection Admin" + }, + new + { + Id = new Guid("c8d7eea5-4033-4aad-9ebe-76de49896830"), + Description = "View Collection is a permission that allows users to see and browse assets or items within a collection without making any modifications or edits to its contents.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "View Collection" + }, + new + { + Id = new Guid("b93141fd-dbd3-4051-8f57-bf25d18e3555"), + Description = "Authorizes users to create new collections for organizing related resources and managing access", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Create Collection" + }, + new + { + Id = new Guid("455187b4-fef1-41f9-b3d0-025d0b6302c3"), + Description = "Ability to modify collection properties, content, and access rights.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Edit Collection" + }, + new + { + Id = new Guid("061d9ccd-85b4-4cb0-be06-2f9f32cebb72"), + Description = " Enables entry and processing of payment transactions.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Add Payment" + }, + new + { + Id = new Guid("6382ea8b-aff2-4cd2-a48f-a652b35825d8"), + Description = "Manage Recurring Template payment permission allows authorized users to set up, modify, and execute automated recurring payments using predefined templates, ensuring secure and controlled handling of repetitive financial transactions.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "Manage Recurring" + }, + new + { + Id = new Guid("7ddf2fba-c44d-4fe3-b4ec-690ff70be2e3"), + Description = "The \"View All Recurring Template payment permission\" generally allows users to see and access all recurring payment templates in the system, enabling them to review, manage, and process recurring transactions efficiently.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View All Recurring" + }, + new + { + Id = new Guid("e5d21efe-573d-4a16-a0f8-414d3e442e78"), + Description = "View Self Recurring Template payment permission allows a user to view and access their own recurring payment templates without editing rights.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View Self Recurring" + }, + new + { + Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), + Description = "Allow user to create new organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Add Organization" + }, + new + { + Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), + Description = "Allow the user to update the basic information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Edit Organization" + }, + new + { + Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), + Description = "Allow the user to view information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "View Organization" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", 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("CurrentBalance") + .HasColumnType("double"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("FinanceUIdPostfix") + .HasColumnType("int"); + + b.Property("FinanceUIdPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TenantId"); + + b.ToTable("AdvancePaymentTransactions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseUId") + .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("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAttachmentRequried") + .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("ExpenseCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + IsAttachmentRequried = 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("a1cc95ed-b276-4a3e-9f00-0a249b522d64"), + NextStatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("RecurringPaymentStatus"); + + b.HasData( + new + { + Id = new Guid("da462422-13b2-45cc-a175-910a225f6fc8"), + Name = "Active" + }, + new + { + Id = new Guid("3ec864d2-8bf5-42fb-ba70-5090301dd816"), + Name = "De-Activated" + }, + new + { + Id = new Guid("306856fb-5655-42eb-bf8b-808bb5e84725"), + Name = "Completed" + }, + new + { + Id = new Guid("8bfc9346-e092-4a80-acbf-515ae1ef6868"), + Name = "Paused" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("de04b6c7-a5cd-4a61-88b0-b43b0008202e"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseStatusId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAdvancePayment") + .HasColumnType("tinyint(1)"); + + b.Property("IsExpenseCreated") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaidTransactionId") + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("RecurringPaymentId") + .HasColumnType("char(36)"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("ExpenseStatusId"); + + b.HasIndex("PaidById"); + + b.HasIndex("RecurringPaymentId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PaymentRequests"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentRequestAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", 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("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVariable") + .HasColumnType("tinyint(1)"); + + b.Property("LatestPRGeneratedAt") + .HasColumnType("datetime(6)"); + + b.Property("NextStrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("NotifyTo") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentBufferDays") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("StrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RecurringPayments"); + }); + + 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.ActivityGroupMaster", 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit for Review", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }, + new + { + Id = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + Color = "#0E9F6E", + Description = "Create new Expense.", + DisplayName = "Create Expense", + IsActive = true, + IsSystem = true, + Name = "Done" + }); + }); + + 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("IsAttachmentRequried") + .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"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("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("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + Description = "Collection Management is a feature that enables organizations to track, organize, and manage the status and recovery of receivables or assets efficiently throughout their lifecycle, supporting systematic follow-up and resolution of outstanding accounts.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Collection Management" + }, + new + { + Id = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + Description = "Recurring Template Management is the automated creation and scheduling of repetitive tasks, processes, or transactions using predefined templates at set intervals to ensure consistent and efficient workflow execution without manual recreation each time.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Recurring Template Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + Description = "Managing all organization related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Organization Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.ToTable("GlobalActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.ToTable("GlobalActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalServiceMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("GlobalServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }, + new + { + Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), + Description = "Finance Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Finance" + }); + }); + + 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.HasKey("Id"); + + 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" + }, + 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" + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking" + }, + 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" + }, + new + { + Id = new Guid("a820f240-5e9a-4ae9-9091-8a7aa7720cea"), + Description = "A credit card is a payment card that allows you to borrow funds from a financial institution to pay for goods and services", + IsActive = true, + Name = "Credit card" + }, + new + { + Id = new Guid("95697409-baf6-4f78-86ab-42d93d9569a8"), + Description = "A debit card is a payment card that deducts funds directly from the cardholder's bank account when a purchase is made.", + IsActive = true, + Name = "Debit Card" + }, + new + { + Id = new Guid("f67beee6-6763-4108-922c-03bd86b9178d"), + Description = "When a bill is paid using the amount received in advance from a company.", + IsActive = true, + Name = "Advance Payment" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", 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("ServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("StatusUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationHierarchyId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationHierarchyId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TenantId"); + + b.ToTable("OrgHierarchyLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("ServiceId"); + + b.ToTable("OrgServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("OrgTypeMasters"); + + b.HasData( + new + { + Id = new Guid("5ee49bcd-b6d3-482f-9aaf-484afe04abec"), + Name = "Service Provider" + }, + new + { + Id = new Guid("a283356a-9b02-4029-afb7-e65c703efdd4"), + Name = "Sub-Contractor" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + + b.HasData( + new + { + Id = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + Address = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactNumber = "123456789", + ContactPerson = "Admin", + CreatedAt = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "admin@marcoaiot.com", + IsActive = true, + Name = "MarcoBMS", + SPRID = 5400L + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("ReportToId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ReportToId"); + + b.HasIndex("TenantId"); + + b.ToTable("OrganizationHierarchies"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletionDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationTypeId") + .HasColumnType("char(36)"); + + b.Property("ParentOrganizationId") + .HasColumnType("char(36)"); + + b.Property("ProjectServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("OrganizationTypeId"); + + b.HasIndex("ParentOrganizationId"); + + b.HasIndex("ProjectServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActualEndDate") + .HasColumnType("datetime(6)"); + + b.Property("ActualStartDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime(6)"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ReassignedDate") + .HasColumnType("datetime(6)"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PaymentGetway.PaymentDetail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EncryptedDetails") + .HasColumnType("longblob"); + + b.Property("Method") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Nonce") + .HasColumnType("longblob"); + + b.Property("OrderId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Status") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Tag") + .HasColumnType("longblob"); + + b.HasKey("Id"); + + b.ToTable("PaymentDetails"); + }); + + 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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PMCId") + .HasColumnType("char(36)"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("PromoterId") + .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("PMCId"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("PromoterId"); + + 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", + PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + 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.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceAttachmentTypeId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceAttachmentTypeId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("StatusId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + + 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.ServiceProject.JobAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("JobCommentId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("JobCommentId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TaggedInAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedInTime") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendance"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobAttendanceId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("MarkedAt") + .HasColumnType("datetime(6)"); + + b.Property("MarkedTIme") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobAttendanceId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssigneeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssigneeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobEmployeeMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("JobStatus"); + + b.HasData( + new + { + Id = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + DisplayName = "New", + Level = 1, + Name = "New" + }, + new + { + Id = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + DisplayName = "Assigned", + Level = 2, + Name = "Assigned" + }, + new + { + Id = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + DisplayName = "In Progress", + Level = 3, + Name = "In Progress" + }, + new + { + Id = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + DisplayName = "Work Done", + Level = 4, + Name = "Work Done" + }, + new + { + Id = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + DisplayName = "Review Done", + Level = 5, + Name = "Review Done" + }, + new + { + Id = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + DisplayName = "Closed", + Level = 6, + Name = "Closed" + }, + new + { + Id = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + DisplayName = "On Hold", + Level = 7, + Name = "On Hold" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobStatusMappings"); + + b.HasData( + new + { + Id = new Guid("024e1810-6a57-4a0d-8d2e-be88da79fcd4"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cb0db140-87fa-4a6f-812d-2834bd0f53a9"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("42f24930-387e-4f51-9c2d-3e29ffaaf02a"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c83c23-09be-40fd-9d05-f44795d8dee8"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8c4ecdae-7435-4475-8389-15bc453561a1"), + NextStatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a44b0a66-ee33-47e7-a01f-6b8d9b621543"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7165ecee-10e3-4fc0-85d2-6d93d5b11776"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("87891499-e45d-406b-bf22-722db1beedc9"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dc986ec4-858e-4c98-b330-4a5c98c91f07"), + NextStatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ca8b4358-3122-4aaa-bcf8-0b66e4ab313a"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5602d32c-290e-48a3-83dd-91af6d12ed46"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9c2918be-b3c1-46fb-a03b-14dd613e1021"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ab974bdb-2d8f-4ddc-9b71-bd6d198bae75"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2787c903-1b39-4e7d-a0f2-3bb2309bb341"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("76bc5551-8f80-469d-ba23-95d7e746c9a9"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("JobTagId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("JobTagId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", 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("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsArchive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectBranchId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectBranchId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobTickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactInformation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ProjectBranches"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("ContactEmail") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPhone") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ServiceProjects"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectServiceMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ServiceProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceProjectTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceProjectId"); + + b.HasIndex("ServiceProjectTagId"); + + b.ToTable("ServiceProjectTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.TeamRoleMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TeamRoleMasters"); + + b.HasData( + new + { + Id = new Guid("8cfbf16f-7d3b-4c29-af5b-18935f20aa7b"), + Description = "A Support role involves assisting users or customers by resolving technical or service-related issues, answering inquiries, and ensuring a positive experience with products or services.", + Name = "Support" + }, + new + { + Id = new Guid("145d7222-408b-4733-8a17-f417e070b8b8"), + Description = "A Service Engineer installs, maintains, repairs, and troubleshoots equipment to ensure optimal operation and customer satisfaction.", + Name = "Service Engineer" + }, + new + { + Id = new Guid("03bf5853-5e0b-4eb8-9f37-33bd999a05b3"), + Description = "A Manager oversees and coordinates a team or department to achieve organizational goals through planning, decision-making, and leadership.", + Name = "Manager" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationSize") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("TenantEnquires"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PaymentDetailId") + .HasColumnType("char(36)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PaymentDetailId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ExpiredAt") + .HasColumnType("datetime(6)"); + + b.Property("FcmToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("FCMTokenMappings"); + }); + + 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.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "RequestedBy") + .WithMany() + .HasForeignKey("RequestedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Employee"); + + b.Navigation("RequestedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.Invoice", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "BilledTo") + .WithMany() + .HasForeignKey("BilledToId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("BilledTo"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId") + .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.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("PaymentRequest"); + + b.Navigation("ProcessedBy"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.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.Expenses.PaymentRequest", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "ExpenseStatus") + .WithMany() + .HasForeignKey("ExpenseStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById"); + + b.HasOne("Marco.Pms.Model.Expenses.RecurringPayment", "RecurringPayment") + .WithMany() + .HasForeignKey("RecurringPaymentId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("ExpenseStatus"); + + b.Navigation("PaidBy"); + + b.Navigation("RecurringPayment"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PaymentRequest"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", "OrganizationHierarchy") + .WithMany() + .HasForeignKey("OrganizationHierarchyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OrganizationHierarchy"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Organization"); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportTo") + .WithMany() + .HasForeignKey("ReportToId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportTo"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", "OrganizationType") + .WithMany() + .HasForeignKey("OrganizationTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "ParentOrganization") + .WithMany() + .HasForeignKey("ParentOrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", "ProjectService") + .WithMany() + .HasForeignKey("ProjectServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("OrganizationType"); + + b.Navigation("ParentOrganization"); + + b.Navigation("ProjectService"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC") + .WithMany() + .HasForeignKey("PMCId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter") + .WithMany() + .HasForeignKey("PromoterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PMC"); + + b.Navigation("ProjectStatus"); + + b.Navigation("Promoter"); + + 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.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", "InvoiceAttachmentType") + .WithMany() + .HasForeignKey("InvoiceAttachmentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("InvoiceAttachmentType"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Status"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobComment", "JobComment") + .WithMany() + .HasForeignKey("JobCommentId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("JobComment"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + 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.ServiceProject.JobAttendance", "JobAttendance") + .WithMany() + .HasForeignKey("JobAttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("JobAttendance"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobTag", "JobTag") + .WithMany() + .HasForeignKey("JobTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobTag"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ProjectBranch", "ProjectBranch") + .WithMany() + .HasForeignKey("ProjectBranchId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("ProjectBranch"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Client"); + + b.Navigation("CreatedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById"); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "ServiceProject") + .WithMany() + .HasForeignKey("ServiceProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProjectTag", "ServiceProjectTag") + .WithMany() + .HasForeignKey("ServiceProjectTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceProject"); + + b.Navigation("ServiceProjectTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("Organization"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PaymentGetway.PaymentDetail", "PaymentDetail") + .WithMany() + .HasForeignKey("PaymentDetailId"); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("PaymentDetail"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.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/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.cs b/Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.cs new file mode 100644 index 0000000..8699308 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251125143000_Added_Status_In_PurchaseInvoiceDetails_Table.cs @@ -0,0 +1,84 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Added_Status_In_PurchaseInvoiceDetails_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "StatusId", + table: "PurchaseInvoiceDetails", + type: "char(36)", + nullable: false, + defaultValue: new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "InvoiceAttachmentTypeId", + table: "PurchaseInvoiceAttachments", + type: "char(36)", + nullable: false, + defaultValue: new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + collation: "ascii_general_ci"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceDetails_StatusId", + table: "PurchaseInvoiceDetails", + column: "StatusId"); + + migrationBuilder.CreateIndex( + name: "IX_PurchaseInvoiceAttachments_InvoiceAttachmentTypeId", + table: "PurchaseInvoiceAttachments", + column: "InvoiceAttachmentTypeId"); + + migrationBuilder.AddForeignKey( + name: "FK_PurchaseInvoiceAttachments_InvoiceAttachmentTypes_InvoiceAtt~", + table: "PurchaseInvoiceAttachments", + column: "InvoiceAttachmentTypeId", + principalTable: "InvoiceAttachmentTypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_PurchaseInvoiceDetails_PurchaseInvoiceStatus_StatusId", + table: "PurchaseInvoiceDetails", + column: "StatusId", + principalTable: "PurchaseInvoiceStatus", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_PurchaseInvoiceAttachments_InvoiceAttachmentTypes_InvoiceAtt~", + table: "PurchaseInvoiceAttachments"); + + migrationBuilder.DropForeignKey( + name: "FK_PurchaseInvoiceDetails_PurchaseInvoiceStatus_StatusId", + table: "PurchaseInvoiceDetails"); + + migrationBuilder.DropIndex( + name: "IX_PurchaseInvoiceDetails_StatusId", + table: "PurchaseInvoiceDetails"); + + migrationBuilder.DropIndex( + name: "IX_PurchaseInvoiceAttachments_InvoiceAttachmentTypeId", + table: "PurchaseInvoiceAttachments"); + + migrationBuilder.DropColumn( + name: "StatusId", + table: "PurchaseInvoiceDetails"); + + migrationBuilder.DropColumn( + name: "InvoiceAttachmentTypeId", + table: "PurchaseInvoiceAttachments"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 31f566e..11c814b 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -5061,6 +5061,9 @@ namespace Marco.Pms.DataAccess.Migrations b.Property("DocumentId") .HasColumnType("char(36)"); + b.Property("InvoiceAttachmentTypeId") + .HasColumnType("char(36)"); + b.Property("PurchaseInvoiceId") .HasColumnType("char(36)"); @@ -5077,6 +5080,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("DocumentId"); + b.HasIndex("InvoiceAttachmentTypeId"); + b.HasIndex("PurchaseInvoiceId"); b.HasIndex("TenantId"); @@ -5161,6 +5166,9 @@ namespace Marco.Pms.DataAccess.Migrations .IsRequired() .HasColumnType("longtext"); + b.Property("StatusId") + .HasColumnType("char(36)"); + b.Property("SupplierId") .HasColumnType("char(36)"); @@ -5199,6 +5207,8 @@ namespace Marco.Pms.DataAccess.Migrations b.HasIndex("OrganizationId"); + b.HasIndex("StatusId"); + b.HasIndex("SupplierId"); b.HasIndex("TenantId"); @@ -8599,6 +8609,12 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", "InvoiceAttachmentType") + .WithMany() + .HasForeignKey("InvoiceAttachmentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") .WithMany() .HasForeignKey("PurchaseInvoiceId") @@ -8619,6 +8635,8 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Document"); + b.Navigation("InvoiceAttachmentType"); + b.Navigation("PurchaseInvoice"); b.Navigation("Tenant"); @@ -8640,6 +8658,12 @@ namespace Marco.Pms.DataAccess.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") .WithMany() .HasForeignKey("SupplierId") @@ -8660,6 +8684,8 @@ namespace Marco.Pms.DataAccess.Migrations b.Navigation("Organization"); + b.Navigation("Status"); + b.Navigation("Supplier"); b.Navigation("Tenant"); -- 2.43.0 From bbe36ed535d19f391c33f4ca24034cc4f4e8e8fd Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 26 Nov 2025 12:07:11 +0530 Subject: [PATCH 07/58] Added an API create the Purchase invoice --- .../PurchaseInvoice/InvoiceAttachmentDto.cs | 14 + .../PurchaseInvoice/PurchaseInvoiceDto.cs | 31 ++ .../PurchaseInvoiceAttachment.cs | 12 + .../PurchaseInvoice/PurchaseInvoiceDetails.cs | 12 + .../PurchaseInvoice/PurchaseInvoiceListVM.cs | 18 ++ .../Controllers/PurchaseInvoiceController.cs | 42 +++ .../MappingProfiles/MappingProfile.cs | 16 + Marco.Pms.Services/Program.cs | 1 + .../Service/PurchaseInvoiceService.cs | 289 ++++++++++++++++++ .../IPurchaseInvoiceService.cs | 12 + 10 files changed, 447 insertions(+) create mode 100644 Marco.Pms.Model/Dtos/PurchaseInvoice/InvoiceAttachmentDto.cs create mode 100644 Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs create mode 100644 Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs create mode 100644 Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs create mode 100644 Marco.Pms.Services/Service/PurchaseInvoiceService.cs create mode 100644 Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs diff --git a/Marco.Pms.Model/Dtos/PurchaseInvoice/InvoiceAttachmentDto.cs b/Marco.Pms.Model/Dtos/PurchaseInvoice/InvoiceAttachmentDto.cs new file mode 100644 index 0000000..2fedf48 --- /dev/null +++ b/Marco.Pms.Model/Dtos/PurchaseInvoice/InvoiceAttachmentDto.cs @@ -0,0 +1,14 @@ +namespace Marco.Pms.Model.Dtos.PurchaseInvoice +{ + public class InvoiceAttachmentDto + { + public Guid? DocumentId { get; set; } + public required Guid InvoiceAttachmentTypeId { get; set; } + public required string FileName { get; set; } // Name of the file (e.g., "image1.png") + public string? Base64Data { get; set; } // Base64-encoded string of the file + public string? ContentType { get; set; } // MIME type (e.g., "image/png", "application/pdf") + public long FileSize { get; set; } // File size in bytes + public string? Description { get; set; } // Optional: Description or purpose of the file + public required bool IsActive { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs b/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs new file mode 100644 index 0000000..0688aac --- /dev/null +++ b/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs @@ -0,0 +1,31 @@ +namespace Marco.Pms.Model.Dtos.PurchaseInvoice +{ + public class PurchaseInvoiceDto + { + public required string Title { get; set; } + public required string Description { get; set; } + public required Guid ProjectId { get; set; } + public required Guid OrganizationId { get; set; } + public required string BillingAddress { get; set; } + public required string ShippingAddress { get; set; } + public string? PurchaseOrderNumber { get; set; } + public DateTime? PurchaseOrderDate { get; set; } + public required Guid SupplierId { get; set; } + public string? ProformaInvoiceNumber { get; set; } + public DateTime? ProformaInvoiceDate { get; set; } + public double? ProformaInvoiceAmount { get; set; } + public string? InvoiceNumber { get; set; } + public DateTime? InvoiceDate { get; set; } + public string? EWayBillNumber { get; set; } + public DateTime? EWayBillDate { get; set; } + public string? InvoiceReferenceNumber { get; set; } + public string? AcknowledgmentNumber { get; set; } + public DateTime? AcknowledgmentDate { get; set; } + public required double BaseAmount { get; set; } + public required double TaxAmount { get; set; } + public double? TransportCharges { get; set; } + public required double TotalAmount { get; set; } + public DateTime? PaymentDueDate { get; set; } // Defaults to 40 days from the invoice date + public List? Attachments { get; set; } + } +} diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs index a82c4d6..486f7a9 100644 --- a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceAttachment.cs @@ -28,6 +28,18 @@ namespace Marco.Pms.Model.PurchaseInvoice [ForeignKey("PurchaseInvoiceId")] public PurchaseInvoiceDetails? PurchaseInvoice { get; set; } + /// + /// Gets or sets the unique identifier for the type of the invoice attachment. + /// + public Guid InvoiceAttachmentTypeId { get; set; } + + /// + /// Gets or sets the type of the invoice attachment. + /// + [ValidateNever] + [ForeignKey("InvoiceAttachmentTypeId")] + public InvoiceAttachmentType? InvoiceAttachmentType { get; set; } + /// /// Gets or sets the unique identifier for the document. /// diff --git a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs index bd5a890..9307f5d 100644 --- a/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs +++ b/Marco.Pms.Model/PurchaseInvoice/PurchaseInvoiceDetails.cs @@ -57,6 +57,18 @@ namespace Marco.Pms.Model.PurchaseInvoice [ForeignKey("OrganizationId")] public Organization? Organization { get; set; } + /// + /// Gets or sets the status of the detail. + /// + public Guid StatusId { get; set; } + + /// + /// Gets or sets the status of the detail. + /// + [ValidateNever] + [ForeignKey("StatusId")] + public PurchaseInvoiceStatus? Status { get; set; } + /// /// Gets or sets the billing address of the detail. /// diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs new file mode 100644 index 0000000..ba8ef19 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs @@ -0,0 +1,18 @@ +using Marco.Pms.Model.PurchaseInvoice; +using Marco.Pms.Model.ViewModels.Organization; +using Marco.Pms.Model.ViewModels.Projects; + +namespace Marco.Pms.Model.ViewModels.PurchaseInvoice +{ + public class PurchaseInvoiceListVM + { + public Guid Id { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + public string? PurchaseInvoiceUId { get; set; } + public BasicProjectVM? Project { get; set; } + public BasicOrganizationVm? Supplier { get; set; } + public PurchaseInvoiceStatus? Status { get; set; } + public double TotalAmount { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs new file mode 100644 index 0000000..907e39d --- /dev/null +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -0,0 +1,42 @@ +using Marco.Pms.Model.Dtos.PurchaseInvoice; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Helpers; +using Microsoft.AspNetCore.Mvc; + +namespace Marco.Pms.Services.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class PurchaseInvoiceController : ControllerBase + { + private readonly UserHelper _userHelper; + private readonly IPurchaseInvoiceService _purchaseInvoiceService; + private readonly Guid tenantId; + + public PurchaseInvoiceController(UserHelper userHelper, IPurchaseInvoiceService purchaseInvoiceService) + { + _userHelper = userHelper; + _purchaseInvoiceService = purchaseInvoiceService; + tenantId = _userHelper.GetTenantId(); + } + + /// + /// Creates a purchase invoice. + /// + /// The purchase invoice model. + /// The cancellation token. + /// The HTTP response with the purchase invoice status and data. + [HttpPost("create")] + public async Task CreatePurchaseInvoice([FromBody] PurchaseInvoiceDto model, CancellationToken ct) + { + // Get the currently logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Create a purchase invoice using the purchase invoice service + var response = await _purchaseInvoiceService.CreatePurchaseInvoiceAsync(model, loggedInEmployee, tenantId, ct); + + // Return the HTTP response with the purchase invoice status and data + return StatusCode(response.StatusCode, response); + } + } +} diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 767e2f9..3389281 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -14,6 +14,7 @@ using Marco.Pms.Model.Dtos.Expenses.Masters; using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Organization; using Marco.Pms.Model.Dtos.Project; +using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Dtos.ServiceProject; using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Employees; @@ -28,6 +29,7 @@ using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.Projects; +using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels.MongoDBModel; @@ -42,6 +44,7 @@ using Marco.Pms.Model.ViewModels.Expenses.Masters; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Organization; using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Model.ViewModels.PurchaseInvoice; using Marco.Pms.Model.ViewModels.ServiceProject; using Marco.Pms.Model.ViewModels.Tenant; @@ -618,6 +621,19 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); #endregion + + #region ======================================================= Purchase Invoice ======================================================= + + CreateMap() + .ForMember( + dest => dest.PaymentDueDate, + opt => opt.MapFrom(src => src.PaymentDueDate.HasValue ? src.PaymentDueDate : DateTime.UtcNow.AddDays(40))); + CreateMap() + .ForMember( + dest => dest.PurchaseInvoiceUId, + opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")); + + #endregion } } } \ No newline at end of file diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index f15dba7..bc54c3f 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -192,6 +192,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion #region Helpers diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs new file mode 100644 index 0000000..874cc54 --- /dev/null +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -0,0 +1,289 @@ +using AutoMapper; +using Marco.Pms.DataAccess.Data; +using Marco.Pms.Model.DocumentManager; +using Marco.Pms.Model.Dtos.PurchaseInvoice; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.OrganizationModel; +using Marco.Pms.Model.PurchaseInvoice; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Organization; +using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Model.ViewModels.PurchaseInvoice; +using Marco.Pms.Services.Service.ServiceInterfaces; +using MarcoBMS.Services.Service; +using Microsoft.EntityFrameworkCore; + +namespace Marco.Pms.Services.Service +{ + public class PurchaseInvoiceService : IPurchaseInvoiceService + { + private readonly IDbContextFactory _dbContextFactory; + private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly ILoggingService _logger; + private readonly S3UploadService _s3Service; + private readonly IMapper _mapper; + + private readonly Guid DraftInvoiceStatusId = Guid.Parse("8a5ef25e-3c9e-45de-add9-6b1c1df54381"); + public PurchaseInvoiceService(IDbContextFactory dbContextFactory, + IServiceScopeFactory serviceScopeFactory, + ILoggingService logger, + S3UploadService s3Service, + IMapper mapper) + { + _dbContextFactory = dbContextFactory; + _serviceScopeFactory = serviceScopeFactory; + _logger = logger; + _s3Service = s3Service; + _mapper = mapper; + } + + /// + /// Creates a new Purchase Invoice with validation, S3 file uploads, and transactional database storage. + /// + /// The invoice data transfer object. + /// The current user context. + /// The tenant identifier. + /// Cancellation token. + /// The created invoice view model wrapped in an API response. + public async Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct = default) + { + // 1. INPUT VALIDATION + if (model == null) throw new ArgumentNullException(nameof(model)); + + // Scoped variables to hold validation results to avoid fetching them again later + BasicProjectVM? projectVm = null; + Organization? organization = null; + Organization? supplier = null; + PurchaseInvoiceStatus? status = null; + + try + { + _logger.LogInfo("Initiating Purchase Invoice creation for ProjectId: {ProjectId}, TenantId: {TenantId}", model.ProjectId, tenantId); + + // 2. DATA VALIDATION (Fail-Fast Strategy) + // We use a single Context instance here for read-only validation. + // It is more efficient than opening 5 parallel connections. + await using var readContext = await _dbContextFactory.CreateDbContextAsync(ct); + + // A. Validate Project (Check Infra, if null check Service) + // Optimized: Only fetch what is needed using Select first + var infraProject = await readContext.Projects + .AsNoTracking() + .Where(p => p.Id == model.ProjectId && p.TenantId == tenantId) + .Select(p => _mapper.Map(p)) + .FirstOrDefaultAsync(ct); + + if (infraProject == null) + { + var serviceProject = await readContext.ServiceProjects + .AsNoTracking() + .Where(sp => sp.Id == model.ProjectId && sp.IsActive && sp.TenantId == tenantId) + .Select(p => _mapper.Map(p)) + .FirstOrDefaultAsync(ct); + + if (serviceProject == null) + { + _logger.LogWarning("CreatePurchaseInvoice failed: Project {ProjectId} not found for Tenant {TenantId}", model.ProjectId, tenantId); + return ApiResponse.ErrorResponse("Project not found", "The specified project does not exist.", 404); + } + projectVm = serviceProject; + } + else + { + projectVm = infraProject; + } + + // B. Validate Organization + organization = await readContext.Organizations + .AsNoTracking() + .FirstOrDefaultAsync(o => o.Id == model.OrganizationId && o.IsActive, ct); + + if (organization == null) + { + _logger.LogWarning("CreatePurchaseInvoice failed: Organization {OrganizationId} not found.", model.OrganizationId); + return ApiResponse.ErrorResponse("Organization not found", "The selected organization is invalid.", 404); + } + + // C. Validate Supplier + supplier = await readContext.Organizations + .AsNoTracking() + .FirstOrDefaultAsync(o => o.Id == model.SupplierId && o.IsActive, ct); + + if (supplier == null) + { + _logger.LogWarning("CreatePurchaseInvoice failed: Supplier {SupplierId} not found.", model.SupplierId); + return ApiResponse.ErrorResponse("Supplier not found", "The selected supplier is invalid.", 404); + } + + // D. Validate Status + status = await readContext.PurchaseInvoiceStatus + .AsNoTracking() + .FirstOrDefaultAsync(s => s.Id == DraftInvoiceStatusId, ct); + + if (status == null) + { + _logger.LogWarning("CreatePurchaseInvoice critical: Default 'Draft' status ID {StatusId} is missing from DB.", DraftInvoiceStatusId); + return ApiResponse.ErrorResponse("System Error", "Default invoice status configuration is missing.", 500); + } + + // 3. PREPARE S3 UPLOADS (Optimistic Upload Pattern) + // We upload files BEFORE opening the DB transaction to prevent locking the DB during slow network I/O. + // If DB save fails, we will trigger a cleanup in the catch block. + var uploadedS3Keys = new List(); // Keep track for rollback + var preparedDocuments = new List(); + var preparedAttachments = new List(); + + // Generate Invoice ID early for S3 folder structure + var newInvoiceId = Guid.NewGuid(); + + if (model.Attachments?.Any() == true) + { + var batchId = Guid.NewGuid(); + + // Fetch Attachment Types + var typeIds = model.Attachments.Select(a => a.InvoiceAttachmentTypeId).ToList(); + var types = await readContext.InvoiceAttachmentTypes.Where(iat => typeIds.Contains(iat.Id)).ToListAsync(ct); + + foreach (var attachment in model.Attachments) + { + // Validate Type + if (!types.Any(t => t.Id == attachment.InvoiceAttachmentTypeId)) + { + _logger.LogWarning("CreatePurchaseInvoice failed: Attachment type {InvoiceAttachmentTypeId} is invalid.", attachment.InvoiceAttachmentTypeId); + return ApiResponse.ErrorResponse("Invalid Attachment", $"Attachment type {attachment.InvoiceAttachmentTypeId} is invalid.", 400); + } + + // Validate Base64 + var base64Data = attachment.Base64Data?.Split(',').LastOrDefault(); + if (string.IsNullOrWhiteSpace(base64Data)) + { + _logger.LogWarning("CreatePurchaseInvoice failed: Attachment {FileName} contains no data.", attachment.FileName ?? ""); + return ApiResponse.ErrorResponse("Invalid Attachment", $"Attachment {attachment.FileName} contains no data.", 400); + } + + // Process Metadata + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + // Use default extension if fileType extraction fails, prevents crashing + var safeFileType = string.IsNullOrEmpty(fileType) ? "application/octet-stream" : fileType; + var fileName = attachment.FileName ?? _s3Service.GenerateFileName(safeFileType, tenantId, "invoice"); + var objectKey = $"tenant-{tenantId}/PurchaseInvoice/{newInvoiceId}/{fileName}"; + + // Perform Upload + await _s3Service.UploadFileAsync(base64Data, safeFileType, objectKey); + uploadedS3Keys.Add(objectKey); // Track for rollback + + // Prepare Entities + var documentId = Guid.NewGuid(); + preparedDocuments.Add(new Document + { + Id = documentId, + BatchId = batchId, + UploadedById = loggedInEmployee.Id, + FileName = fileName, + ContentType = attachment.ContentType ?? safeFileType, + S3Key = objectKey, + FileSize = attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId + }); + + preparedAttachments.Add(new PurchaseInvoiceAttachment + { + Id = Guid.NewGuid(), + InvoiceAttachmentTypeId = attachment.InvoiceAttachmentTypeId, + PurchaseInvoiceId = newInvoiceId, + DocumentId = documentId, + UploadedAt = DateTime.UtcNow, + UploadedById = loggedInEmployee.Id, + TenantId = tenantId + }); + } + } + + // 4. TRANSACTIONAL PERSISTENCE + await using var writeContext = await _dbContextFactory.CreateDbContextAsync(ct); + + // Use ExecutionStrategy for transient failure resiliency (e.g. cloud DB hiccups) + var strategy = writeContext.Database.CreateExecutionStrategy(); + + return await strategy.ExecuteAsync(async () => + { + await using var transaction = await writeContext.Database.BeginTransactionAsync(ct); + try + { + // A. UID Generation + // Note: In high concurrency, "Max + 1" can cause duplicates. + // Ideally, lock the table or use a DB Sequence. + string uIDPrefix = $"PUR/{DateTime.Now:MMyy}"; + + var lastInvoice = await writeContext.PurchaseInvoiceDetails + .Where(e => e.UIDPrefix == uIDPrefix && e.TenantId == tenantId) // Ensure Tenant Check + .OrderByDescending(e => e.UIDPostfix) + .Select(x => x.UIDPostfix) // Select only what we need + .FirstOrDefaultAsync(ct); + + int uIDPostfix = (lastInvoice == 0 ? 0 : lastInvoice) + 1; + + // B. Map & Add Invoice + var purchaseInvoice = _mapper.Map(model); + purchaseInvoice.Id = newInvoiceId; // Set the ID we generated earlier + purchaseInvoice.UIDPrefix = uIDPrefix; + purchaseInvoice.UIDPostfix = uIDPostfix; + purchaseInvoice.StatusId = status.Id; + purchaseInvoice.CreatedAt = DateTime.UtcNow; + purchaseInvoice.CreatedById = loggedInEmployee.Id; + purchaseInvoice.IsActive = true; + purchaseInvoice.TenantId = tenantId; + + writeContext.PurchaseInvoiceDetails.Add(purchaseInvoice); + + // C. Add Documents if any + if (preparedDocuments.Any()) + { + writeContext.Documents.AddRange(preparedDocuments); + writeContext.PurchaseInvoiceAttachments.AddRange(preparedAttachments); + } + + await writeContext.SaveChangesAsync(ct); + await transaction.CommitAsync(ct); + + _logger.LogInfo("Purchase Invoice created successfully. ID: {InvoiceId}, UID: {UID}", purchaseInvoice.Id, $"{uIDPrefix}-{uIDPostfix}"); + + // D. Prepare Response + var response = _mapper.Map(purchaseInvoice); + response.Status = status; + response.Project = projectVm; + response.Supplier = _mapper.Map(supplier); + + return ApiResponse.SuccessResponse(response, "Purchase invoice created successfully", 200); + } + catch (DbUpdateException ex) + { + await transaction.RollbackAsync(ct); + + // 5. COMPENSATION (S3 Rollback) + // If DB failed, we must delete the orphaned files from S3 to save cost and storage. + if (uploadedS3Keys != null && uploadedS3Keys.Any()) + { + _logger.LogInfo("Rolling back S3 uploads for failed invoice creation."); + // Fire and forget cleanup, or await if strict consistency is required + foreach (var key in uploadedS3Keys) + { + try { await _s3Service.DeleteFileAsync(key); } + catch (Exception s3Ex) { _logger.LogError(s3Ex, "Failed to cleanup S3 file {Key} during rollback", key); } + } + } + _logger.LogError(ex, "Failed to create purchase invoice for Tenant {TenantId}. Error: {Message}", tenantId, ex.Message); + + return ApiResponse.ErrorResponse("Creation Failed", "An unexpected error occurred while processing your request.", 500); + } + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to create purchase invoice for Tenant {TenantId}. Error: {Message}", tenantId, ex.Message); + return ApiResponse.ErrorResponse("Creation Failed", "An unexpected error occurred while processing your request.", 500); + } + } + } +} diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs new file mode 100644 index 0000000..adb935b --- /dev/null +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -0,0 +1,12 @@ +using Marco.Pms.Model.Dtos.PurchaseInvoice; +using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.PurchaseInvoice; + +namespace Marco.Pms.Services.Service.ServiceInterfaces +{ + public interface IPurchaseInvoiceService + { + Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + } +} -- 2.43.0 From b6baff7d00d754b3d28a6a003f12c2453ed3f2bd Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 26 Nov 2025 12:47:50 +0530 Subject: [PATCH 08/58] Added an API to get basic list of organizations --- .../Controllers/OrganizationController.cs | 8 ++ .../Service/OrganizationService.cs | 87 +++++++++++++++++++ .../ServiceInterfaces/IOrganizationService.cs | 1 + 3 files changed, 96 insertions(+) diff --git a/Marco.Pms.Services/Controllers/OrganizationController.cs b/Marco.Pms.Services/Controllers/OrganizationController.cs index 80a8847..b31bfb1 100644 --- a/Marco.Pms.Services/Controllers/OrganizationController.cs +++ b/Marco.Pms.Services/Controllers/OrganizationController.cs @@ -45,6 +45,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("list/basic")] + public async Task GetOrganizationBasicList([FromQuery] string? searchString, CancellationToken ct, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _organizationService.GetOrganizationBasicListAsync(searchString, pageNumber, pageSize, loggedInEmployee, ct); + return StatusCode(response.StatusCode, response); + } + [HttpGet("details/{id}")] public async Task GetOrganizationDetails(Guid id) { diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index 575f684..11e0299 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -1,4 +1,5 @@ using AutoMapper; +using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Organization; using Marco.Pms.Model.Employees; @@ -13,6 +14,7 @@ using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; +using System.Linq.Dynamic.Core; namespace Marco.Pms.Services.Service { @@ -150,6 +152,91 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(response, "Successfully fetched the organization list", 200); } + + /// + /// Retrieves a paginated, searchable list of organizations. + /// Optimized for performance using DB Projections and AsNoTracking. + /// + /// Optional keyword to filter organizations by name. + /// The requested page number (1-based). + /// The number of records per page (Max 50). + /// The current user context for security filtering. + /// Cancellation token to cancel operations if the client disconnects. + /// A paginated list of BasicOrganizationVm. + public async Task> GetOrganizationBasicListAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct = default) + { + try + { + // 1. INPUT SANITIZATION + // Ensure valid pagination limits to prevent performance degradation or DoS attacks. + int actualPage = pageNumber < 1 ? 1 : pageNumber; + int actualSize = pageSize > 50 ? 50 : (pageSize < 1 ? 10 : pageSize); + + _logger.LogInfo("Fetching Organization list. Page: {Page}, Size: {Size}, Search: {Search}, User: {UserId}", + actualPage, actualSize, searchString ?? "", loggedInEmployee.Id); + + // 2. QUERY BUILDING + // Use AsNoTracking() for read-only scenarios to reduce overhead. + var query = _context.Organizations.AsNoTracking() + .Where(o => o.IsActive); + + // 3. SECURITY FILTER (Multi-Tenancy) + // Enterprise Rule: Always filter by the logged-in user's Tenant/Permissions. + // Assuming loggedInEmployee has a TenantId or OrganizationId + // query = query.Where(o => o.TenantId == loggedInEmployee.TenantId); + + // 4. DYNAMIC FILTERING + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchTrimmed = searchString.Trim(); + query = query.Where(o => o.Name.Contains(searchTrimmed)); + } + + // 5. COUNT TOTALS (Efficiently) + // Count the total records matching the filter BEFORE applying pagination + var totalCount = await query.CountAsync(ct); + + // 6. FETCH DATA (With Projection) + // CRITICAL OPTIMIZATION: Use .ProjectTo or .Select BEFORE .ToListAsync. + // This ensures SQL only fetches the columns needed for BasicOrganizationVm, + // rather than fetching the whole Entity and discarding data in memory. + var items = await query + .OrderBy(o => o.Name) + .Skip((actualPage - 1) * actualSize) + .Take(actualSize) + .ProjectTo(_mapper.ConfigurationProvider) // Requires AutoMapper.QueryableExtensions + .ToListAsync(ct); + + // 7. PREPARE RESPONSE + var totalPages = (int)Math.Ceiling((double)totalCount / actualSize); + + var pagedResult = new + { + CurrentPage = actualPage, + PageSize = actualSize, + TotalPages = totalPages, + TotalCount = totalCount, + HasPrevious = actualPage > 1, + HasNext = actualPage < totalPages, + Data = items + }; + + _logger.LogInfo("Successfully fetched {Count} organizations out of {Total}.", items.Count, totalCount); + + return ApiResponse.SuccessResponse(pagedResult, "Organization list fetched successfully.", 200); + } + catch (OperationCanceledException) + { + // Handle client disconnection gracefully + _logger.LogWarning("Organization list fetch was cancelled by the client."); + return ApiResponse.ErrorResponse("Request Cancelled", "The operation was cancelled.", 499); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to fetch organization list. User: {UserId}, Error: {Message}", loggedInEmployee.Id, ex.Message); + return ApiResponse.ErrorResponse("Data Fetch Failed", "An unexpected error occurred while retrieving the organization list.", 500); + } + } public async Task> GetOrganizationDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId) { _logger.LogDebug("Started fetching details for OrganizationId: {OrganizationId}", id); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs index cc70930..6abbe83 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { #region =================================================================== Get Functions =================================================================== Task> GetOrganizarionListAsync(string? searchString, long? sprid, bool active, int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); + Task> GetOrganizationBasicListAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct); Task> GetOrganizationDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); Task> GetOrganizationHierarchyListAsync(Guid employeeId, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); #endregion -- 2.43.0 From 886a32b3e328922825a837af87dab8ab7bd40299 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 26 Nov 2025 15:00:44 +0530 Subject: [PATCH 09/58] Added an API to get list of purchase invoices wth filter --- Marco.Pms.Model/Dtos/Projects/WorkItemDto.cs | 4 +- Marco.Pms.Model/Filters/AdvanceFilter.cs | 2 + Marco.Pms.Model/Filters/DateDynamicFilter.cs | 9 + Marco.Pms.Model/Filters/ListDynamicFilter.cs | 8 + .../Controllers/PurchaseInvoiceController.cs | 45 +- .../Extensions/QueryableExtensions.cs | 72 +++- .../Service/OrganizationService.cs | 22 +- .../Service/PurchaseInvoiceService.cs | 406 +++++++++++++++++- .../IPurchaseInvoiceService.cs | 2 + 9 files changed, 548 insertions(+), 22 deletions(-) create mode 100644 Marco.Pms.Model/Filters/DateDynamicFilter.cs create mode 100644 Marco.Pms.Model/Filters/ListDynamicFilter.cs diff --git a/Marco.Pms.Model/Dtos/Projects/WorkItemDto.cs b/Marco.Pms.Model/Dtos/Projects/WorkItemDto.cs index 7c98051..d7961d8 100644 --- a/Marco.Pms.Model/Dtos/Projects/WorkItemDto.cs +++ b/Marco.Pms.Model/Dtos/Projects/WorkItemDto.cs @@ -9,8 +9,8 @@ namespace Marco.Pms.Model.Dtos.Project public Guid WorkAreaID { get; set; } public Guid WorkCategoryId { get; set; } public Guid ActivityID { get; set; } - public int PlannedWork { get; set; } - public int CompletedWork { get; set; } + public double PlannedWork { get; set; } + public double CompletedWork { get; set; } public Guid? ParentTaskId { get; set; } public string? Comment { get; set; } } diff --git a/Marco.Pms.Model/Filters/AdvanceFilter.cs b/Marco.Pms.Model/Filters/AdvanceFilter.cs index 3b376a4..297318f 100644 --- a/Marco.Pms.Model/Filters/AdvanceFilter.cs +++ b/Marco.Pms.Model/Filters/AdvanceFilter.cs @@ -3,6 +3,8 @@ public class AdvanceFilter { // The dynamic filters from your JSON + public DateDynamicFilter? DateFilter { get; set; } + public List? Filters { get; set; } public List? SortFilters { get; set; } public List? SearchFilters { get; set; } public List? AdvanceFilters { get; set; } diff --git a/Marco.Pms.Model/Filters/DateDynamicFilter.cs b/Marco.Pms.Model/Filters/DateDynamicFilter.cs new file mode 100644 index 0000000..46630c9 --- /dev/null +++ b/Marco.Pms.Model/Filters/DateDynamicFilter.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Filters +{ + public class DateDynamicFilter + { + public string Column { get; set; } = string.Empty; + public DateTime StartValue { get; set; } + public DateTime EndValue { get; set; } + } +} diff --git a/Marco.Pms.Model/Filters/ListDynamicFilter.cs b/Marco.Pms.Model/Filters/ListDynamicFilter.cs new file mode 100644 index 0000000..bae0b96 --- /dev/null +++ b/Marco.Pms.Model/Filters/ListDynamicFilter.cs @@ -0,0 +1,8 @@ +namespace Marco.Pms.Model.Filters +{ + public class ListDynamicFilter + { + public string Column { get; set; } = string.Empty; + public List Values { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 907e39d..34adeaa 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -11,21 +11,48 @@ namespace Marco.Pms.Services.Controllers { private readonly UserHelper _userHelper; private readonly IPurchaseInvoiceService _purchaseInvoiceService; + private readonly ISignalRService _signalR; private readonly Guid tenantId; - public PurchaseInvoiceController(UserHelper userHelper, IPurchaseInvoiceService purchaseInvoiceService) + public PurchaseInvoiceController(UserHelper userHelper, IPurchaseInvoiceService purchaseInvoiceService, ISignalRService signalR) { _userHelper = userHelper; _purchaseInvoiceService = purchaseInvoiceService; tenantId = _userHelper.GetTenantId(); + _signalR = signalR; } + /// + /// Retrieves a list of purchase invoices based on search string, filter, activity status, page size, and page number. + /// + /// Optional search string to filter invoices by. + /// Optional filter to apply to the invoices. + /// Optional flag to filter invoices by activity status. + /// The number of invoices to display per page. + /// The requested page number (1-based). + /// Token to propagate notification that operations should be canceled. + /// A HTTP 200 OK response with a list of purchase invoices or an appropriate HTTP error code. + [HttpGet("list")] + public async Task GetPurchaseInvoiceListAsync([FromQuery] string? searchString, [FromQuery] string? filter, CancellationToken cancellationToken, [FromQuery] bool isActive = true, + [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) + { + // Get the currently logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Retrieve the purchase invoice list using the service + var response = await _purchaseInvoiceService.GetPurchaseInvoiceListAsync(searchString, filter, isActive, pageSize, pageNumber, loggedInEmployee, tenantId, cancellationToken); + + // Return the response with the appropriate HTTP status code + return StatusCode(response.StatusCode, response); + } + + /// /// Creates a purchase invoice. /// /// The purchase invoice model. /// The cancellation token. - /// The HTTP response with the purchase invoice status and data. + /// The HTTP response for the creation of the purchase invoice. [HttpPost("create")] public async Task CreatePurchaseInvoice([FromBody] PurchaseInvoiceDto model, CancellationToken ct) { @@ -35,7 +62,19 @@ namespace Marco.Pms.Services.Controllers // Create a purchase invoice using the purchase invoice service var response = await _purchaseInvoiceService.CreatePurchaseInvoiceAsync(model, loggedInEmployee, tenantId, ct); - // Return the HTTP response with the purchase invoice status and data + // If the creation is successful, send a notification to the SignalR service + if (response.Success) + { + var notification = new + { + LoggedInUserId = loggedInEmployee.Id, + Keyword = "Purchase_Invoice", + Response = response.Data + }; + await _signalR.SendNotificationAsync(notification); + } + + // Return the HTTP response return StatusCode(response.StatusCode, response); } } diff --git a/Marco.Pms.Services/Extensions/QueryableExtensions.cs b/Marco.Pms.Services/Extensions/QueryableExtensions.cs index f0e8277..865203a 100644 --- a/Marco.Pms.Services/Extensions/QueryableExtensions.cs +++ b/Marco.Pms.Services/Extensions/QueryableExtensions.cs @@ -1,4 +1,5 @@ using Marco.Pms.Model.Filters; +using System.Data; using System.Linq.Dynamic.Core; namespace Marco.Pms.Services.Extensions @@ -69,9 +70,16 @@ namespace Marco.Pms.Services.Extensions return query; } + /// + /// Applies search filters to the given IQueryable. + /// + /// The type of the elements in the IQueryable. + /// The IQueryable to apply the filters to. + /// The list of search filters to apply. + /// The filtered IQueryable. public static IQueryable ApplySearchFilters(this IQueryable query, List searchFilters) { - // 1. Apply Search Filters (Contains/Text search) + // Apply search filters to the query if (searchFilters.Any()) { foreach (var search in searchFilters) @@ -86,10 +94,70 @@ namespace Marco.Pms.Services.Extensions return query; } + /// + /// Applies group by filters to the given IQueryable. + /// + /// The type of the elements in the IQueryable. + /// The IQueryable to apply the filters to. + /// The column to group by. + /// The grouped IQueryable. public static IQueryable ApplyGroupByFilters(this IQueryable query, string groupByColumn) { + // Group the query by the specified column and reshape the result to { Key: "Value", Items: [...] } query.GroupBy(groupByColumn, "it") - .Select("new (Key, it as Items)"); // Reshape to { Key: "Value", Items: [...] } + .Select("new (Key, it as Items)"); + return query; + } + + /// + /// Applies list filters to the given IQueryable. + /// + /// The type of the elements in the IQueryable. + /// The IQueryable to apply the filters to. + /// The list of filters to apply. + /// The filtered IQueryable. + public static IQueryable ApplyListFilters(this IQueryable query, List filters) + { + // Check if there are any filters + if (filters == null || !filters.Any()) return query; + + // Apply filters to the query + foreach (var filter in filters) + { + // Skip if column is empty or values are null or empty + if (string.IsNullOrWhiteSpace(filter.Column) || filter.Values == null || !filter.Values.Any()) continue; + + // Apply filter to the query + query = query.Where($"@0.Contains({filter.Column})", filter.Values); + } + + // Return the filtered query + return query; + } + + /// + /// Applies date filters to the given IQueryable. + /// + /// The type of the elements in the IQueryable. + /// The IQueryable to apply the filters to. + /// The date filter to apply. + /// The filtered IQueryable. + public static IQueryable ApplyDateFilter(this IQueryable query, DateDynamicFilter dateFilter) + { + // Check if date filter is null or column is empty + if (dateFilter == null || string.IsNullOrWhiteSpace(dateFilter.Column)) return query; + + // Convert start and end values to date + var startValue = dateFilter.StartValue.Date; + var endValue = dateFilter.EndValue.Date.AddDays(1); + + // Apply a filter to include items with a date greater than or equal to the start value + query = query.Where($"{dateFilter.Column} >= @0", startValue); + + // Apply a filter to include items with a date less than or equal to the end value + query = query.Where($"{dateFilter.Column} < @0", endValue); + + // Return the filtered IQueryable return query; } } diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index 11e0299..7bfab16 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -167,13 +167,9 @@ namespace Marco.Pms.Services.Service { try { - // 1. INPUT SANITIZATION - // Ensure valid pagination limits to prevent performance degradation or DoS attacks. - int actualPage = pageNumber < 1 ? 1 : pageNumber; - int actualSize = pageSize > 50 ? 50 : (pageSize < 1 ? 10 : pageSize); - + // 1. VALIDATION _logger.LogInfo("Fetching Organization list. Page: {Page}, Size: {Size}, Search: {Search}, User: {UserId}", - actualPage, actualSize, searchString ?? "", loggedInEmployee.Id); + pageNumber, pageSize, searchString ?? "", loggedInEmployee.Id); // 2. QUERY BUILDING // Use AsNoTracking() for read-only scenarios to reduce overhead. @@ -202,22 +198,22 @@ namespace Marco.Pms.Services.Service // rather than fetching the whole Entity and discarding data in memory. var items = await query .OrderBy(o => o.Name) - .Skip((actualPage - 1) * actualSize) - .Take(actualSize) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) .ProjectTo(_mapper.ConfigurationProvider) // Requires AutoMapper.QueryableExtensions .ToListAsync(ct); // 7. PREPARE RESPONSE - var totalPages = (int)Math.Ceiling((double)totalCount / actualSize); + var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); var pagedResult = new { - CurrentPage = actualPage, - PageSize = actualSize, + CurrentPage = pageNumber, + PageSize = pageSize, TotalPages = totalPages, TotalCount = totalCount, - HasPrevious = actualPage > 1, - HasNext = actualPage < totalPages, + HasPrevious = pageNumber > 1, + HasNext = pageNumber < totalPages, Data = items }; diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 874cc54..5287ff2 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -1,17 +1,22 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.DocumentManager; using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Filters; using Marco.Pms.Model.OrganizationModel; +using Marco.Pms.Model.Projects; using Marco.Pms.Model.PurchaseInvoice; +using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Organization; using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Model.ViewModels.PurchaseInvoice; +using Marco.Pms.Services.Extensions; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; using Microsoft.EntityFrameworkCore; +using System.Text.Json; +using Document = Marco.Pms.Model.DocumentManager.Document; namespace Marco.Pms.Services.Service { @@ -37,6 +42,362 @@ namespace Marco.Pms.Services.Service _mapper = mapper; } + //public async Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, + // Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + //{ + // _logger.LogInfo("GetPurchaseInvoiceListAsync called for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + // await using var _context = await _dbContextFactory.CreateDbContextAsync(ct); + + // //var purchaseInvoices = _context.PurchaseInvoiceDetails + // var query = _context.PurchaseInvoiceDetails + // .Include(pid => pid.Organization) + // .Include(pid => pid.Supplier) + // .Include(pid => pid.Status) + // .Where(pid => pid.IsActive == isActive && pid.TenantId == tenantId); + + // var advanceFilter = TryDeserializeFilter(filter); + + // query = query.ApplyCustomFilters(advanceFilter, "CreatedAt"); + + // if (advanceFilter != null) + // { + // if (advanceFilter.Filters != null) + // { + // query = query.ApplyListFilters(advanceFilter.Filters); + // } + // if (advanceFilter.DateFilter != null) + // { + // query = query.ApplyDateFilter(advanceFilter.DateFilter); + // } + // if (advanceFilter.SearchFilters != null) + // { + // var invoiceSearchFilter = advanceFilter.SearchFilters.Where(f => f.Column != "ProjectName" || f.Column != "Project").ToList(); + // if (invoiceSearchFilter.Any()) + // { + // query = query.ApplySearchFilters(invoiceSearchFilter); + // } + // } + // if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) + // { + // query = query.ApplyGroupByFilters(advanceFilter.GroupByColumn); + // } + // } + + // bool isProjectFilter = false; + + // var infraProjectTask = Task.Run(async () => + // { + // await using var context = await _dbContextFactory.CreateDbContextAsync(); + + // var infraProjectsQuery = context.Projects.Where(p => p.TenantId == tenantId); + + // if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) + // { + // var projectSearchFilter = advanceFilter.SearchFilters + // .Where(f => f.Column == "ProjectName" || f.Column == "Project") + // .Select(f => new SearchItem { Column = "Name", Value = f.Value }) + // .ToList(); + // if (projectSearchFilter.Any()) + // { + // infraProjectsQuery = infraProjectsQuery.ApplySearchFilters(projectSearchFilter); + // isProjectFilter = true; + // } + // } + // return await infraProjectsQuery.Select(p => _mapper.Map(p)).ToListAsync(); + // }); + + // var serviceProjectTask = Task.Run(async () => + // { + // await using var context = await _dbContextFactory.CreateDbContextAsync(); + + // var serviceProjectsQuery = context.ServiceProjects.Where(sp => sp.TenantId == tenantId); + + // if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) + // { + // var projectSearchFilter = advanceFilter.SearchFilters + // .Where(f => f.Column == "ProjectName" || f.Column == "Project") + // .Select(f => new SearchItem { Column = "Name", Value = f.Value }) + // .ToList(); + // if (projectSearchFilter.Any()) + // { + // serviceProjectsQuery = serviceProjectsQuery.ApplySearchFilters(projectSearchFilter); + // isProjectFilter = true; + // } + // } + + // return await serviceProjectsQuery.Select(sp => _mapper.Map(sp)).ToListAsync(); + // }); + + // await Task.WhenAll(infraProjectTask, serviceProjectTask); + + // var projects = infraProjectTask.Result; + // projects.AddRange(serviceProjectTask.Result); + + // if (isProjectFilter) + // { + // var projectIds = projects.Select(p => p.Id).ToList(); + // query = query.Where(pid => projectIds.Contains(pid.ProjectId)); + // } + + // var totalCount = await query.CountAsync(ct); + + // var purchaseInvoices = await query + // .Skip((pageNumber - 1) * pageSize) + // .Take(pageSize) + // .ToListAsync(); + + // var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); + + // var response = purchaseInvoices.Select(pi => + // { + // var result = _mapper.Map(pi); + // result.Project = projects.FirstOrDefault(p => p.Id == pi.ProjectId); + // return result; + // }).ToList(); + + // var pagedResult = new + // { + // CurrentPage = pageNumber, + // PageSize = pageSize, + // TotalPages = totalPages, + // TotalCount = totalCount, + // HasPrevious = pageNumber > 1, + // HasNext = pageNumber < totalPages, + // Data = response + // }; + + // return ApiResponse.SuccessResponse(pagedResult, "Invoice list fetched successfully", 200); + //} + + + /// + /// Retrieves a paged list of purchase invoices for a given tenant with support for + /// advanced filters, project-based search across Infra and Service projects, and + /// consistent structured logging and error handling. + /// + /// Optional basic search string (currently not used, kept for backward compatibility). + /// JSON string containing advanced filter configuration (list/date/search/group filters). + /// Flag to filter active/inactive invoices. + /// Number of records per page. + /// Current page number (1-based). + /// Currently logged-in employee context. + /// Tenant identifier for multi-tenant isolation. + /// Cancellation token for cooperative cancellation. + /// Standard ApiResponse containing a paged invoice list payload. + public async Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId, + CancellationToken ct) + { + // Basic argument validation and guard clauses + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetPurchaseInvoiceListAsync called with empty TenantId. EmployeeId: {EmployeeId}", loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Tenant information is missing. Please retry with a valid tenant.", 400); + } + + if (pageSize <= 0 || pageNumber <= 0) + { + _logger.LogWarning( + "GetPurchaseInvoiceListAsync called with invalid paging parameters. TenantId: {TenantId}, EmployeeId: {EmployeeId}, PageSize: {PageSize}, PageNumber: {PageNumber}", + tenantId, loggedInEmployee.Id, pageSize, pageNumber); + + return ApiResponse.ErrorResponse("Invalid paging parameters. Page size and page number must be greater than zero.", 400); + } + + // A correlationId can be pushed earlier in middleware and enriched into all logs. + // Here it is assumed to be available through some context (e.g. _requestContext). + + _logger.LogInfo( + "GetPurchaseInvoiceListAsync started. TenantId: {TenantId}, EmployeeId: {EmployeeId}, IsActive: {IsActive}, PageSize: {PageSize}, PageNumber: {PageNumber}", + tenantId, loggedInEmployee.Id, isActive, pageSize, pageNumber); + + try + { + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // Base query for purchase invoices scoped to tenant and active flag + IQueryable query = context.PurchaseInvoiceDetails + .Include(pid => pid.Organization) + .Include(pid => pid.Supplier) + .Include(pid => pid.Status) + .Where(pid => pid.IsActive == isActive && pid.TenantId == tenantId); + + var advanceFilter = TryDeserializeFilter(filter); + + // Apply ordering, default sort, etc. through your custom extension + query = query.ApplyCustomFilters(advanceFilter, "CreatedAt"); + + if (advanceFilter != null) + { + // Apply list / dropdown / enum filters + if (advanceFilter.Filters != null) + { + query = query.ApplyListFilters(advanceFilter.Filters); + } + + // Apply created/modified date range filters + if (advanceFilter.DateFilter != null) + { + query = query.ApplyDateFilter(advanceFilter.DateFilter); + } + + // Apply non-project search filters on invoice fields + if (advanceFilter.SearchFilters != null) + { + // NOTE: fixed logic - use && so that Project/ProjectName are excluded + var invoiceSearchFilter = advanceFilter.SearchFilters + .Where(f => f.Column != "ProjectName" && f.Column != "Project") + .ToList(); + + if (invoiceSearchFilter.Any()) + { + query = query.ApplySearchFilters(invoiceSearchFilter); + } + } + + // Apply grouping if configured + if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) + { + query = query.ApplyGroupByFilters(advanceFilter.GroupByColumn); + } + } + + bool isProjectFilter = false; + + // Run project lookups in parallel to reduce latency for project search scenarios. + // Each task gets its own DbContext instance from the factory. + var infraProjectTask = Task.Run(async () => + { + await using var projContext = await _dbContextFactory.CreateDbContextAsync(ct); + + IQueryable infraProjectsQuery = projContext.Projects + .Where(p => p.TenantId == tenantId); + + if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) + { + var projectSearchFilter = advanceFilter.SearchFilters + .Where(f => f.Column == "ProjectName" || f.Column == "Project") + .Select(f => new SearchItem { Column = "Name", Value = f.Value }) + .ToList(); + + if (projectSearchFilter.Any()) + { + infraProjectsQuery = infraProjectsQuery.ApplySearchFilters(projectSearchFilter); + isProjectFilter = true; // NOTE: shared flag, see comment below. + } + } + + return await infraProjectsQuery + .Select(p => _mapper.Map(p)) + .ToListAsync(ct); + }, ct); + + var serviceProjectTask = Task.Run(async () => + { + await using var projContext = await _dbContextFactory.CreateDbContextAsync(ct); + + IQueryable serviceProjectsQuery = projContext.ServiceProjects + .Where(sp => sp.TenantId == tenantId); + + if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) + { + var projectSearchFilter = advanceFilter.SearchFilters + .Where(f => f.Column == "ProjectName" || f.Column == "Project") + .Select(f => new SearchItem { Column = "Name", Value = f.Value }) + .ToList(); + + if (projectSearchFilter.Any()) + { + serviceProjectsQuery = serviceProjectsQuery.ApplySearchFilters(projectSearchFilter); + isProjectFilter = true; // This is safe for bool but can be refactored for purity. + } + } + + return await serviceProjectsQuery + .Select(sp => _mapper.Map(sp)) + .ToListAsync(ct); + }, ct); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result ?? new List(); + if (serviceProjectTask.Result != null && serviceProjectTask.Result.Any()) + { + projects.AddRange(serviceProjectTask.Result); + } + + // If project filters were involved, constrain invoices to those projects + if (isProjectFilter && projects.Any()) + { + var projectIds = projects.Select(p => p.Id).ToList(); + query = query.Where(pid => projectIds.Contains(pid.ProjectId)); + } + + // Compute total count before paging + var totalCount = await query.CountAsync(ct); + + // Apply paging + var purchaseInvoices = await query + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(ct); + + var totalPages = totalCount == 0 + ? 0 + : (int)Math.Ceiling((double)totalCount / pageSize); + + // Map invoice entities to view model and attach project details + var response = purchaseInvoices.Select(pi => + { + var vm = _mapper.Map(pi); + vm.Project = projects.FirstOrDefault(p => p.Id == pi.ProjectId); + return vm; + }).ToList(); + + var pagedResult = new + { + CurrentPage = pageNumber, + PageSize = pageSize, + TotalPages = totalPages, + TotalCount = totalCount, + HasPrevious = pageNumber > 1, + HasNext = pageNumber < totalPages, + Data = response + }; + + _logger.LogInfo( + "GetPurchaseInvoiceListAsync completed successfully. TenantId: {TenantId}, EmployeeId: {EmployeeId}, TotalCount: {TotalCount}, ReturnedCount: {ReturnedCount}, PageNumber: {PageNumber}, PageSize: {PageSize}", + tenantId, loggedInEmployee.Id, totalCount, response.Count, pageNumber, pageSize); + + var successMessage = totalCount == 0 + ? "No purchase invoices found for the specified criteria." + : "Purchase invoice list fetched successfully."; + + return ApiResponse.SuccessResponse(pagedResult, successMessage, 200); + } + catch (OperationCanceledException ocex) + { + // Respect cancellation and return a 499-style semantic code if your ApiResponse supports it + _logger.LogError(ocex, "GetPurchaseInvoiceListAsync request was canceled. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("The request was canceled by the client or the server. Please retry if this was unintentional.", 499); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, + "Database error while fetching purchase invoices. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("A database error occurred while fetching purchase invoices. Please try again later or contact support.", 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Unhandled exception in GetPurchaseInvoiceListAsync. CorrelationId: {CorrelationId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("An unexpected error occurred while fetching purchase invoices. Please try again later or contact support.", 500); + } + } + /// /// Creates a new Purchase Invoice with validation, S3 file uploads, and transactional database storage. /// @@ -255,7 +616,7 @@ namespace Marco.Pms.Services.Service response.Project = projectVm; response.Supplier = _mapper.Map(supplier); - return ApiResponse.SuccessResponse(response, "Purchase invoice created successfully", 200); + return ApiResponse.SuccessResponse(response, "Purchase invoice created successfully", 201); } catch (DbUpdateException ex) { @@ -285,5 +646,46 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Creation Failed", "An unexpected error occurred while processing your request.", 500); } } + + + private AdvanceFilter? TryDeserializeFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + AdvanceFilter? advanceFilter = null; + + try + { + // First, try to deserialize directly. This is the expected case (e.g., from a web client). + advanceFilter = 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)) + { + advanceFilter = 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 advanceFilter; + } + } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index adb935b..62a81fe 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -7,6 +7,8 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IPurchaseInvoiceService { + Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, + Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); } } -- 2.43.0 From 3dce559de2d9caa7b8c99dd10d1083a8f164edaf Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 26 Nov 2025 18:02:28 +0530 Subject: [PATCH 10/58] Added an API to get details of the purchase invoice --- .../PurchaseInvoiceAttachmentVM.cs | 14 ++ .../PurchaseInvoiceDetailsVM.cs | 44 ++++++ .../Controllers/PurchaseInvoiceController.cs | 13 ++ .../MappingProfiles/MappingProfile.cs | 15 ++ .../Service/PurchaseInvoiceService.cs | 132 ++++++++++++++++++ .../IPurchaseInvoiceService.cs | 1 + 6 files changed, 219 insertions(+) create mode 100644 Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs create mode 100644 Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceDetailsVM.cs diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs new file mode 100644 index 0000000..815dcd3 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs @@ -0,0 +1,14 @@ +using Marco.Pms.Model.PurchaseInvoice; + +namespace Marco.Pms.Model.ViewModels.PurchaseInvoice +{ + public class PurchaseInvoiceAttachmentVM + { + public Guid DocumentId { get; set; } + public InvoiceAttachmentType? InvoiceAttachmentType { get; set; } + public string? FileName { get; set; } + public string? ContentType { get; set; } + public string? PreSignedUrl { get; set; } + public string? ThumbPreSignedUrl { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceDetailsVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceDetailsVM.cs new file mode 100644 index 0000000..6b23b43 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceDetailsVM.cs @@ -0,0 +1,44 @@ +using Marco.Pms.Model.PurchaseInvoice; +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Organization; +using Marco.Pms.Model.ViewModels.Projects; + +namespace Marco.Pms.Model.ViewModels.PurchaseInvoice +{ + public class PurchaseInvoiceDetailsVM + { + public Guid Id { get; set; } + public string? PurchaseInvoiceUId { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + public BasicProjectVM? Project { get; set; } + public BasicOrganizationVm? Organization { get; set; } + public PurchaseInvoiceStatus? Status { get; set; } + public string? BillingAddress { get; set; } + public string? ShippingAddress { get; set; } + public string? PurchaseOrderNumber { get; set; } + public DateTime? PurchaseOrderDate { get; set; } + public BasicOrganizationVm? Supplier { get; set; } + public string? ProformaInvoiceNumber { get; set; } + public DateTime? ProformaInvoiceDate { get; set; } + public double? ProformaInvoiceAmount { get; set; } + public string? InvoiceNumber { get; set; } + public DateTime? InvoiceDate { get; set; } + public string? EWayBillNumber { get; set; } + public DateTime? EWayBillDate { get; set; } + public string? InvoiceReferenceNumber { get; set; } + public string? AcknowledgmentNumber { get; set; } + public DateTime? AcknowledgmentDate { get; set; } + public double BaseAmount { get; set; } + public double TaxAmount { get; set; } + public double? TransportCharges { get; set; } + public double TotalAmount { get; set; } + public DateTime PaymentDueDate { get; set; } + public bool IsActive { get; set; } + public DateTime CreatedAt { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + public DateTime? UpdatedAt { get; set; } + public BasicEmployeeVM? UpdatedBy { get; set; } + public List? Attachments { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 34adeaa..26c1f5e 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -46,6 +46,19 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("details/{id}")] + public async Task GetPurchaseInvoiceDetailsAsync(Guid id, CancellationToken cancellationToken) + { + // Get the currently logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Retrieve the purchase invoice details using the service + var response = await _purchaseInvoiceService.GetPurchaseInvoiceDetailsAsync(id, loggedInEmployee, tenantId, cancellationToken); + + // Return the response with the appropriate HTTP status code + return StatusCode(response.StatusCode, response); + } + /// /// Creates a purchase invoice. diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 3389281..2b0a06f 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -632,6 +632,21 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.PurchaseInvoiceUId, opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")); + CreateMap() + .ForMember( + dest => dest.PurchaseInvoiceUId, + opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")); + + CreateMap() + .ForMember( + dest => dest.DocumentId, + opt => opt.MapFrom(src => src.DocumentId)) + .ForMember( + dest => dest.FileName, + opt => opt.MapFrom(src => src.Document != null ? src.Document.FileName : null)) + .ForMember( + dest => dest.ContentType, + opt => opt.MapFrom(src => src.Document != null ? src.Document.ContentType : null)); #endregion } diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 5287ff2..697af23 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -398,6 +398,120 @@ namespace Marco.Pms.Services.Service } } + /// + /// Retrieves the details of a specific purchase invoice, including project details and S3 attachment links. + /// + /// The unique identifier of the Purchase Invoice. + /// The employee requesting the data. + /// The tenant identifier for data isolation. + /// Cancellation token for async operations. + /// A wrapped response containing the Purchase Invoice View Model. + public async Task> GetPurchaseInvoiceDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // 1. Structured Logging: Log entry with context + _logger.LogInfo("Fetching Purchase Invoice details. InvoiceId: {InvoiceId}, TenantId: {TenantId}", id, tenantId); + + try + { + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // 2. Performance: Use AsNoTracking for read-only queries. + // Use AsSplitQuery to avoid Cartesian explosion on multiple Includes. + var purchaseInvoice = await context.PurchaseInvoiceDetails + .AsNoTracking() + .AsSplitQuery() + .Include(pid => pid.Organization) + .Include(pid => pid.Supplier) + .Include(pid => pid.Status) + .Include(pid => pid.CreatedBy).ThenInclude(e => e!.JobRole) + .Include(pid => pid.UpdatedBy).ThenInclude(e => e!.JobRole) + .Where(pid => pid.Id == id && pid.TenantId == tenantId) + .FirstOrDefaultAsync(ct); + + // 3. Validation: Handle Not Found immediately + if (purchaseInvoice == null || !purchaseInvoice.IsActive) + { + _logger.LogWarning("Purchase Invoice not found or inactive. InvoiceId: {InvoiceId}", id); + return ApiResponse.ErrorResponse("Purchase invoice not found", "The specified purchase invoice does not exist or has been deleted.", 404); + } + + // 4. Parallel Execution: Fetch Project details efficiently + // Note: Assuming these methods return null if not found, rather than throwing. + var infraProjectTask = LoadInfraProjectAsync(purchaseInvoice.ProjectId, tenantId); + var serviceProjectTask = LoadServiceProjectAsync(purchaseInvoice.ProjectId, tenantId); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + // Safely retrieve results without blocking .Result + var project = await infraProjectTask ?? await serviceProjectTask; + + if (project == null) + { + _logger.LogWarning("Data Inconsistency: Project not found for InvoiceId: {InvoiceId}, ProjectId: {ProjectId}", id, purchaseInvoice.ProjectId); + return ApiResponse.ErrorResponse("Project not found", "The project associated with this invoice could not be found.", 404); + } + + // 5. Optimized Attachment Fetching + var attachments = await context.PurchaseInvoiceAttachments + .AsNoTracking() + .Include(pia => pia.Document) + .Include(pia => pia.InvoiceAttachmentType) + .Where(pia => + pia.PurchaseInvoiceId == id && + pia.TenantId == tenantId && + pia.Document != null && + pia.InvoiceAttachmentType != null) + .ToListAsync(ct); + + // 6. Mapping & Transformation + var response = _mapper.Map(purchaseInvoice); + response.Project = project; + + if (attachments.Count > 0) + { + response.Attachments = attachments.Select(a => + { + var result = _mapper.Map(a); + + // Ensure S3 Key exists before generating URL to prevent SDK errors + if (a.Document != null) + { + result.PreSignedUrl = _s3Service.GeneratePreSignedUrl(a.Document.S3Key); + + // Fallback logic for thumbnail + var thumbKey = !string.IsNullOrEmpty(a.Document.ThumbS3Key) + ? a.Document.ThumbS3Key + : a.Document.S3Key; + + result.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(thumbKey); + } + return result; + }).ToList(); + } + else + { + response.Attachments = new List(); + } + + _logger.LogInfo("Successfully fetched Purchase Invoice details. InvoiceId: {InvoiceId}", id); + + return ApiResponse.SuccessResponse(response, "Purchase invoice details fetched successfully.", 200); + } + catch (OperationCanceledException) + { + // Handle request cancellation (e.g., user navigates away) + _logger.LogWarning("Request was cancelled by the user. InvoiceId: {InvoiceId}", id); + return ApiResponse.ErrorResponse("Request Cancelled", "The operation was cancelled.", 499); + } + catch (Exception ex) + { + // 7. Global Error Handling + _logger.LogError(ex, "An unhandled exception occurred while fetching Purchase Invoice. InvoiceId: {InvoiceId}", id); + return ApiResponse.ErrorResponse("Internal Server Error", "An unexpected error occurred while processing your request. Please contact support.", + 500); + } + } + /// /// Creates a new Purchase Invoice with validation, S3 file uploads, and transactional database storage. /// @@ -687,5 +801,23 @@ namespace Marco.Pms.Services.Service return advanceFilter; } + /// + /// Helper method to load infrastructure project by id. + /// + private async Task LoadInfraProjectAsync(Guid projectId, Guid tenantId) + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.Where(p => p.Id == projectId && p.TenantId == tenantId).Select(p => _mapper.Map(p)).FirstOrDefaultAsync(); + } + + /// + /// Helper method to load service project by id. + /// + private async Task LoadServiceProjectAsync(Guid projectId, Guid tenantId) + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ServiceProjects.Where(sp => sp.Id == projectId && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).FirstOrDefaultAsync(); + } + } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index 62a81fe..554da76 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -9,6 +9,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + Task> GetPurchaseInvoiceDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); } } -- 2.43.0 From 34c5ac9c2589ad67b0e9929fd1ecc3d8b2ac1380 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 26 Nov 2025 19:30:22 +0530 Subject: [PATCH 11/58] Added an API to update purchase invoice --- .../PurchaseInvoice/PurchaseInvoiceDto.cs | 3 +- .../Controllers/PurchaseInvoiceController.cs | 42 +- .../MappingProfiles/MappingProfile.cs | 3 + .../Service/PurchaseInvoiceService.cs | 457 +++++++++++++----- .../IPurchaseInvoiceService.cs | 15 + 5 files changed, 385 insertions(+), 135 deletions(-) diff --git a/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs b/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs index 0688aac..0830cd5 100644 --- a/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs +++ b/Marco.Pms.Model/Dtos/PurchaseInvoice/PurchaseInvoiceDto.cs @@ -10,6 +10,7 @@ public required string ShippingAddress { get; set; } public string? PurchaseOrderNumber { get; set; } public DateTime? PurchaseOrderDate { get; set; } + public Guid? StatusId { get; set; } public required Guid SupplierId { get; set; } public string? ProformaInvoiceNumber { get; set; } public DateTime? ProformaInvoiceDate { get; set; } @@ -26,6 +27,6 @@ public double? TransportCharges { get; set; } public required double TotalAmount { get; set; } public DateTime? PaymentDueDate { get; set; } // Defaults to 40 days from the invoice date - public List? Attachments { get; set; } + public List Attachments { get; set; } = new List(); } } diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 26c1f5e..0b80396 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -1,6 +1,9 @@ -using Marco.Pms.Model.Dtos.PurchaseInvoice; +using AutoMapper; +using Marco.Pms.Model.Dtos.PurchaseInvoice; +using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; +using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers @@ -12,16 +15,20 @@ namespace Marco.Pms.Services.Controllers private readonly UserHelper _userHelper; private readonly IPurchaseInvoiceService _purchaseInvoiceService; private readonly ISignalRService _signalR; + private readonly IServiceScopeFactory _serviceScopeFactory; private readonly Guid tenantId; - public PurchaseInvoiceController(UserHelper userHelper, IPurchaseInvoiceService purchaseInvoiceService, ISignalRService signalR) + public PurchaseInvoiceController(UserHelper userHelper, IPurchaseInvoiceService purchaseInvoiceService, ISignalRService signalR, IServiceScopeFactory serviceScopeFactory) { _userHelper = userHelper; _purchaseInvoiceService = purchaseInvoiceService; tenantId = _userHelper.GetTenantId(); _signalR = signalR; + _serviceScopeFactory = serviceScopeFactory; } + #region =================================================================== Purchase Invoice Functions =================================================================== + /// /// Retrieves a list of purchase invoices based on search string, filter, activity status, page size, and page number. /// @@ -90,5 +97,36 @@ namespace Marco.Pms.Services.Controllers // Return the HTTP response return StatusCode(response.StatusCode, response); } + + [HttpPatch("edit/{id}")] + public async Task EditPurchaseInvoice(Guid id, [FromBody] JsonPatchDocument patchDoc, CancellationToken ct) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var existingPurchaseInvoice = await _purchaseInvoiceService.GetPurchaseInvoiceByIdAsync(id, tenantId, ct); + if (existingPurchaseInvoice == null) + return NotFound(ApiResponse.ErrorResponse("Invalid purchase invoice ID", "Invalid purchase invoice ID", 404)); + + using var scope = _serviceScopeFactory.CreateScope(); + var mapper = scope.ServiceProvider.GetRequiredService(); + var modelToPatch = mapper.Map(existingPurchaseInvoice); + + // Apply the JSON Patch document to the DTO and check model state validity + patchDoc.ApplyTo(modelToPatch, ModelState); + if (!ModelState.IsValid) + { + return BadRequest(ApiResponse.ErrorResponse("Validation failed", "Provided patch document values are invalid", 400)); + } + + var response = await _purchaseInvoiceService.UpdatePurchaseInvoiceAsync(id, existingPurchaseInvoice, modelToPatch, loggedInEmployee, tenantId, ct); + return StatusCode(response.StatusCode, response); + } + + #endregion + + #region =================================================================== Delivery Challan Functions =================================================================== + #endregion + + #region =================================================================== Purchase Invoice History Functions =================================================================== + #endregion } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 2b0a06f..631e943 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -628,6 +628,9 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.PaymentDueDate, opt => opt.MapFrom(src => src.PaymentDueDate.HasValue ? src.PaymentDueDate : DateTime.UtcNow.AddDays(40))); + + CreateMap(); + CreateMap() .ForMember( dest => dest.PurchaseInvoiceUId, diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 697af23..aabda5e 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -1,8 +1,10 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Filters; +using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.Projects; using Marco.Pms.Model.PurchaseInvoice; @@ -41,136 +43,7 @@ namespace Marco.Pms.Services.Service _s3Service = s3Service; _mapper = mapper; } - - //public async Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, - // Employee loggedInEmployee, Guid tenantId, CancellationToken ct) - //{ - // _logger.LogInfo("GetPurchaseInvoiceListAsync called for TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); - - // await using var _context = await _dbContextFactory.CreateDbContextAsync(ct); - - // //var purchaseInvoices = _context.PurchaseInvoiceDetails - // var query = _context.PurchaseInvoiceDetails - // .Include(pid => pid.Organization) - // .Include(pid => pid.Supplier) - // .Include(pid => pid.Status) - // .Where(pid => pid.IsActive == isActive && pid.TenantId == tenantId); - - // var advanceFilter = TryDeserializeFilter(filter); - - // query = query.ApplyCustomFilters(advanceFilter, "CreatedAt"); - - // if (advanceFilter != null) - // { - // if (advanceFilter.Filters != null) - // { - // query = query.ApplyListFilters(advanceFilter.Filters); - // } - // if (advanceFilter.DateFilter != null) - // { - // query = query.ApplyDateFilter(advanceFilter.DateFilter); - // } - // if (advanceFilter.SearchFilters != null) - // { - // var invoiceSearchFilter = advanceFilter.SearchFilters.Where(f => f.Column != "ProjectName" || f.Column != "Project").ToList(); - // if (invoiceSearchFilter.Any()) - // { - // query = query.ApplySearchFilters(invoiceSearchFilter); - // } - // } - // if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) - // { - // query = query.ApplyGroupByFilters(advanceFilter.GroupByColumn); - // } - // } - - // bool isProjectFilter = false; - - // var infraProjectTask = Task.Run(async () => - // { - // await using var context = await _dbContextFactory.CreateDbContextAsync(); - - // var infraProjectsQuery = context.Projects.Where(p => p.TenantId == tenantId); - - // if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) - // { - // var projectSearchFilter = advanceFilter.SearchFilters - // .Where(f => f.Column == "ProjectName" || f.Column == "Project") - // .Select(f => new SearchItem { Column = "Name", Value = f.Value }) - // .ToList(); - // if (projectSearchFilter.Any()) - // { - // infraProjectsQuery = infraProjectsQuery.ApplySearchFilters(projectSearchFilter); - // isProjectFilter = true; - // } - // } - // return await infraProjectsQuery.Select(p => _mapper.Map(p)).ToListAsync(); - // }); - - // var serviceProjectTask = Task.Run(async () => - // { - // await using var context = await _dbContextFactory.CreateDbContextAsync(); - - // var serviceProjectsQuery = context.ServiceProjects.Where(sp => sp.TenantId == tenantId); - - // if (advanceFilter?.SearchFilters != null && advanceFilter.SearchFilters.Any()) - // { - // var projectSearchFilter = advanceFilter.SearchFilters - // .Where(f => f.Column == "ProjectName" || f.Column == "Project") - // .Select(f => new SearchItem { Column = "Name", Value = f.Value }) - // .ToList(); - // if (projectSearchFilter.Any()) - // { - // serviceProjectsQuery = serviceProjectsQuery.ApplySearchFilters(projectSearchFilter); - // isProjectFilter = true; - // } - // } - - // return await serviceProjectsQuery.Select(sp => _mapper.Map(sp)).ToListAsync(); - // }); - - // await Task.WhenAll(infraProjectTask, serviceProjectTask); - - // var projects = infraProjectTask.Result; - // projects.AddRange(serviceProjectTask.Result); - - // if (isProjectFilter) - // { - // var projectIds = projects.Select(p => p.Id).ToList(); - // query = query.Where(pid => projectIds.Contains(pid.ProjectId)); - // } - - // var totalCount = await query.CountAsync(ct); - - // var purchaseInvoices = await query - // .Skip((pageNumber - 1) * pageSize) - // .Take(pageSize) - // .ToListAsync(); - - // var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); - - // var response = purchaseInvoices.Select(pi => - // { - // var result = _mapper.Map(pi); - // result.Project = projects.FirstOrDefault(p => p.Id == pi.ProjectId); - // return result; - // }).ToList(); - - // var pagedResult = new - // { - // CurrentPage = pageNumber, - // PageSize = pageSize, - // TotalPages = totalPages, - // TotalCount = totalCount, - // HasPrevious = pageNumber > 1, - // HasNext = pageNumber < totalPages, - // Data = response - // }; - - // return ApiResponse.SuccessResponse(pagedResult, "Invoice list fetched successfully", 200); - //} - - + #region =================================================================== Purchase Invoice Functions =================================================================== /// /// Retrieves a paged list of purchase invoices for a given tenant with support for /// advanced filters, project-based search across Infra and Service projects, and @@ -611,7 +484,7 @@ namespace Marco.Pms.Services.Service // Generate Invoice ID early for S3 folder structure var newInvoiceId = Guid.NewGuid(); - if (model.Attachments?.Any() == true) + if (model.Attachments.Any()) { var batchId = Guid.NewGuid(); @@ -761,7 +634,281 @@ namespace Marco.Pms.Services.Service } } + public async Task> UpdatePurchaseInvoiceAsync(Guid id, PurchaseInvoiceDetails purchaseInvoice, PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // Validate input arguments and log warnings for invalid cases. + if (id == Guid.Empty) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync called with empty invoice Id. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse( + "Invalid invoice identifier", + "The purchase invoice identifier cannot be empty.", + 400); + } + + if (tenantId == Guid.Empty) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync called with empty tenant Id. InvoiceId: {InvoiceId}, EmployeeId: {EmployeeId}", id, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse( + "Invalid tenant identifier", + "The tenant identifier cannot be empty.", + 400); + } + + _logger.LogInfo("Starting UpdatePurchaseInvoiceAsync. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", id, tenantId, loggedInEmployee.Id); + + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + await using var transaction = await context.Database.BeginTransactionAsync(); + try + { + // Scoped helper service for update logs. + using var scope = _serviceScopeFactory.CreateScope(); + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + // 1. Validate existence of Project (Infra or Service). + var infraProject = await context.Projects + .AsNoTracking() + .Where(p => p.Id == model.ProjectId && p.TenantId == tenantId) + .Select(p => _mapper.Map(p)) + .FirstOrDefaultAsync(ct); + + BasicProjectVM? projectVm; + if (infraProject == null) + { + var serviceProject = await context.ServiceProjects + .AsNoTracking() + .Where(sp => sp.Id == model.ProjectId && sp.IsActive && sp.TenantId == tenantId) + .Select(p => _mapper.Map(p)) + .FirstOrDefaultAsync(ct); + + if (serviceProject == null) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Project {ProjectId} not found for Tenant {TenantId}", model.ProjectId, tenantId); + + return ApiResponse.ErrorResponse("Project not found", "The specified project does not exist.", 404); + } + projectVm = serviceProject; + } + else + { + projectVm = infraProject; + } + + // 2. Validate Organization. + var organization = await context.Organizations + .AsNoTracking() + .FirstOrDefaultAsync(o => o.Id == model.OrganizationId && o.IsActive, ct); + + if (organization == null) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Organization {OrganizationId} not found or inactive.", model.OrganizationId); + + return ApiResponse.ErrorResponse("Organization not found", "The selected organization is invalid or inactive.", 404); + } + + // 3. Validate Supplier. + var supplier = await context.Organizations + .AsNoTracking() + .FirstOrDefaultAsync(o => o.Id == model.SupplierId && o.IsActive, ct); + + if (supplier == null) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Supplier {SupplierId} not found or inactive.", model.SupplierId); + + return ApiResponse.ErrorResponse("Supplier not found", "The selected supplier is invalid or inactive.", 404); + } + + // 4. Validate PurchaseInvoiceStatus. + var status = await context.PurchaseInvoiceStatus + .AsNoTracking() + .FirstOrDefaultAsync(s => s.Id == model.StatusId, ct); + + if (status == null) + { + _logger.LogError(null, "UpdatePurchaseInvoiceAsync critical: Missing required purchase invoice status ID {StatusId}.", model.StatusId); + + return ApiResponse.ErrorResponse( + "System configuration error", + "Required purchase invoice status configuration is missing in the system.", + 500); + } + + // Save previous state for audit/logging. + var existingEntityBson = updateLogHelper.EntityToBsonDocument(purchaseInvoice); + + // Map updated fields from DTO to entity. + _mapper.Map(model, purchaseInvoice); + purchaseInvoice.UpdatedAt = DateTime.UtcNow; + purchaseInvoice.UpdatedById = loggedInEmployee.Id; + + context.PurchaseInvoiceDetails.Update(purchaseInvoice); + await context.SaveChangesAsync(ct); + + // 5. Handle attachments update. + var newAttachments = model.Attachments.Where(a => a.IsActive).ToList(); + var deleteAttachmentIds = model.Attachments + .Where(a => a.DocumentId.HasValue && !a.IsActive) + .Select(a => a.DocumentId!.Value) + .ToList(); + + if (newAttachments.Any()) + { + var batchId = Guid.NewGuid(); + + // Validate attachment types. + var typeIds = newAttachments.Select(a => a.InvoiceAttachmentTypeId).Distinct().ToList(); + var validTypes = await context.InvoiceAttachmentTypes + .Where(iat => typeIds.Contains(iat.Id)) + .ToListAsync(ct); + + var invalidTypeIds = typeIds.Except(validTypes.Select(t => t.Id)).ToList(); + if (invalidTypeIds.Any()) + { + foreach (var invalidId in invalidTypeIds) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Invalid attachment type ID {AttachmentTypeId}.", invalidId); + } + return ApiResponse.ErrorResponse("Invalid attachment types", $"One or more attachment types are invalid: {string.Join(", ", invalidTypeIds)}", 400); + } + + var preparedDocuments = new List(); + var preparedAttachments = new List(); + + // Process each new attachment. + foreach (var attachment in newAttachments) + { + // Validate base64 data presence. + var base64Data = attachment.Base64Data?.Split(',').LastOrDefault(); + if (string.IsNullOrWhiteSpace(base64Data)) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Attachment '{FileName}' contains no data.", attachment.FileName ?? ""); + + return ApiResponse.ErrorResponse("Invalid attachment", $"Attachment '{attachment.FileName ?? ""}' contains no valid data.", 400); + } + + // Determine content type with fallback. + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + var safeFileType = string.IsNullOrEmpty(fileType) ? "application/octet-stream" : fileType; + + var fileName = attachment.FileName ?? _s3Service.GenerateFileName(safeFileType, tenantId, "invoice"); + var objectKey = $"tenant-{tenantId}/PurchaseInvoice/{id}/{fileName}"; + + // Upload file to S3 asynchronously. + await _s3Service.UploadFileAsync(base64Data, safeFileType, objectKey); + + var documentId = Guid.NewGuid(); + + // Prepare Document entity. + preparedDocuments.Add(new Document + { + Id = documentId, + BatchId = batchId, + UploadedById = loggedInEmployee.Id, + FileName = fileName, + ContentType = attachment.ContentType ?? safeFileType, + S3Key = objectKey, + FileSize = attachment.FileSize, + UploadedAt = DateTime.UtcNow, + TenantId = tenantId, + }); + + // Prepare PurchaseInvoiceAttachment entity. + preparedAttachments.Add(new PurchaseInvoiceAttachment + { + Id = Guid.NewGuid(), + InvoiceAttachmentTypeId = attachment.InvoiceAttachmentTypeId, + PurchaseInvoiceId = id, + DocumentId = documentId, + UploadedAt = DateTime.UtcNow, + UploadedById = loggedInEmployee.Id, + TenantId = tenantId, + }); + } + + // Add batched uploaded documents and attachments. + context.Documents.AddRange(preparedDocuments); + context.PurchaseInvoiceAttachments.AddRange(preparedAttachments); + await context.SaveChangesAsync(ct); + } + + // Delete attachments marked for removal. + if (deleteAttachmentIds.Any()) + { + await DeleteAttachemnts(deleteAttachmentIds, ct); + _logger.LogInfo("Deleted {Count} attachments from PurchaseInvoiceId {InvoiceId} for TenantId {TenantId}", deleteAttachmentIds.Count, id, tenantId); + } + + await transaction.CommitAsync(); + + // Push audit log entry asynchronously for traceability. + await updateLogHelper.PushToUpdateLogsAsync( + new UpdateLogsObject + { + EntityId = id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, + "PurchaseInvoiceModificationLog"); + + _logger.LogInfo("Purchase invoice updated successfully. InvoiceId: {InvoiceId}, TenantId: {TenantId}, UpdatedById: {UserId}", id, tenantId, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(model, "Purchase invoice updated successfully.", 200); + } + catch (OperationCanceledException) + { + await transaction.RollbackAsync(); + _logger.LogError(null, "UpdatePurchaseInvoiceAsync operation cancelled. InvoiceId: {InvoiceId}, TenantId: {TenantId}", id, tenantId); + + return ApiResponse.ErrorResponse("Request cancelled", "The update operation was cancelled by the client or the server.", 499); + } + catch (DbUpdateException ex) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Unexpected error during update of purchase invoice. InvoiceId: {InvoiceId}, TenantId: {TenantId}, UserId: {UserId}", id, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Update failed", "An unexpected error occurred while updating the purchase invoice. Please try again later.", 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Unexpected error during update of purchase invoice. InvoiceId: {InvoiceId}, TenantId: {TenantId}, UserId: {UserId}", id, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Update failed", "An unexpected error occurred while updating the purchase invoice. Please try again later.", 500); + } + } + + //public async Task DeletePurchaseInvoiceAsync(Guid id, Guid tenantId, CancellationToken ct = default) + + #endregion + + #region =================================================================== Delivery Challan Functions =================================================================== + #endregion + + #region =================================================================== Purchase Invoice History Functions =================================================================== + #endregion + + #region =================================================================== Helper Functions =================================================================== + + public async Task GetPurchaseInvoiceByIdAsync(Guid id, Guid tenantId, CancellationToken ct = default) + { + await using var readContext = await _dbContextFactory.CreateDbContextAsync(ct); + var purchaseInvoice = await readContext.PurchaseInvoiceDetails + .Where(e => e.Id == id && e.TenantId == tenantId && e.IsActive) + .FirstOrDefaultAsync(ct); + + if (purchaseInvoice == null) + { + _logger.LogWarning("Purchase Invoice not found. ID: {Id}, TenantID: {TenantId}", id, tenantId); + } + else + { + _logger.LogInfo("Purchase Invoice found. ID: {Id}, TenantID: {TenantId}", id, tenantId); + } + + return purchaseInvoice; + } private AdvanceFilter? TryDeserializeFilter(string? filter) { if (string.IsNullOrWhiteSpace(filter)) @@ -816,8 +963,54 @@ namespace Marco.Pms.Services.Service private async Task LoadServiceProjectAsync(Guid projectId, Guid tenantId) { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.ServiceProjects.Where(sp => sp.Id == projectId && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).FirstOrDefaultAsync(); + return await context.ServiceProjects.AsNoTracking().Where(sp => sp.Id == projectId && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).FirstOrDefaultAsync(); } + private async Task DeleteAttachemnts(List documentIds, CancellationToken ct) + { + var attachmentTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + var attachments = await context.PurchaseInvoiceAttachments.AsNoTracking().Where(ba => documentIds.Contains(ba.DocumentId)).ToListAsync(ct); + + context.PurchaseInvoiceAttachments.RemoveRange(attachments); + await context.SaveChangesAsync(ct); + }); + var documentsTask = Task.Run(async () => + { + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + await using var context = await _dbContextFactory.CreateDbContextAsync(); + var documents = await context.Documents.AsNoTracking().Where(ba => documentIds.Contains(ba.Id)).ToListAsync(ct); + + if (documents.Any()) + { + context.Documents.RemoveRange(documents); + await context.SaveChangesAsync(ct); + + List deletionObject = new List(); + foreach (var document in documents) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.S3Key + }); + if (!string.IsNullOrWhiteSpace(document.ThumbS3Key) && document.ThumbS3Key != document.S3Key) + { + deletionObject.Add(new S3DeletionObject + { + Key = document.ThumbS3Key + }); + } + } + await _updateLogHelper.PushToS3DeletionAsync(deletionObject); + } + }); + + await Task.WhenAll(attachmentTask, documentsTask); + } + #endregion + } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index 554da76..3f194f9 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -1,5 +1,6 @@ using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.PurchaseInvoice; @@ -7,9 +8,23 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IPurchaseInvoiceService { + #region =================================================================== Purchase Invoice Functions =================================================================== Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> GetPurchaseInvoiceDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + Task> UpdatePurchaseInvoiceAsync(Guid id, PurchaseInvoiceDetails purchaseInvoice, PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + + #endregion + + #region =================================================================== Delivery Challan Functions =================================================================== + #endregion + + #region =================================================================== Purchase Invoice History Functions =================================================================== + #endregion + + #region =================================================================== Helper Functions =================================================================== + Task GetPurchaseInvoiceByIdAsync(Guid id, Guid tenantId, CancellationToken ct); + #endregion } } -- 2.43.0 From 41feb58d455ddad676cf30d148af24dbf7c0c254 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 27 Nov 2025 12:28:21 +0530 Subject: [PATCH 12/58] Added An API to add delivery challan to purchase invoice --- .../PurchaseInvoice/DeliveryChallanDto.cs | 11 ++ .../PurchaseInvoice/BasicPurchaseInvoiceVM.cs | 9 + .../PurchaseInvoice/DeliveryChallanVM.cs | 16 ++ .../Controllers/AttendanceController.cs | 2 +- .../Controllers/PurchaseInvoiceController.cs | 32 ++++ .../MappingProfiles/MappingProfile.cs | 12 ++ .../Service/PurchaseInvoiceService.cs | 170 +++++++++++++++++- .../IPurchaseInvoiceService.cs | 1 + 8 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.Model/Dtos/PurchaseInvoice/DeliveryChallanDto.cs create mode 100644 Marco.Pms.Model/ViewModels/PurchaseInvoice/BasicPurchaseInvoiceVM.cs create mode 100644 Marco.Pms.Model/ViewModels/PurchaseInvoice/DeliveryChallanVM.cs diff --git a/Marco.Pms.Model/Dtos/PurchaseInvoice/DeliveryChallanDto.cs b/Marco.Pms.Model/Dtos/PurchaseInvoice/DeliveryChallanDto.cs new file mode 100644 index 0000000..4e71c71 --- /dev/null +++ b/Marco.Pms.Model/Dtos/PurchaseInvoice/DeliveryChallanDto.cs @@ -0,0 +1,11 @@ +namespace Marco.Pms.Model.Dtos.PurchaseInvoice +{ + public class DeliveryChallanDto + { + public required string DeliveryChallanNumber { get; set; } + public required DateTime DeliveryChallanDate { get; set; } + public required string Description { get; set; } + public required Guid PurchaseInvoiceId { get; set; } + public required InvoiceAttachmentDto Attachment { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/BasicPurchaseInvoiceVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/BasicPurchaseInvoiceVM.cs new file mode 100644 index 0000000..db7a493 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/BasicPurchaseInvoiceVM.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.ViewModels.PurchaseInvoice +{ + public class BasicPurchaseInvoiceVM + { + public Guid Id { get; set; } + public string? Title { get; set; } + public string? PurchaseInvoiceUId { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/DeliveryChallanVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/DeliveryChallanVM.cs new file mode 100644 index 0000000..086e929 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/DeliveryChallanVM.cs @@ -0,0 +1,16 @@ +using Marco.Pms.Model.ViewModels.Activities; + +namespace Marco.Pms.Model.ViewModels.PurchaseInvoice +{ + public class DeliveryChallanVM + { + public Guid Id { get; set; } + public string? DeliveryChallanNumber { get; set; } + public DateTime DeliveryChallanDate { get; set; } + public string? Description { get; set; } + public BasicPurchaseInvoiceVM? PurchaseInvoice { get; set; } + public PurchaseInvoiceAttachmentVM? Attachment { get; set; } + public DateTime CreatedAt { get; set; } + public BasicEmployeeVM? CreatedBy { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 2c90522..403dccf 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -88,7 +88,7 @@ namespace MarcoBMS.Services.Controllers return BadRequest(ApiResponse.ErrorResponse("Employee ID is required and must not be Empty.", "Employee ID is required and must not be empty.", 400)); } - Employee? employee = await _context.Employees.Include(e => e.JobRole).FirstOrDefaultAsync(e => e.Id == employeeId && e.TenantId == tenantId); + Employee? employee = await _context.Employees.Include(e => e.JobRole).FirstOrDefaultAsync(e => e.Id == employeeId); if (employee == null) { _logger.LogWarning("Employee {EmployeeId} not found", employeeId); diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 0b80396..5d67aa1 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -124,6 +124,38 @@ namespace Marco.Pms.Services.Controllers #endregion #region =================================================================== Delivery Challan Functions =================================================================== + + /// + /// Adds a delivery challan. + /// + /// The delivery challan model. + /// The cancellation token. + /// The HTTP response for adding the delivery challan. + [HttpPost("delivery-challan/create")] + public async Task AddDeliveryChallan([FromBody] DeliveryChallanDto model, CancellationToken ct) + { + // Get the currently logged-in employee + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Add the delivery challan using the purchase invoice service + var response = await _purchaseInvoiceService.AddDeliveryChallanAsync(model, loggedInEmployee, tenantId, ct); + + // If the addition is successful, send a notification to the SignalR service + if (response.Success) + { + var notification = new + { + LoggedInUserId = loggedInEmployee.Id, + Keyword = "Delivery_Challan", + Response = response.Data + }; + await _signalR.SendNotificationAsync(notification); + } + + // Return the HTTP response + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 631e943..ea7b7b5 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -635,6 +635,11 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.PurchaseInvoiceUId, opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")); + + CreateMap() + .ForMember( + dest => dest.PurchaseInvoiceUId, + opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")); CreateMap() .ForMember( dest => dest.PurchaseInvoiceUId, @@ -651,6 +656,13 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.ContentType, opt => opt.MapFrom(src => src.Document != null ? src.Document.ContentType : null)); + CreateMap() + .ForMember( + dest => dest.Attachment, + opt => opt.Ignore()); + + CreateMap(); + #endregion } } diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index aabda5e..f3db011 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -10,6 +10,7 @@ using Marco.Pms.Model.Projects; using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.Organization; using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Model.ViewModels.PurchaseInvoice; @@ -31,6 +32,7 @@ namespace Marco.Pms.Services.Service private readonly IMapper _mapper; private readonly Guid DraftInvoiceStatusId = Guid.Parse("8a5ef25e-3c9e-45de-add9-6b1c1df54381"); + private readonly Guid DeliveryChallanTypeId = Guid.Parse("ca294108-a586-4207-88c8-163b24305ddc"); public PurchaseInvoiceService(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, @@ -727,7 +729,7 @@ namespace Marco.Pms.Services.Service if (status == null) { - _logger.LogError(null, "UpdatePurchaseInvoiceAsync critical: Missing required purchase invoice status ID {StatusId}.", model.StatusId); + _logger.LogError(null, "UpdatePurchaseInvoiceAsync critical: Missing required purchase invoice status ID {StatusId}.", model.StatusId ?? Guid.Empty); return ApiResponse.ErrorResponse( "System configuration error", @@ -884,6 +886,172 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Delivery Challan Functions =================================================================== + public async Task> AddDeliveryChallanAsync(DeliveryChallanDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // 1. Input Validation - Fail Fast + // Validate inputs before engaging expensive resources (DB/S3). + if (model == null) throw new ArgumentNullException(nameof(model)); + + // Extract Base64 Data safely + var base64Data = model.Attachment.Base64Data?.Split(',').LastOrDefault(); + if (string.IsNullOrWhiteSpace(base64Data)) + { + _logger.LogWarning("AddDeliveryChallan: Validation Failed - Attachment is empty. Tenant: {TenantId}, Invoice: {InvoiceId}", tenantId, model.PurchaseInvoiceId); + return ApiResponse.ErrorResponse("Invalid Attachment", "The uploaded attachment contains no data.", 400); + } + + // Prepare S3 Metadata + var fileType = _s3Service.GetContentTypeFromBase64(base64Data); + var safeContentType = string.IsNullOrEmpty(fileType) ? "application/octet-stream" : fileType; + // Use the sanitized file name or generate a new one to prevent path traversal or collision + var fileName = !string.IsNullOrWhiteSpace(model.Attachment.FileName) + ? model.Attachment.FileName + : _s3Service.GenerateFileName(safeContentType, tenantId, "invoice"); + + var objectKey = $"tenant-{tenantId}/PurchaseInvoice/{model.PurchaseInvoiceId}/{fileName}"; + + // Generate new IDs upfront to maintain referential integrity in code + var documentId = Guid.NewGuid(); + var attachmentId = Guid.NewGuid(); + var deliveryChallanId = Guid.NewGuid(); + + // 2. Database Read Operations (Scoped Context) + // We use a factory to create a short-lived context. + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // Fetch Purchase Invoice - Use AsNoTracking for performance since we aren't modifying it here. + // Note: We project only what we need or map later to avoid EF translation issues with complex Mappers. + var purchaseInvoiceEntity = await context.PurchaseInvoiceDetails + .AsNoTracking() + .FirstOrDefaultAsync(pid => pid.Id == model.PurchaseInvoiceId && pid.TenantId == tenantId, ct); + + if (purchaseInvoiceEntity == null) + { + _logger.LogWarning("AddDeliveryChallan: Purchase Invoice not found. Id: {InvoiceId}, Tenant: {TenantId}", model.PurchaseInvoiceId, tenantId); + return ApiResponse.ErrorResponse("Not Found", "The specified Purchase Invoice does not exist.", 404); + } + + // Validate Attachment Type + var invoiceAttachmentType = await context.InvoiceAttachmentTypes + .AsNoTracking() + .FirstOrDefaultAsync(iat => iat.Id == DeliveryChallanTypeId, ct); + + if (invoiceAttachmentType == null) + { + _logger.LogError(null, "AddDeliveryChallan: Configuration Error - InvoiceAttachmentType {TypeId} missing.", DeliveryChallanTypeId); + return ApiResponse.ErrorResponse("Configuration Error", "System configuration for Delivery Challan is missing.", 500); + } + + // 3. External Service Call (S3 Upload) + // We upload BEFORE the DB transaction. If this fails, we return error. + // If DB fails later, we must compensate (delete this file). + try + { + await _s3Service.UploadFileAsync(base64Data, safeContentType, objectKey); + } + catch (Exception ex) + { + _logger.LogError(ex, "AddDeliveryChallan: S3 Upload failed. Key: {ObjectKey}", objectKey); + return ApiResponse.ErrorResponse("Upload Failed", "Failed to upload the attachment to storage.", 502); + } + + // 4. Transactional Write Operations + // Begin transaction for data consistency across multiple tables. + await using var transaction = await context.Database.BeginTransactionAsync(ct); + + try + { + var now = DateTime.UtcNow; + + // Entity 1: Document (Metadata) + var document = new Document + { + Id = documentId, + BatchId = Guid.NewGuid(), // Assuming single batch for this operation + UploadedById = loggedInEmployee.Id, + FileName = fileName, + ContentType = model.Attachment.ContentType ?? safeContentType, + S3Key = objectKey, + FileSize = model.Attachment.FileSize, // Ensure this is calculated correctly in DTO or here + UploadedAt = now, + TenantId = tenantId + }; + + // Entity 2: PurchaseInvoiceAttachment (Link) + var newAttachment = new PurchaseInvoiceAttachment + { + Id = attachmentId, + InvoiceAttachmentTypeId = DeliveryChallanTypeId, + PurchaseInvoiceId = model.PurchaseInvoiceId, + DocumentId = documentId, + UploadedAt = now, + UploadedById = loggedInEmployee.Id, + TenantId = tenantId + }; + + // Entity 3: DeliveryChallanDetails (Domain Data) + var deliveryChallan = _mapper.Map(model); + deliveryChallan.Id = deliveryChallanId; + deliveryChallan.AttachmentId = attachmentId; + deliveryChallan.CreatedAt = now; + deliveryChallan.CreatedById = loggedInEmployee.Id; + deliveryChallan.TenantId = tenantId; + + // Batch Add + context.Documents.Add(document); + context.PurchaseInvoiceAttachments.Add(newAttachment); + context.DeliveryChallanDetails.Add(deliveryChallan); + + // Execute DB changes - One round trip + await context.SaveChangesAsync(ct); + await transaction.CommitAsync(ct); + + _logger.LogInfo("AddDeliveryChallan: Success. ChallanId: {ChallanId}, Tenant: {TenantId}", deliveryChallanId, tenantId); + + // 5. Response Preparation + // Map response objects. Ensure the VM matches the generic return type. + var response = _mapper.Map(deliveryChallan); + + // Manual mapping for complex nested objects if Automapper config is not set for deep linking + response.PurchaseInvoice = _mapper.Map(purchaseInvoiceEntity); + response.CreatedBy = _mapper.Map(loggedInEmployee); + + response.Attachment = new PurchaseInvoiceAttachmentVM + { + DocumentId = document.Id, + InvoiceAttachmentType = invoiceAttachmentType, + FileName = document.FileName, + ContentType = document.ContentType, + // Generate URLs only when needed to keep response lightweight, or if they expire + PreSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey), + ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey) + }; + + return ApiResponse.SuccessResponse(response, "Delivery Challan added successfully.", 201); // 201 Created + } + catch (Exception ex) + { + // 6. Rollback & Compensation + await transaction.RollbackAsync(ct); + + _logger.LogError(ex, "AddDeliveryChallan: Database transaction failed. Rolling back. Tenant: {TenantId}", tenantId); + + // Compensating Action: Delete the file from S3 since DB insert failed. + // We run this in a fire-and-forget or background manner, or await it carefully so it doesn't hide the original exception. + try + { + _logger.LogInfo("AddDeliveryChallan: Attempting to delete orphaned S3 file: {ObjectKey}", objectKey); + await _s3Service.DeleteFileAsync(objectKey); + } + catch (Exception s3Ex) + { + // Just log this, don't throw, so we still return the original DB error to the user + _logger.LogError(s3Ex, "AddDeliveryChallan: Failed to clean up orphaned S3 file: {ObjectKey}", objectKey); + } + + return ApiResponse.ErrorResponse("Processing Error", "An error occurred while saving the delivery challan.", 500); + } + } #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index 3f194f9..1225fee 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -18,6 +18,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Delivery Challan Functions =================================================================== + Task> AddDeliveryChallanAsync(DeliveryChallanDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== -- 2.43.0 From 0fe59223e22e2fc20a866d1287e1d534d12c8626 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 27 Nov 2025 14:42:38 +0530 Subject: [PATCH 13/58] Added an API to get list of delivery challan by purchase invoice ID --- .../Controllers/PurchaseInvoiceController.cs | 12 ++- .../Helpers/CacheUpdateHelper.cs | 21 ++--- .../Service/PurchaseInvoiceService.cs | 82 ++++++++++++++++++- .../IPurchaseInvoiceService.cs | 1 + 4 files changed, 103 insertions(+), 13 deletions(-) diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 5d67aa1..398c646 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -40,7 +40,7 @@ namespace Marco.Pms.Services.Controllers /// Token to propagate notification that operations should be canceled. /// A HTTP 200 OK response with a list of purchase invoices or an appropriate HTTP error code. [HttpGet("list")] - public async Task GetPurchaseInvoiceListAsync([FromQuery] string? searchString, [FromQuery] string? filter, CancellationToken cancellationToken, [FromQuery] bool isActive = true, + public async Task GetPurchaseInvoiceList([FromQuery] string? searchString, [FromQuery] string? filter, CancellationToken cancellationToken, [FromQuery] bool isActive = true, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) { // Get the currently logged-in employee @@ -54,7 +54,7 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("details/{id}")] - public async Task GetPurchaseInvoiceDetailsAsync(Guid id, CancellationToken cancellationToken) + public async Task GetPurchaseInvoiceDetails(Guid id, CancellationToken cancellationToken) { // Get the currently logged-in employee var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -125,6 +125,14 @@ namespace Marco.Pms.Services.Controllers #region =================================================================== Delivery Challan Functions =================================================================== + [HttpGet("delivery-challan/list/{purchaseInvoiceId}")] + public async Task GetDeliveryChallans(Guid purchaseInvoiceId, CancellationToken cancellationToken) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _purchaseInvoiceService.GetDeliveryChallansAsync(purchaseInvoiceId, loggedInEmployee, tenantId, cancellationToken); + return StatusCode(response.StatusCode, response); + } + /// /// Adds a delivery challan. /// diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index ce78e79..4dd5377 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -116,7 +116,7 @@ namespace Marco.Pms.Services.Helpers using var context = _dbContextFactory.CreateDbContext(); return await context.ProjectAllocations .AsNoTracking() - .CountAsync(pa => pa.ProjectId == project.Id && pa.IsActive); // Server-side count is efficient + .CountAsync(pa => pa.ProjectId == project.Id && pa.TenantId == project.TenantId && pa.IsActive); // Server-side count is efficient }); // This task fetches the entire infrastructure hierarchy and performs aggregations in the database. @@ -127,26 +127,26 @@ namespace Marco.Pms.Services.Helpers // 1. Fetch all hierarchical data using projections. // This is still a chain, but it's inside one task and much faster due to projections. var buildings = await context.Buildings.AsNoTracking() - .Where(b => b.ProjectId == project.Id) + .Where(b => b.ProjectId == project.Id && b.TenantId == project.TenantId) .Select(b => new { b.Id, b.ProjectId, b.Name, b.Description }) .ToListAsync(); var buildingIds = buildings.Select(b => b.Id).ToList(); var floors = await context.Floor.AsNoTracking() - .Where(f => buildingIds.Contains(f.BuildingId)) + .Where(f => buildingIds.Contains(f.BuildingId) && f.TenantId == project.TenantId) .Select(f => new { f.Id, f.BuildingId, f.FloorName }) .ToListAsync(); var floorIds = floors.Select(f => f.Id).ToList(); var workAreas = await context.WorkAreas.AsNoTracking() - .Where(wa => floorIds.Contains(wa.FloorId)) + .Where(wa => floorIds.Contains(wa.FloorId) && wa.TenantId == project.TenantId) .Select(wa => new { wa.Id, wa.FloorId, wa.AreaName }) .ToListAsync(); var workAreaIds = workAreas.Select(wa => wa.Id).ToList(); // 2. THE KEY OPTIMIZATION: Aggregate work items in the database. var workSummaries = await context.WorkItems.AsNoTracking() - .Where(wi => workAreaIds.Contains(wi.WorkAreaId)) + .Where(wi => workAreaIds.Contains(wi.WorkAreaId) && wi.TenantId == project.TenantId) .GroupBy(wi => wi.WorkAreaId) // Group by parent on the DB server .Select(g => new // Let the DB do the SUM { @@ -281,6 +281,7 @@ namespace Marco.Pms.Services.Helpers var projectStatusIds = projects.Select(p => p.ProjectStatusId).Distinct().ToList(); var promotorIds = projects.Select(p => p.PromoterId).Distinct().ToList(); var pmcsIds = projects.Select(p => p.PMCId).Distinct().ToList(); + var tenantIds = projects.Select(p => p.TenantId).Distinct().ToList(); // --- Step 1: Fetch all required data in maximum parallel --- // Each task uses its own DbContext and selects only the required columns (projection). @@ -320,7 +321,7 @@ namespace Marco.Pms.Services.Helpers // Server-side aggregation and projection into a dictionary return await context.ProjectAllocations .AsNoTracking() - .Where(pa => projectIds.Contains(pa.ProjectId) && pa.IsActive) + .Where(pa => projectIds.Contains(pa.ProjectId) && tenantIds.Contains(pa.TenantId) && pa.IsActive) .GroupBy(pa => pa.ProjectId) .Select(g => new { ProjectId = g.Key, Count = g.Count() }) .ToDictionaryAsync(x => x.ProjectId, x => x.Count); @@ -331,7 +332,7 @@ namespace Marco.Pms.Services.Helpers using var context = _dbContextFactory.CreateDbContext(); return await context.Buildings .AsNoTracking() - .Where(b => projectIds.Contains(b.ProjectId)) + .Where(b => projectIds.Contains(b.ProjectId) && tenantIds.Contains(b.TenantId)) .Select(b => new { b.Id, b.ProjectId, b.Name, b.Description }) // Projection .ToListAsync(); }); @@ -345,7 +346,7 @@ namespace Marco.Pms.Services.Helpers using var context = _dbContextFactory.CreateDbContext(); return await context.Floor .AsNoTracking() - .Where(f => buildingIds.Contains(f.BuildingId)) + .Where(f => buildingIds.Contains(f.BuildingId) && tenantIds.Contains(f.TenantId)) .Select(f => new { f.Id, f.BuildingId, f.FloorName }) // Projection .ToListAsync(); }); @@ -359,7 +360,7 @@ namespace Marco.Pms.Services.Helpers using var context = _dbContextFactory.CreateDbContext(); return await context.WorkAreas .AsNoTracking() - .Where(wa => floorIds.Contains(wa.FloorId)) + .Where(wa => floorIds.Contains(wa.FloorId) && tenantIds.Contains(wa.TenantId)) .Select(wa => new { wa.Id, wa.FloorId, wa.AreaName }) // Projection .ToListAsync(); }); @@ -376,7 +377,7 @@ namespace Marco.Pms.Services.Helpers // Let the DB do the SUM. This is much faster and transfers less data. return await context.WorkItems .AsNoTracking() - .Where(wi => workAreaIds.Contains(wi.WorkAreaId)) + .Where(wi => workAreaIds.Contains(wi.WorkAreaId) && tenantIds.Contains(wi.TenantId)) .GroupBy(wi => wi.WorkAreaId) .Select(g => new { diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index f3db011..a31d997 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -886,6 +886,86 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Delivery Challan Functions =================================================================== + + public async Task>> GetDeliveryChallansAsync(Guid purchaseInvoiceId, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // 1. Setup Context + // Using a factory ensures a clean context for this specific unit of work. + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + try + { + _logger.LogInfo("GetDeliveryChallans: Fetching challans. InvoiceId: {InvoiceId}, Tenant: {TenantId}", purchaseInvoiceId, tenantId); + + // 2. Optimized Validation + // Use AnyAsync() instead of FirstOrDefaultAsync(). + // We only need to know if it *exists*, we don't need to load the data into memory. + var isInvoiceValid = await context.PurchaseInvoiceDetails + .AsNoTracking() + .AnyAsync(pid => pid.Id == purchaseInvoiceId && pid.TenantId == tenantId, ct); + + if (!isInvoiceValid) + { + _logger.LogWarning("GetDeliveryChallans: Invoice not found. InvoiceId: {InvoiceId}", purchaseInvoiceId); + return ApiResponse>.ErrorResponse("Invalid Purchase Invoice", "The specified purchase invoice does not exist.", 404); + } + + // 3. Data Retrieval + // Fetch only valid records with necessary related data. + var deliveryChallanEntities = await context.DeliveryChallanDetails + .AsNoTracking() + .Include(dc => dc.PurchaseInvoice) + .Include(dc => dc.Attachment).ThenInclude(pia => pia!.Document) + .Where(dc => dc.PurchaseInvoiceId == purchaseInvoiceId + && dc.TenantId == tenantId + && dc.Attachment != null + && dc.Attachment.Document != null) // Ensure strict data integrity + .ToListAsync(ct); + + // 4. Early Exit for Empty Lists + // Returns an empty list with 200 OK immediately, avoiding unnecessary mapping/looping. + if (!deliveryChallanEntities.Any()) + { + _logger.LogInfo("GetDeliveryChallans: No challans found for InvoiceId: {InvoiceId}", purchaseInvoiceId); + return ApiResponse>.SuccessResponse(new List(), "No delivery challans found.", 200); + } + + // 5. Mapping and Transformation + // We map the entities to View Models first, then apply business logic (S3 URLs). + // Using Map> is generally more efficient than mapping inside a Select loop for complex objects. + + // Enhance VMs with Signed URLs + // We iterate through the already-mapped list to populate non-database fields. + // Zip or standard for-loop could be used, but since we mapped a list, we need to match them up. + // Note: Automapper preserves order, so index matching works, but iterating the Source Entity to populate the Dest VM is safer. + + var responseList = deliveryChallanEntities.Select(dc => + { + var result = _mapper.Map(dc); + if (dc.Attachment?.Document != null) + { + result.Attachment!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(dc.Attachment.Document.S3Key); + + // Fallback logic for thumbnail + var thumbKey = !string.IsNullOrEmpty(dc.Attachment.Document.ThumbS3Key) + ? dc.Attachment.Document.ThumbS3Key + : dc.Attachment.Document.S3Key; + + result.Attachment.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(thumbKey); + } + return result; + }).ToList(); + + _logger.LogInfo("GetDeliveryChallans: Successfully returned {Count} items.", responseList.Count); + + return ApiResponse>.SuccessResponse(responseList, "List of delivery challans fetched successfully.", 200); + } + catch (Exception ex) + { + _logger.LogError(ex, "GetDeliveryChallans: An error occurred. InvoiceId: {InvoiceId}", purchaseInvoiceId); + return ApiResponse>.ErrorResponse("Internal Server Error", "An unexpected error occurred while fetching delivery challans.", 500); + } + } public async Task> AddDeliveryChallanAsync(DeliveryChallanDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) { // 1. Input Validation - Fail Fast @@ -923,7 +1003,7 @@ namespace Marco.Pms.Services.Service // Note: We project only what we need or map later to avoid EF translation issues with complex Mappers. var purchaseInvoiceEntity = await context.PurchaseInvoiceDetails .AsNoTracking() - .FirstOrDefaultAsync(pid => pid.Id == model.PurchaseInvoiceId && pid.TenantId == tenantId, ct); + .FirstOrDefaultAsync(pid => pid.Id == model.PurchaseInvoiceId && pid.IsActive && pid.TenantId == tenantId, ct); if (purchaseInvoiceEntity == null) { diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index 1225fee..583d40e 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -18,6 +18,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Delivery Challan Functions =================================================================== + Task>> GetDeliveryChallansAsync(Guid purchaseInvoiceId, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> AddDeliveryChallanAsync(DeliveryChallanDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); #endregion -- 2.43.0 From 49da601092cb8501c6c3a4d73dc42ae09001e89b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 27 Nov 2025 15:13:26 +0530 Subject: [PATCH 14/58] Added filter by id as well in both project list API and basic Organization list API --- .../Controllers/OrganizationController.cs | 4 ++-- Marco.Pms.Services/Controllers/ProjectController.cs | 4 ++-- Marco.Pms.Services/Service/OrganizationService.cs | 7 ++++++- Marco.Pms.Services/Service/ProjectServices.cs | 11 ++++++++++- .../Service/ServiceInterfaces/IOrganizationService.cs | 2 +- .../Service/ServiceInterfaces/IProjectServices.cs | 2 +- 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Services/Controllers/OrganizationController.cs b/Marco.Pms.Services/Controllers/OrganizationController.cs index b31bfb1..b2b6c4a 100644 --- a/Marco.Pms.Services/Controllers/OrganizationController.cs +++ b/Marco.Pms.Services/Controllers/OrganizationController.cs @@ -46,10 +46,10 @@ namespace Marco.Pms.Services.Controllers } [HttpGet("list/basic")] - public async Task GetOrganizationBasicList([FromQuery] string? searchString, CancellationToken ct, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) + public async Task GetOrganizationBasicList([FromQuery] Guid? id, [FromQuery] string? searchString, CancellationToken ct, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _organizationService.GetOrganizationBasicListAsync(searchString, pageNumber, pageSize, loggedInEmployee, ct); + var response = await _organizationService.GetOrganizationBasicListAsync(id, searchString, pageNumber, pageSize, loggedInEmployee, ct); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 9b49119..cdc2b61 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -41,11 +41,11 @@ namespace MarcoBMS.Services.Controllers #region =================================================================== Project Get APIs =================================================================== [HttpGet("list/basic/all")] - public async Task GetBothProjectBasicList([FromQuery] string? searchString) + public async Task GetBothProjectBasicList([FromQuery] Guid? id, [FromQuery] string? searchString) { // Get the current user var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _projectServices.GetBothProjectBasicListAsync(searchString, loggedInEmployee, tenantId); + var response = await _projectServices.GetBothProjectBasicListAsync(id, searchString, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index 7bfab16..e116a4a 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -163,7 +163,7 @@ namespace Marco.Pms.Services.Service /// The current user context for security filtering. /// Cancellation token to cancel operations if the client disconnects. /// A paginated list of BasicOrganizationVm. - public async Task> GetOrganizationBasicListAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct = default) + public async Task> GetOrganizationBasicListAsync(Guid? id, string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct = default) { try { @@ -188,6 +188,11 @@ namespace Marco.Pms.Services.Service query = query.Where(o => o.Name.Contains(searchTrimmed)); } + if (id.HasValue) + { + query = query.Where(o => o.Id == id.Value); + } + // 5. COUNT TOTALS (Efficiently) // Count the total records matching the filter BEFORE applying pagination var totalCount = await query.CountAsync(ct); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 9be8957..e9cb9d7 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -61,7 +61,7 @@ namespace Marco.Pms.Services.Service /// Authenticated employee requesting the data. /// Tenant identifier to ensure multi-tenant data isolation. /// Returns an ApiResponse containing the distinct combined list of basic project view models or an error response. - public async Task> GetBothProjectBasicListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId) + public async Task> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId) { if (tenantId == Guid.Empty) { @@ -88,6 +88,10 @@ namespace Marco.Pms.Services.Service .Where(p => p.Name.ToLower().Contains(normalized) || (!string.IsNullOrWhiteSpace(p.ShortName) && p.ShortName.ToLower().Contains(normalized))); } + if (id.HasValue) + { + infraProjectsQuery = infraProjectsQuery.Where(p => p.Id == id.Value); + } var infraProjects = await infraProjectsQuery.ToListAsync(); return infraProjects.Select(p => _mapper.Map(p)).ToList(); @@ -108,6 +112,11 @@ namespace Marco.Pms.Services.Service (!string.IsNullOrWhiteSpace(sp.ShortName) && sp.ShortName.ToLower().Contains(normalized))); } + if (id.HasValue) + { + serviceProjectsQuery = serviceProjectsQuery.Where(sp => sp.Id == id.Value); + } + var serviceProjects = await serviceProjectsQuery.ToListAsync(); return serviceProjects.Select(sp => _mapper.Map(sp)).ToList(); }); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs index 6abbe83..36f0208 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IOrganizationService.cs @@ -8,7 +8,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { #region =================================================================== Get Functions =================================================================== Task> GetOrganizarionListAsync(string? searchString, long? sprid, bool active, int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); - Task> GetOrganizationBasicListAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct); + Task> GetOrganizationBasicListAsync(Guid? id, string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, CancellationToken ct); Task> GetOrganizationDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); Task> GetOrganizationHierarchyListAsync(Guid employeeId, Employee loggedInEmployee, Guid tenantId, Guid loggedOrganizationId); #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs index 98b36d6..2042987 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs @@ -10,7 +10,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IProjectServices { - Task> GetBothProjectBasicListAsync(string? searchString, Employee loggedInEmployee, Guid tenantId); + Task> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId); Task> GetAllProjectsBasicAsync(bool provideAll, Employee loggedInEmployee, Guid tenantId); Task> GetAllProjectsAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId); Task> GetProjectAsync(Guid id, Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From 9e7651f345f389f849ceee884c4bdf428887397d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 09:49:41 +0530 Subject: [PATCH 15/58] Corrected the logic of updating images and add file size in details View model --- .../PurchaseInvoiceAttachmentVM.cs | 2 ++ .../Service/PurchaseInvoiceService.cs | 23 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs index 815dcd3..9fdd30e 100644 --- a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceAttachmentVM.cs @@ -10,5 +10,7 @@ namespace Marco.Pms.Model.ViewModels.PurchaseInvoice public string? ContentType { get; set; } public string? PreSignedUrl { get; set; } public string? ThumbPreSignedUrl { get; set; } + public long FileSize { get; set; } + public DateTime UploadedAt { get; set; } } } diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index a31d997..70a8b0b 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -765,22 +765,18 @@ namespace Marco.Pms.Services.Service .Where(iat => typeIds.Contains(iat.Id)) .ToListAsync(ct); - var invalidTypeIds = typeIds.Except(validTypes.Select(t => t.Id)).ToList(); - if (invalidTypeIds.Any()) - { - foreach (var invalidId in invalidTypeIds) - { - _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Invalid attachment type ID {AttachmentTypeId}.", invalidId); - } - return ApiResponse.ErrorResponse("Invalid attachment types", $"One or more attachment types are invalid: {string.Join(", ", invalidTypeIds)}", 400); - } - var preparedDocuments = new List(); var preparedAttachments = new List(); // Process each new attachment. foreach (var attachment in newAttachments) { + var attachmentType = validTypes.FirstOrDefault(t => t.Id == attachment.InvoiceAttachmentTypeId); + if (attachmentType == null) + { + _logger.LogWarning("UpdatePurchaseInvoiceAsync failed: Invalid attachment type ID {AttachmentTypeId}.", attachment.InvoiceAttachmentTypeId); + return ApiResponse.ErrorResponse("Invalid attachment types", $"One or more attachment types are invalid: {attachment.InvoiceAttachmentTypeId}", 400); + } // Validate base64 data presence. var base64Data = attachment.Base64Data?.Split(',').LastOrDefault(); if (string.IsNullOrWhiteSpace(base64Data)) @@ -820,7 +816,7 @@ namespace Marco.Pms.Services.Service preparedAttachments.Add(new PurchaseInvoiceAttachment { Id = Guid.NewGuid(), - InvoiceAttachmentTypeId = attachment.InvoiceAttachmentTypeId, + InvoiceAttachmentTypeId = attachmentType.Id, PurchaseInvoiceId = id, DocumentId = documentId, UploadedAt = DateTime.UtcNow, @@ -857,7 +853,10 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("Purchase invoice updated successfully. InvoiceId: {InvoiceId}, TenantId: {TenantId}, UpdatedById: {UserId}", id, tenantId, loggedInEmployee.Id); - return ApiResponse.SuccessResponse(model, "Purchase invoice updated successfully.", 200); + var response = _mapper.Map(purchaseInvoice); + response.Project = projectVm; + + return ApiResponse.SuccessResponse(response, "Purchase invoice updated successfully.", 200); } catch (OperationCanceledException) { -- 2.43.0 From 1746cf030067d0ff9bc3ff453a343e044efc24d1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 10:00:41 +0530 Subject: [PATCH 16/58] Changed the condition to check the new attachments --- Marco.Pms.Services/Service/PurchaseInvoiceService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 70a8b0b..1a50d0b 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -749,7 +749,7 @@ namespace Marco.Pms.Services.Service await context.SaveChangesAsync(ct); // 5. Handle attachments update. - var newAttachments = model.Attachments.Where(a => a.IsActive).ToList(); + var newAttachments = model.Attachments.Where(a => !a.DocumentId.HasValue && a.IsActive).ToList(); var deleteAttachmentIds = model.Attachments .Where(a => a.DocumentId.HasValue && !a.IsActive) .Select(a => a.DocumentId!.Value) @@ -1134,6 +1134,7 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== + #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From 28deae6416b4a8180c069a0ba10000a635a62c8e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 10:26:26 +0530 Subject: [PATCH 17/58] Added size and upload at in mapping for purchase invoice attachments --- Marco.Pms.Services/MappingProfiles/MappingProfile.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index ea7b7b5..9a9dac8 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -654,7 +654,13 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Document != null ? src.Document.FileName : null)) .ForMember( dest => dest.ContentType, - opt => opt.MapFrom(src => src.Document != null ? src.Document.ContentType : null)); + opt => opt.MapFrom(src => src.Document != null ? src.Document.ContentType : null)) + .ForMember( + dest => dest.FileSize, + opt => opt.MapFrom(src => src.Document != null ? src.Document.FileSize : 0)) + .ForMember( + dest => dest.UploadedAt, + opt => opt.MapFrom(src => src.Document != null ? src.Document.UploadedAt : DateTime.UtcNow)); CreateMap() .ForMember( @@ -663,6 +669,9 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); + CreateMap(); + CreateMap(); + #endregion } } -- 2.43.0 From e92976049ec41c504aa8e25c6205fcf34b5ef74d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 11:01:20 +0530 Subject: [PATCH 18/58] Added an APIs get payment history list and add payment to purchase invoices --- .../Controllers/PurchaseInvoiceController.cs | 28 +++ .../Service/PurchaseInvoiceService.cs | 215 ++++++++++++++++++ .../IPurchaseInvoiceService.cs | 5 +- 3 files changed, 247 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 398c646..87fd5bd 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Marco.Pms.Model.Dtos.Collection; using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -167,6 +168,33 @@ namespace Marco.Pms.Services.Controllers #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== + [HttpGet("payment-history/list/{purchaseInvoiceId}")] + public async Task GetPurchaseInvoiceHistoryList(Guid purchaseInvoiceId, CancellationToken cancellationToken) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _purchaseInvoiceService.GetPurchaseInvoiceHistoryListAsync(purchaseInvoiceId, loggedInEmployee, tenantId, cancellationToken); + return StatusCode(response.StatusCode, response); + } + + [HttpPost("add/payment")] + public async Task AddPurchaseInvoicePayment([FromBody] ReceivedInvoicePaymentDto model, CancellationToken ct) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _purchaseInvoiceService.AddPurchaseInvoicePaymentAsync(model, loggedInEmployee, tenantId, ct); + if (response.Success) + { + var notification = new + { + LoggedInUserId = loggedInEmployee.Id, + Keyword = "Delivery_Challan", + Response = response.Data + }; + await _signalR.SendNotificationAsync(notification); + } + + // Return the HTTP response + return StatusCode(response.StatusCode, response); + } #endregion } } diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 1a50d0b..6f0648a 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -1,6 +1,7 @@ using AutoMapper; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; +using Marco.Pms.Model.Dtos.Collection; using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Filters; @@ -11,6 +12,7 @@ using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.Collection; using Marco.Pms.Model.ViewModels.Organization; using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Model.ViewModels.PurchaseInvoice; @@ -1135,6 +1137,219 @@ namespace Marco.Pms.Services.Service #region =================================================================== Purchase Invoice History Functions =================================================================== + /// + /// Retrieves the full payment history for a given Purchase Invoice, + /// including related adjustment heads and creator information, + /// with multi-tenant safety and structured logging. + /// + /// Identifier of the purchase invoice. + /// The employee requesting the history. + /// Current tenant identifier for multi-tenancy boundary. + /// Cancellation token for cooperative cancellation. + /// + /// Standardized containing the list of payment history + /// view models or a detailed error response. + /// + public async Task> GetPurchaseInvoiceHistoryListAsync(Guid purchaseInvoiceId, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // Guard clauses to fail fast on obviously invalid parameters. + if (purchaseInvoiceId == Guid.Empty) + { + _logger.LogWarning("GetPurchaseInvoiceHistoryListAsync called with empty PurchaseInvoiceId. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Purchase invoice reference is required.", "PurchaseInvoiceId is empty.", 400); + } + + try + { + // Create a short-lived DbContext instance via factory for this operation. + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // Step 1: Ensure the invoice exists for this tenant. + var purchaseInvoice = await context.PurchaseInvoiceDetails + .AsNoTracking() + .FirstOrDefaultAsync( + pi => pi.Id == purchaseInvoiceId && pi.TenantId == tenantId, + ct); + + if (purchaseInvoice == null) + { + _logger.LogWarning("Purchase Invoice not found. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", purchaseInvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Purchase invoice not found.", $"Purchase invoice not found for InvoiceId: {purchaseInvoiceId}, TenantId: {tenantId}.", 404); + } + + // Step 2: Query payment history with necessary related data eagerly loaded. + var paymentHistoryQuery = context.PurchaseInvoicePayments + .Include(pip => pip.PaymentAdjustmentHead) + .Include(pip => pip.CreatedBy) // Include creator + .ThenInclude(e => e!.JobRole) // Include creator's job role + .Where(pip => pip.InvoiceId == purchaseInvoiceId && pip.TenantId == tenantId); + + var paymentHistory = await paymentHistoryQuery.ToListAsync(ct); + + // Step 3: Map to view models for safe response shaping. + var responseVm = _mapper.Map>(paymentHistory); + + _logger.LogInfo("Purchase Invoice payment history retrieved successfully. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}, PaymentsCount: {PaymentsCount}", + purchaseInvoiceId, tenantId, loggedInEmployee.Id, responseVm.Count); + + // Even if there is no payment history, return 200 with empty collection. + return ApiResponse.SuccessResponse(responseVm, "Purchase invoice payment history retrieved successfully.", 200); + } + catch (OperationCanceledException) + { + // Explicitly handle cancellation to avoid logging it as an error. + _logger.LogWarning("GetPurchaseInvoiceHistoryListAsync operation was canceled. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + purchaseInvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("The operation was canceled.", "GetPurchaseInvoiceHistoryListAsync was canceled by the caller.", 499); + } + catch (Exception ex) + { + // Catch-all to ensure no unhandled exception reaches the client. + _logger.LogError(ex, "Unexpected error while retrieving Purchase Invoice payment history. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + purchaseInvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("An unexpected error occurred while retrieving purchase invoice history.", "Unhandled exception in GetPurchaseInvoiceHistoryListAsync.", 500); + } + } + + /// + /// Adds a payment entry against an existing Purchase Invoice with full validation + /// and structured logging suitable for enterprise scenarios. + /// + /// Payment details to be recorded against the invoice. + /// The currently logged-in employee performing this action. + /// Current tenant identifier to enforce multi-tenancy boundaries. + /// Cancellation token for cooperative cancellation. + /// Standardized ApiResponse with the created payment view model or error details. + public async Task> AddPurchaseInvoicePaymentAsync(ReceivedInvoicePaymentDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // Guard clauses to fail fast on invalid input and avoid null reference issues. + if (model == null) + { + _logger.LogWarning("AddPurchaseInvoicePaymentAsync called with null model. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invalid payment data.", "Received null payment model.", 400); + } + + if (model.InvoiceId == Guid.Empty) + { + _logger.LogWarning("AddPurchaseInvoicePaymentAsync called with empty InvoiceId. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invoice reference is required.", "InvoiceId is empty in payment model.", 200); + } + + if (model.Amount <= 0) + { + _logger.LogWarning("AddPurchaseInvoicePaymentAsync called with non-positive Amount. TenantId: {TenantId}, EmployeeId: {EmployeeId}, Amount: {Amount}", tenantId, loggedInEmployee.Id, model.Amount); + return ApiResponse.ErrorResponse("Payment amount must be greater than zero.", $"Invalid payment amount: {model.Amount}.", 400); + } + + try + { + // Create a short-lived DbContext instance using the factory to ensure proper scope per operation. + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // Step 1: Validate that the invoice exists for the current tenant. + var purchaseInvoice = await context.PurchaseInvoiceDetails + .AsNoTracking() + .FirstOrDefaultAsync( + pi => pi.Id == model.InvoiceId && pi.TenantId == tenantId, + ct); + + if (purchaseInvoice == null) + { + _logger.LogWarning("Purchase Invoice not found. InvoiceId: {InvoiceId}, TenantId: {TenantId}", model.InvoiceId, tenantId); + + return ApiResponse.ErrorResponse("Purchase invoice not found.", $"Purchase invoice not found for InvoiceId: {model.InvoiceId}, TenantId: {tenantId}.", 404); + } + + // Step 2: Validate Payment Adjustment Head. + var paymentAdjustmentHead = await context.PaymentAdjustmentHeads + .FirstOrDefaultAsync(pah => pah.Id == model.PaymentAdjustmentHeadId && pah.TenantId == tenantId, ct); + + if (paymentAdjustmentHead == null) + { + _logger.LogWarning("Payment Adjustment Head not found. PaymentAdjustmentHeadId: {PaymentAdjustmentHeadId}, TenantId: {TenantId}", model.PaymentAdjustmentHeadId, tenantId); + + return ApiResponse.ErrorResponse("Payment adjustment head not found.", $"Payment adjustment head not found for Id: {model.PaymentAdjustmentHeadId}, TenantId: {tenantId}.", + 404); + } + + // Step 3: Get existing payments and ensure the new payment does not exceed the invoice total. + var existingPayments = await context.PurchaseInvoicePayments + .Where(pi => pi.InvoiceId == model.InvoiceId && pi.TenantId == tenantId) + .ToListAsync(ct); + + var alreadyPaidAmount = existingPayments.Sum(pi => pi.Amount); + var proposedTotalPaidAmount = alreadyPaidAmount + model.Amount; + + if (proposedTotalPaidAmount > purchaseInvoice.TotalAmount) + { + _logger.LogWarning("Attempt to add payment exceeding invoice total. InvoiceId: {InvoiceId}, TenantId: {TenantId}, InvoiceTotal: {InvoiceTotal}, AlreadyPaid: {AlreadyPaid}, NewAmount: {NewAmount}, ProposedTotal: {ProposedTotal}", + model.InvoiceId, tenantId, purchaseInvoice.TotalAmount, alreadyPaidAmount, model.Amount, proposedTotalPaidAmount); + + return ApiResponse.ErrorResponse("Total payment amount cannot exceed the invoice amount.", "Payment addition rejected due to exceeding invoice total amount.", + 400); + } + + // Step 4: Map DTO to entity and initialize metadata. + var receivedInvoicePayment = _mapper.Map(model); + receivedInvoicePayment.Id = Guid.NewGuid(); + receivedInvoicePayment.CreatedAt = DateTime.UtcNow; + receivedInvoicePayment.CreatedById = loggedInEmployee.Id; + receivedInvoicePayment.TenantId = tenantId; + + // Step 5: Persist the new payment record. + context.PurchaseInvoicePayments.Add(receivedInvoicePayment); + + // For enterprise robustness, pass the cancellation token to SaveChangesAsync. + var saveResult = await context.SaveChangesAsync(ct); + + if (saveResult <= 0) + { + _logger.LogError(null, "SaveChangesAsync returned 0 while adding Purchase Invoice payment. InvoiceId: {InvoiceId}, TenantId: {TenantId}, PaymentId: {PaymentId}", + model.InvoiceId, tenantId, receivedInvoicePayment.Id); + + return ApiResponse.ErrorResponse("Failed to add payment due to a persistence issue.", "Database SaveChangesAsync returned 0 rows affected while adding PurchaseInvoicePayment.", + statusCode: StatusCodes.Status500InternalServerError); + } + + // Step 6: Map entity back to a response view model. + var responseVm = _mapper.Map(receivedInvoicePayment); + responseVm.PaymentAdjustmentHead = _mapper.Map(paymentAdjustmentHead); + + _logger.LogInfo("Purchase Invoice payment added successfully. InvoiceId: {InvoiceId}, TenantId: {TenantId}, PaymentId: {PaymentId}, Amount: {Amount}, EmployeeId: {EmployeeId}", + model.InvoiceId, tenantId, receivedInvoicePayment.Id, receivedInvoicePayment.Amount, loggedInEmployee.Id); + + return ApiResponse.SuccessResponse(responseVm, "Payment has been recorded successfully.", 201); // 201 Created is more appropriate for new resource. + } + catch (OperationCanceledException) + { + // Explicitly handle cancellation to avoid logging it as an error. + _logger.LogError(null, "AddPurchaseInvoicePaymentAsync operation was canceled. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + model.InvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("The operation was canceled.", "AddPurchaseInvoicePaymentAsync was canceled by the caller.", 499); // 499 used by some systems for client cancellation. + } + catch (DbUpdateException dbEx) + { + // Database-related exceptions with structured logging for observability. + _logger.LogError(dbEx, "Database update error while adding Purchase Invoice payment. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + model.InvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("An error occurred while saving the payment.", "Database update exception occurred during payment creation.", 500); + } + catch (Exception ex) + { + // Catch-all to avoid leaking unhandled exceptions to the client. + _logger.LogError(ex, "Unexpected error while adding Purchase Invoice payment. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + model.InvoiceId, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("An unexpected error occurred while processing the payment.", "Unhandled exception in AddPurchaseInvoicePaymentAsync.", 500); + } + } + #endregion #region =================================================================== Helper Functions =================================================================== diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index 583d40e..a1e2e9c 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -1,4 +1,5 @@ -using Marco.Pms.Model.Dtos.PurchaseInvoice; +using Marco.Pms.Model.Dtos.Collection; +using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; using Marco.Pms.Model.PurchaseInvoice; using Marco.Pms.Model.Utilities; @@ -23,6 +24,8 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Purchase Invoice History Functions =================================================================== + Task> GetPurchaseInvoiceHistoryListAsync(Guid purchaseInvoiceId, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + Task> AddPurchaseInvoicePaymentAsync(ReceivedInvoicePaymentDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); #endregion #region =================================================================== Helper Functions =================================================================== -- 2.43.0 From 4b981b6c74e523e9fa6c6f18fe2dc587bc4ab184 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 12:07:16 +0530 Subject: [PATCH 19/58] Added the purchase invoice related permissions --- .../Data/ApplicationDbContext.cs | 13 +- ...d_Purchase_Invoice_Permissions.Designer.cs | 9466 +++++++++++++++++ ...0004_Added_Purchase_Invoice_Permissions.cs | 78 + .../ApplicationDbContextModelSnapshot.cs | 55 + .../Entitlements/PermissionsMaster.cs | 9 +- .../Service/PurchaseInvoiceService.cs | 110 +- 6 files changed, 9723 insertions(+), 8 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index e1990e9..a36b099 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -1416,6 +1416,7 @@ namespace Marco.Pms.DataAccess.Data new Module { Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), Name = "Employee", Description = "Employee Module", Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637" }, new Module { Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), Name = "Masters", Description = "Masters Module", Key = "504ec132-e6a9-422f-8f85-050602cfce05" }, new Module { Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), Name = "Tenant", Description = "Tenant Module", Key = "504ec132-e6a9-422f-8f85-050602cfce05" }, + new Module { Id = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), Name = "Inventory", Description = "Inventory Module", Key = "504ec132-e6a9-422f-8f85-050602cfce05" }, new Module { Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), Name = "Finance", Description = "Finance Module", Key = "504ec132-e6a9-422f-8f85-050602cfce05" } ); @@ -1439,6 +1440,9 @@ namespace Marco.Pms.DataAccess.Data new Feature { Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), Description = "Managing all directory related rights", Name = "Directory Management", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true }, new Feature { Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), Description = "Managing all organization related rights", Name = "Organization Management", ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), IsActive = true }, + // Inventory Module + new Feature { Id = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), Description = "Managing all Purchase invoice related rights", Name = "Purchase Invoice Management", ModuleId = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), IsActive = true }, + // Tenant Module new Feature { Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), Description = "Managing all tenant related rights", Name = "Tenant Management", ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), IsActive = true } ); @@ -1513,7 +1517,14 @@ namespace Marco.Pms.DataAccess.Data // Organization Management Feature new FeaturePermission { Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), IsEnabled = true, Name = "Add Organization", Description = "Allow user to create new organization" }, new FeaturePermission { Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), IsEnabled = true, Name = "Edit Organization", Description = "Allow the user to update the basic information of the organization" }, - new FeaturePermission { Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), IsEnabled = true, Name = "View Organization", Description = "Allow the user to view information of the organization" } + new FeaturePermission { Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), IsEnabled = true, Name = "View Organization", Description = "Allow the user to view information of the organization" }, + + // Purchase Invoice Management Feature + new FeaturePermission { Id = new Guid("91e09825-512a-465e-82ad-fa355b305585"), FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), IsEnabled = true, Name = "View Self Purchase Invoice", Description = "Allows the user to view only the purchase invoices they created." }, + new FeaturePermission { Id = new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), IsEnabled = true, Name = "View All Purchase Invoice", Description = "Allows the user to view all purchase invoices across the entire organization." }, + new FeaturePermission { Id = new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), IsEnabled = true, Name = "Manage Purchase Invoice", Description = "Allows full control to create, edit, and process purchase invoices." }, + new FeaturePermission { Id = new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), IsEnabled = true, Name = "Delete Purchase Invoice", Description = "Allows the user to mark purchase invoices as inactive or void." }, + new FeaturePermission { Id = new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), IsEnabled = true, Name = "Add Delivery Challan", Description = "Allows the user to create delivery challans for purchase invoices." } ); diff --git a/Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.Designer.cs b/Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.Designer.cs new file mode 100644 index 0000000..0e296ed --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.Designer.cs @@ -0,0 +1,9466 @@ +// +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("20251201060004_Added_Purchase_Invoice_Permissions")] + partial class Added_Purchase_Invoice_Permissions + { + /// + 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("ApprovedAt") + .HasColumnType("datetime(6)"); + + b.Property("ApprovedById") + .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("RequestedAt") + .HasColumnType("datetime(6)"); + + b.Property("RequestedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RequestedById"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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.Collection.Invoice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BasicAmount") + .HasColumnType("double"); + + b.Property("BilledToId") + .HasColumnType("char(36)"); + + b.Property("ClientSubmitedDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ExceptedPaymentDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MarkAsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BilledToId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .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("PaymentAdjustmentHeads"); + + b.HasData( + new + { + Id = new Guid("dbdc047f-a2d2-4db0-b0e6-b9d9f923a0f1"), + Description = "An advance payment is a sum paid before receiving goods or services, often to secure a transaction or cover initial costs.", + IsActive = true, + Name = "Advance payment", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("66c3c241-8b52-4327-a5ad-c1faf102583e"), + Description = "The base amount refers to the principal sum or original value used as a reference in financial calculations, excluding taxes, fees, or additional charges.", + IsActive = true, + Name = "Base Amount", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0d70cb2e-827e-44fc-90a5-c2c55ba51ba9"), + Description = "TDS, or Tax Deducted at Source, is a system under the Indian Income Tax Act where tax is deducted at the point of income generation—such as salary, interest, or rent—and remitted to the government to prevent tax evasion and ensure timely collection.", + IsActive = true, + Name = "Tax Deducted at Source (TDS)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("95f35acd-d979-4177-91ea-fd03a00e49ff"), + Description = "Retention refers to a company's ability to keep customers, employees, or profits over time, commonly measured as a percentage and critical for long-term business sustainability and growth.", + IsActive = true, + Name = "Retention", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("3f09b19a-8d45-4cf2-be27-f4f09b38b9f7"), + Description = "Tax is a mandatory financial charge imposed by a government on individuals or entities to fund public services and government operations, without direct benefit to the taxpayer.", + IsActive = true, + Name = "Tax", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ec5e6a5f-ce62-44e5-8911-8426bbb4dde8"), + Description = "A penalty in the context of taxation is a financial sanction imposed by the government on individuals or entities for non-compliance with tax laws, such as late filing, underreporting income, or failure to pay taxes, and is typically calculated as a percentage of the tax due or a fixed amount.", + IsActive = true, + Name = "Penalty", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("50584332-1cb7-4359-9721-c8ea35040881"), + Description = "Utility fees are recurring charges for essential services such as electricity, water, gas, sewage, waste disposal, internet, and telecommunications, typically based on usage and necessary for operating a home or business.", + IsActive = true, + Name = "Utility fees", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("ReceivedInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("HasApplicationAccess") + .HasColumnType("tinyint(1)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .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("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }, + new + { + Id = new Guid("dbf17591-09fe-4c93-9e1a-12db8f5cc5de"), + Description = "Collection Admin is a permission that grants a user full administrative control over collections, including creating, editing, managing access, and deleting collections within a system.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Collection Admin" + }, + new + { + Id = new Guid("c8d7eea5-4033-4aad-9ebe-76de49896830"), + Description = "View Collection is a permission that allows users to see and browse assets or items within a collection without making any modifications or edits to its contents.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "View Collection" + }, + new + { + Id = new Guid("b93141fd-dbd3-4051-8f57-bf25d18e3555"), + Description = "Authorizes users to create new collections for organizing related resources and managing access", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Create Collection" + }, + new + { + Id = new Guid("455187b4-fef1-41f9-b3d0-025d0b6302c3"), + Description = "Ability to modify collection properties, content, and access rights.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Edit Collection" + }, + new + { + Id = new Guid("061d9ccd-85b4-4cb0-be06-2f9f32cebb72"), + Description = " Enables entry and processing of payment transactions.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Add Payment" + }, + new + { + Id = new Guid("6382ea8b-aff2-4cd2-a48f-a652b35825d8"), + Description = "Manage Recurring Template payment permission allows authorized users to set up, modify, and execute automated recurring payments using predefined templates, ensuring secure and controlled handling of repetitive financial transactions.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "Manage Recurring" + }, + new + { + Id = new Guid("7ddf2fba-c44d-4fe3-b4ec-690ff70be2e3"), + Description = "The \"View All Recurring Template payment permission\" generally allows users to see and access all recurring payment templates in the system, enabling them to review, manage, and process recurring transactions efficiently.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View All Recurring" + }, + new + { + Id = new Guid("e5d21efe-573d-4a16-a0f8-414d3e442e78"), + Description = "View Self Recurring Template payment permission allows a user to view and access their own recurring payment templates without editing rights.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View Self Recurring" + }, + new + { + Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), + Description = "Allow user to create new organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Add Organization" + }, + new + { + Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), + Description = "Allow the user to update the basic information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Edit Organization" + }, + new + { + Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), + Description = "Allow the user to view information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "View Organization" + }, + new + { + Id = new Guid("91e09825-512a-465e-82ad-fa355b305585"), + Description = "Allows the user to view only the purchase invoices they created.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View Self Purchase Invoice" + }, + new + { + Id = new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), + Description = "Allows the user to view all purchase invoices across the entire organization.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View All Purchase Invoice" + }, + new + { + Id = new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), + Description = "Allows full control to create, edit, and process purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Manage Purchase Invoice" + }, + new + { + Id = new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), + Description = "Allows the user to mark purchase invoices as inactive or void.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Delete Purchase Invoice" + }, + new + { + Id = new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), + Description = "Allows the user to create delivery challans for purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Add Delivery Challan" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", 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("CurrentBalance") + .HasColumnType("double"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("FinanceUIdPostfix") + .HasColumnType("int"); + + b.Property("FinanceUIdPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TenantId"); + + b.ToTable("AdvancePaymentTransactions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseUId") + .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("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAttachmentRequried") + .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("ExpenseCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + IsAttachmentRequried = 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("a1cc95ed-b276-4a3e-9f00-0a249b522d64"), + NextStatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("RecurringPaymentStatus"); + + b.HasData( + new + { + Id = new Guid("da462422-13b2-45cc-a175-910a225f6fc8"), + Name = "Active" + }, + new + { + Id = new Guid("3ec864d2-8bf5-42fb-ba70-5090301dd816"), + Name = "De-Activated" + }, + new + { + Id = new Guid("306856fb-5655-42eb-bf8b-808bb5e84725"), + Name = "Completed" + }, + new + { + Id = new Guid("8bfc9346-e092-4a80-acbf-515ae1ef6868"), + Name = "Paused" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("de04b6c7-a5cd-4a61-88b0-b43b0008202e"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseStatusId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAdvancePayment") + .HasColumnType("tinyint(1)"); + + b.Property("IsExpenseCreated") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaidTransactionId") + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("RecurringPaymentId") + .HasColumnType("char(36)"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("ExpenseStatusId"); + + b.HasIndex("PaidById"); + + b.HasIndex("RecurringPaymentId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PaymentRequests"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentRequestAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", 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("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVariable") + .HasColumnType("tinyint(1)"); + + b.Property("LatestPRGeneratedAt") + .HasColumnType("datetime(6)"); + + b.Property("NextStrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("NotifyTo") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentBufferDays") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("StrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RecurringPayments"); + }); + + 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.ActivityGroupMaster", 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit for Review", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }, + new + { + Id = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + Color = "#0E9F6E", + Description = "Create new Expense.", + DisplayName = "Create Expense", + IsActive = true, + IsSystem = true, + Name = "Done" + }); + }); + + 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("IsAttachmentRequried") + .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"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("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("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + Description = "Collection Management is a feature that enables organizations to track, organize, and manage the status and recovery of receivables or assets efficiently throughout their lifecycle, supporting systematic follow-up and resolution of outstanding accounts.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Collection Management" + }, + new + { + Id = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + Description = "Recurring Template Management is the automated creation and scheduling of repetitive tasks, processes, or transactions using predefined templates at set intervals to ensure consistent and efficient workflow execution without manual recreation each time.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Recurring Template Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + Description = "Managing all organization related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Organization Management" + }, + new + { + Id = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + Description = "Managing all Purchase invoice related rights", + IsActive = true, + ModuleId = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Name = "Purchase Invoice Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.ToTable("GlobalActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.ToTable("GlobalActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalServiceMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("GlobalServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }, + new + { + Id = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Description = "Inventory Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Inventory" + }, + new + { + Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), + Description = "Finance Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Finance" + }); + }); + + 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.HasKey("Id"); + + 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" + }, + 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" + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking" + }, + 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" + }, + new + { + Id = new Guid("a820f240-5e9a-4ae9-9091-8a7aa7720cea"), + Description = "A credit card is a payment card that allows you to borrow funds from a financial institution to pay for goods and services", + IsActive = true, + Name = "Credit card" + }, + new + { + Id = new Guid("95697409-baf6-4f78-86ab-42d93d9569a8"), + Description = "A debit card is a payment card that deducts funds directly from the cardholder's bank account when a purchase is made.", + IsActive = true, + Name = "Debit Card" + }, + new + { + Id = new Guid("f67beee6-6763-4108-922c-03bd86b9178d"), + Description = "When a bill is paid using the amount received in advance from a company.", + IsActive = true, + Name = "Advance Payment" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", 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("ServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("StatusUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationHierarchyId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationHierarchyId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TenantId"); + + b.ToTable("OrgHierarchyLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("ServiceId"); + + b.ToTable("OrgServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("OrgTypeMasters"); + + b.HasData( + new + { + Id = new Guid("5ee49bcd-b6d3-482f-9aaf-484afe04abec"), + Name = "Service Provider" + }, + new + { + Id = new Guid("a283356a-9b02-4029-afb7-e65c703efdd4"), + Name = "Sub-Contractor" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + + b.HasData( + new + { + Id = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + Address = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactNumber = "123456789", + ContactPerson = "Admin", + CreatedAt = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "admin@marcoaiot.com", + IsActive = true, + Name = "MarcoBMS", + SPRID = 5400L + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("ReportToId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ReportToId"); + + b.HasIndex("TenantId"); + + b.ToTable("OrganizationHierarchies"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletionDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationTypeId") + .HasColumnType("char(36)"); + + b.Property("ParentOrganizationId") + .HasColumnType("char(36)"); + + b.Property("ProjectServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("OrganizationTypeId"); + + b.HasIndex("ParentOrganizationId"); + + b.HasIndex("ProjectServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActualEndDate") + .HasColumnType("datetime(6)"); + + b.Property("ActualStartDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime(6)"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ReassignedDate") + .HasColumnType("datetime(6)"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PaymentGetway.PaymentDetail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EncryptedDetails") + .HasColumnType("longblob"); + + b.Property("Method") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Nonce") + .HasColumnType("longblob"); + + b.Property("OrderId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Status") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Tag") + .HasColumnType("longblob"); + + b.HasKey("Id"); + + b.ToTable("PaymentDetails"); + }); + + 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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PMCId") + .HasColumnType("char(36)"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("PromoterId") + .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("PMCId"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("PromoterId"); + + 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", + PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + 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.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceAttachmentTypeId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceAttachmentTypeId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("StatusId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + + 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.ServiceProject.JobAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("JobCommentId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("JobCommentId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TaggedInAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedInTime") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendance"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobAttendanceId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("MarkedAt") + .HasColumnType("datetime(6)"); + + b.Property("MarkedTIme") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobAttendanceId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssigneeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssigneeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobEmployeeMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("JobStatus"); + + b.HasData( + new + { + Id = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + DisplayName = "New", + Level = 1, + Name = "New" + }, + new + { + Id = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + DisplayName = "Assigned", + Level = 2, + Name = "Assigned" + }, + new + { + Id = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + DisplayName = "In Progress", + Level = 3, + Name = "In Progress" + }, + new + { + Id = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + DisplayName = "Work Done", + Level = 4, + Name = "Work Done" + }, + new + { + Id = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + DisplayName = "Review Done", + Level = 5, + Name = "Review Done" + }, + new + { + Id = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + DisplayName = "Closed", + Level = 6, + Name = "Closed" + }, + new + { + Id = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + DisplayName = "On Hold", + Level = 7, + Name = "On Hold" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobStatusMappings"); + + b.HasData( + new + { + Id = new Guid("024e1810-6a57-4a0d-8d2e-be88da79fcd4"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cb0db140-87fa-4a6f-812d-2834bd0f53a9"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("42f24930-387e-4f51-9c2d-3e29ffaaf02a"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c83c23-09be-40fd-9d05-f44795d8dee8"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8c4ecdae-7435-4475-8389-15bc453561a1"), + NextStatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a44b0a66-ee33-47e7-a01f-6b8d9b621543"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7165ecee-10e3-4fc0-85d2-6d93d5b11776"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("87891499-e45d-406b-bf22-722db1beedc9"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dc986ec4-858e-4c98-b330-4a5c98c91f07"), + NextStatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ca8b4358-3122-4aaa-bcf8-0b66e4ab313a"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5602d32c-290e-48a3-83dd-91af6d12ed46"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9c2918be-b3c1-46fb-a03b-14dd613e1021"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ab974bdb-2d8f-4ddc-9b71-bd6d198bae75"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2787c903-1b39-4e7d-a0f2-3bb2309bb341"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("76bc5551-8f80-469d-ba23-95d7e746c9a9"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("JobTagId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("JobTagId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", 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("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsArchive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectBranchId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectBranchId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobTickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactInformation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ProjectBranches"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("ContactEmail") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPhone") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ServiceProjects"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectServiceMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ServiceProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceProjectTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceProjectId"); + + b.HasIndex("ServiceProjectTagId"); + + b.ToTable("ServiceProjectTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.TeamRoleMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TeamRoleMasters"); + + b.HasData( + new + { + Id = new Guid("8cfbf16f-7d3b-4c29-af5b-18935f20aa7b"), + Description = "A Support role involves assisting users or customers by resolving technical or service-related issues, answering inquiries, and ensuring a positive experience with products or services.", + Name = "Support" + }, + new + { + Id = new Guid("145d7222-408b-4733-8a17-f417e070b8b8"), + Description = "A Service Engineer installs, maintains, repairs, and troubleshoots equipment to ensure optimal operation and customer satisfaction.", + Name = "Service Engineer" + }, + new + { + Id = new Guid("03bf5853-5e0b-4eb8-9f37-33bd999a05b3"), + Description = "A Manager oversees and coordinates a team or department to achieve organizational goals through planning, decision-making, and leadership.", + Name = "Manager" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationSize") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("TenantEnquires"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PaymentDetailId") + .HasColumnType("char(36)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PaymentDetailId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ExpiredAt") + .HasColumnType("datetime(6)"); + + b.Property("FcmToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("FCMTokenMappings"); + }); + + 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.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "RequestedBy") + .WithMany() + .HasForeignKey("RequestedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Employee"); + + b.Navigation("RequestedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.Invoice", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "BilledTo") + .WithMany() + .HasForeignKey("BilledToId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("BilledTo"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId") + .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.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("PaymentRequest"); + + b.Navigation("ProcessedBy"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.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.Expenses.PaymentRequest", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "ExpenseStatus") + .WithMany() + .HasForeignKey("ExpenseStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById"); + + b.HasOne("Marco.Pms.Model.Expenses.RecurringPayment", "RecurringPayment") + .WithMany() + .HasForeignKey("RecurringPaymentId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("ExpenseStatus"); + + b.Navigation("PaidBy"); + + b.Navigation("RecurringPayment"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PaymentRequest"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", "OrganizationHierarchy") + .WithMany() + .HasForeignKey("OrganizationHierarchyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OrganizationHierarchy"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Organization"); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportTo") + .WithMany() + .HasForeignKey("ReportToId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportTo"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", "OrganizationType") + .WithMany() + .HasForeignKey("OrganizationTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "ParentOrganization") + .WithMany() + .HasForeignKey("ParentOrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", "ProjectService") + .WithMany() + .HasForeignKey("ProjectServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("OrganizationType"); + + b.Navigation("ParentOrganization"); + + b.Navigation("ProjectService"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC") + .WithMany() + .HasForeignKey("PMCId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter") + .WithMany() + .HasForeignKey("PromoterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PMC"); + + b.Navigation("ProjectStatus"); + + b.Navigation("Promoter"); + + 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.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", "InvoiceAttachmentType") + .WithMany() + .HasForeignKey("InvoiceAttachmentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("InvoiceAttachmentType"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Status"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobComment", "JobComment") + .WithMany() + .HasForeignKey("JobCommentId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("JobComment"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + 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.ServiceProject.JobAttendance", "JobAttendance") + .WithMany() + .HasForeignKey("JobAttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("JobAttendance"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobTag", "JobTag") + .WithMany() + .HasForeignKey("JobTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobTag"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ProjectBranch", "ProjectBranch") + .WithMany() + .HasForeignKey("ProjectBranchId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("ProjectBranch"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Client"); + + b.Navigation("CreatedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById"); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "ServiceProject") + .WithMany() + .HasForeignKey("ServiceProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProjectTag", "ServiceProjectTag") + .WithMany() + .HasForeignKey("ServiceProjectTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceProject"); + + b.Navigation("ServiceProjectTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("Organization"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PaymentGetway.PaymentDetail", "PaymentDetail") + .WithMany() + .HasForeignKey("PaymentDetailId"); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("PaymentDetail"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.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/20251201060004_Added_Purchase_Invoice_Permissions.cs b/Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.cs new file mode 100644 index 0000000..fee1ca2 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251201060004_Added_Purchase_Invoice_Permissions.cs @@ -0,0 +1,78 @@ +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_Purchase_Invoice_Permissions : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "Modules", + columns: new[] { "Id", "Description", "Key", "Name" }, + values: new object[] { new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), "Inventory Module", "504ec132-e6a9-422f-8f85-050602cfce05", "Inventory" }); + + migrationBuilder.InsertData( + table: "Features", + columns: new[] { "Id", "Description", "IsActive", "ModuleId", "Name" }, + values: new object[] { new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), "Managing all Purchase invoice related rights", true, new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), "Purchase Invoice Management" }); + + migrationBuilder.InsertData( + table: "FeaturePermissions", + columns: new[] { "Id", "Description", "FeatureId", "IsEnabled", "Name" }, + values: new object[,] + { + { new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), "Allows full control to create, edit, and process purchase invoices.", new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), true, "Manage Purchase Invoice" }, + { new Guid("91e09825-512a-465e-82ad-fa355b305585"), "Allows the user to view only the purchase invoices they created.", new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), true, "View Self Purchase Invoice" }, + { new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), "Allows the user to mark purchase invoices as inactive or void.", new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), true, "Delete Purchase Invoice" }, + { new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), "Allows the user to create delivery challans for purchase invoices.", new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), true, "Add Delivery Challan" }, + { new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), "Allows the user to view all purchase invoices across the entire organization.", new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), true, "View All Purchase Invoice" } + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("91e09825-512a-465e-82ad-fa355b305585")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9")); + + migrationBuilder.DeleteData( + table: "FeaturePermissions", + keyColumn: "Id", + keyValue: new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211")); + + migrationBuilder.DeleteData( + table: "Features", + keyColumn: "Id", + keyValue: new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60")); + + migrationBuilder.DeleteData( + table: "Modules", + keyColumn: "Id", + keyValue: new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17")); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 11c814b..13d55eb 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -2042,6 +2042,46 @@ namespace Marco.Pms.DataAccess.Migrations FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), IsEnabled = true, Name = "View Organization" + }, + new + { + Id = new Guid("91e09825-512a-465e-82ad-fa355b305585"), + Description = "Allows the user to view only the purchase invoices they created.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View Self Purchase Invoice" + }, + new + { + Id = new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), + Description = "Allows the user to view all purchase invoices across the entire organization.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View All Purchase Invoice" + }, + new + { + Id = new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), + Description = "Allows full control to create, edit, and process purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Manage Purchase Invoice" + }, + new + { + Id = new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), + Description = "Allows the user to mark purchase invoices as inactive or void.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Delete Purchase Invoice" + }, + new + { + Id = new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), + Description = "Allows the user to create delivery challans for purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Add Delivery Challan" }); }); @@ -3641,6 +3681,14 @@ namespace Marco.Pms.DataAccess.Migrations Name = "Organization Management" }, new + { + Id = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + Description = "Managing all Purchase invoice related rights", + IsActive = true, + ModuleId = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Name = "Purchase Invoice Management" + }, + new { Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), Description = "Managing all tenant related rights", @@ -3832,6 +3880,13 @@ namespace Marco.Pms.DataAccess.Migrations Name = "Tenant" }, new + { + Id = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Description = "Inventory Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Inventory" + }, + new { Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), Description = "Finance Module", diff --git a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs index 80246e3..6f32ca0 100644 --- a/Marco.Pms.Model/Entitlements/PermissionsMaster.cs +++ b/Marco.Pms.Model/Entitlements/PermissionsMaster.cs @@ -60,6 +60,11 @@ public static readonly Guid AddOrganization = Guid.Parse("068cb3c1-49c5-4746-9f29-1fce16e820ac"); public static readonly Guid EditOrganization = Guid.Parse("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"); public static readonly Guid ViewOrganization = Guid.Parse("7a6cf830-0008-4e03-b31d-0d050cb634f4"); - } -} + public static readonly Guid ViewSelfPurchaseInvoice = Guid.Parse("91e09825-512a-465e-82ad-fa355b305585"); + public static readonly Guid ViewAllPurchaseInvoice = Guid.Parse("d6ae78d3-a941-4cc4-8d0a-d40479be4211"); + public static readonly Guid ManagePurchaseInvoice = Guid.Parse("68ff925d-8ebf-4034-a137-8d3317c56ca1"); + public static readonly Guid DeletePurchaseInvoice = Guid.Parse("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"); + public static readonly Guid AddDeliveryChallan = Guid.Parse("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"); + } +} \ No newline at end of file diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 6f0648a..d0f7ab4 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -4,6 +4,7 @@ using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Collection; using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Filters; using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.OrganizationModel; @@ -47,6 +48,7 @@ namespace Marco.Pms.Services.Service _s3Service = s3Service; _mapper = mapper; } + #region =================================================================== Purchase Invoice Functions =================================================================== /// /// Retrieves a paged list of purchase invoices for a given tenant with support for @@ -65,6 +67,19 @@ namespace Marco.Pms.Services.Service public async Task> GetPurchaseInvoiceListAsync(string? searchString, string? filter, bool isActive, int pageSize, int pageNumber, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) { + // Check if the employee has the necessary permissions + var viewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ViewAllPurchaseInvoice, loggedInEmployee.Id); + var viewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ViewSelfPurchaseInvoice, loggedInEmployee.Id); + + var viewAllPermission = await viewAllPermissionTask; + var viewSelfPermission = await viewSelfPermissionTask; + + if (!viewAllPermission && !viewSelfPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to view purchase invoice list", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have permission to view purchase invoice list.", "You do not have permission to view purchase invoice list.", 403); + } + // Basic argument validation and guard clauses if (tenantId == Guid.Empty) { @@ -102,6 +117,12 @@ namespace Marco.Pms.Services.Service var advanceFilter = TryDeserializeFilter(filter); + // Apply filters based on employee permissions + if (!viewAllPermission && viewSelfPermission) + { + query = query.Where(pid => pid.CreatedById == loggedInEmployee.Id); + } + // Apply ordering, default sort, etc. through your custom extension query = query.ApplyCustomFilters(advanceFilter, "CreatedAt"); @@ -290,6 +311,19 @@ namespace Marco.Pms.Services.Service try { + // Check if the employee has the necessary permissions + var viewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ViewAllPurchaseInvoice, loggedInEmployee.Id); + var viewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ViewSelfPurchaseInvoice, loggedInEmployee.Id); + + var viewAllPermission = await viewAllPermissionTask; + var viewSelfPermission = await viewSelfPermissionTask; + + if (!viewAllPermission && !viewSelfPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to view purchase invoice details", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have permission to view purchase invoice details.", "You do not have permission to view purchase invoice details.", 403); + } + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); // 2. Performance: Use AsNoTracking for read-only queries. @@ -410,6 +444,13 @@ namespace Marco.Pms.Services.Service try { + // Check permissions + var manageInvoicesPermission = await HasPermissionAsync(PermissionsMaster.ManagePurchaseInvoice, loggedInEmployee.Id); + if (!manageInvoicesPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to create a purchase invoice", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to create a purchase invoice.", 403); + } _logger.LogInfo("Initiating Purchase Invoice creation for ProjectId: {ProjectId}, TenantId: {TenantId}", model.ProjectId, tenantId); // 2. DATA VALIDATION (Fail-Fast Strategy) @@ -660,6 +701,13 @@ namespace Marco.Pms.Services.Service "The tenant identifier cannot be empty.", 400); } + // Check if user has permission + var manageInvoicesPermission = await HasPermissionAsync(PermissionsMaster.ManagePurchaseInvoice, loggedInEmployee.Id); + if (!manageInvoicesPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to update a purchase invoice", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to update a purchase invoice.", 403); + } _logger.LogInfo("Starting UpdatePurchaseInvoiceAsync. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", id, tenantId, loggedInEmployee.Id); @@ -896,6 +944,19 @@ namespace Marco.Pms.Services.Service try { + // Check if the employee has the necessary permissions + var viewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ViewAllPurchaseInvoice, loggedInEmployee.Id); + var viewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ViewSelfPurchaseInvoice, loggedInEmployee.Id); + + var viewAllPermission = await viewAllPermissionTask; + var viewSelfPermission = await viewSelfPermissionTask; + + if (!viewAllPermission && !viewSelfPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to view delivery challan list", loggedInEmployee.Id); + return ApiResponse>.ErrorResponse("You do not have permission to view delivery challan list.", "You do not have permission to view delivery challan list.", 403); + } + _logger.LogInfo("GetDeliveryChallans: Fetching challans. InvoiceId: {InvoiceId}, Tenant: {TenantId}", purchaseInvoiceId, tenantId); // 2. Optimized Validation @@ -973,6 +1034,14 @@ namespace Marco.Pms.Services.Service // Validate inputs before engaging expensive resources (DB/S3). if (model == null) throw new ArgumentNullException(nameof(model)); + // 2. Security Check + var addDeliveryChallanPermission = await HasPermissionAsync(PermissionsMaster.AddDeliveryChallan, loggedInEmployee.Id); + if (!addDeliveryChallanPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to add delivery challan", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have permission to add delivery challan.", "You do not have permission to add delivery challan.", 403); + } + // Extract Base64 Data safely var base64Data = model.Attachment.Base64Data?.Split(',').LastOrDefault(); if (string.IsNullOrWhiteSpace(base64Data)) @@ -996,7 +1065,7 @@ namespace Marco.Pms.Services.Service var attachmentId = Guid.NewGuid(); var deliveryChallanId = Guid.NewGuid(); - // 2. Database Read Operations (Scoped Context) + // 3. Database Read Operations (Scoped Context) // We use a factory to create a short-lived context. await using var context = await _dbContextFactory.CreateDbContextAsync(ct); @@ -1023,7 +1092,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Configuration Error", "System configuration for Delivery Challan is missing.", 500); } - // 3. External Service Call (S3 Upload) + // 4. External Service Call (S3 Upload) // We upload BEFORE the DB transaction. If this fails, we return error. // If DB fails later, we must compensate (delete this file). try @@ -1036,7 +1105,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Upload Failed", "Failed to upload the attachment to storage.", 502); } - // 4. Transactional Write Operations + // 5. Transactional Write Operations // Begin transaction for data consistency across multiple tables. await using var transaction = await context.Database.BeginTransactionAsync(ct); @@ -1089,7 +1158,7 @@ namespace Marco.Pms.Services.Service _logger.LogInfo("AddDeliveryChallan: Success. ChallanId: {ChallanId}, Tenant: {TenantId}", deliveryChallanId, tenantId); - // 5. Response Preparation + // 6. Response Preparation // Map response objects. Ensure the VM matches the generic return type. var response = _mapper.Map(deliveryChallan); @@ -1112,7 +1181,7 @@ namespace Marco.Pms.Services.Service } catch (Exception ex) { - // 6. Rollback & Compensation + // 7. Rollback & Compensation await transaction.RollbackAsync(ct); _logger.LogError(ex, "AddDeliveryChallan: Database transaction failed. Rolling back. Tenant: {TenantId}", tenantId); @@ -1162,6 +1231,19 @@ namespace Marco.Pms.Services.Service try { + // Check if the employee has the necessary permissions + var viewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ViewAllPurchaseInvoice, loggedInEmployee.Id); + var viewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ViewSelfPurchaseInvoice, loggedInEmployee.Id); + + var viewAllPermission = await viewAllPermissionTask; + var viewSelfPermission = await viewSelfPermissionTask; + + if (!viewAllPermission && !viewSelfPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to view purchase invoice payment history list", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("You do not have permission to view purchase invoice payment history list.", "You do not have permission to view purchase invoice payment history list.", 403); + } + // Create a short-lived DbContext instance via factory for this operation. await using var context = await _dbContextFactory.CreateDbContextAsync(ct); @@ -1247,6 +1329,14 @@ namespace Marco.Pms.Services.Service try { + // Check permissions + var manageInvoicesPermission = await HasPermissionAsync(PermissionsMaster.ManagePurchaseInvoice, loggedInEmployee.Id); + if (!manageInvoicesPermission) + { + _logger.LogWarning("Access Denied: {EmployeeId} do not have permission to add payments to a purchase invoice", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to add payments to a purchase invoice", 403); + } + // Create a short-lived DbContext instance using the factory to ensure proper scope per operation. await using var context = await _dbContextFactory.CreateDbContextAsync(ct); @@ -1354,6 +1444,16 @@ namespace Marco.Pms.Services.Service #region =================================================================== Helper Functions =================================================================== + /// + /// Async permission check helper with scoped DI lifetime + /// + private async Task HasPermissionAsync(Guid permission, Guid employeeId) + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + return await permissionService.HasPermission(permission, employeeId); + } + public async Task GetPurchaseInvoiceByIdAsync(Guid id, Guid tenantId, CancellationToken ct = default) { await using var readContext = await _dbContextFactory.CreateDbContextAsync(ct); -- 2.43.0 From a4714d544060e8493573df28f8edaed9f50c575f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 12:37:35 +0530 Subject: [PATCH 20/58] Added an API to deactivate or activate the purchase invoice --- .../Controllers/PurchaseInvoiceController.cs | 20 ++- .../Service/PurchaseInvoiceService.cs | 163 +++++++++++++++++- .../IPurchaseInvoiceService.cs | 1 + 3 files changed, 180 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 87fd5bd..80b2d58 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -122,6 +122,24 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpDelete("delete/{id}")] + public async Task DeletePurchaseInvoice(Guid id, CancellationToken ct, [FromQuery] bool isActive = false) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _purchaseInvoiceService.DeletePurchaseInvoiceAsync(id, isActive, loggedInEmployee, tenantId, ct); + if (response.Success) + { + var notification = new + { + LoggedInUserId = loggedInEmployee.Id, + Keyword = "Purchase_Invoice", + Response = response.Data + }; + await _signalR.SendNotificationAsync(notification); + } + return StatusCode(response.StatusCode, response); + } + #endregion #region =================================================================== Delivery Challan Functions =================================================================== @@ -186,7 +204,7 @@ namespace Marco.Pms.Services.Controllers var notification = new { LoggedInUserId = loggedInEmployee.Id, - Keyword = "Delivery_Challan", + Keyword = "Purchase_Invoice_Payment", Response = response.Data }; await _signalR.SendNotificationAsync(notification); diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index d0f7ab4..34b618c 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -340,7 +340,7 @@ namespace Marco.Pms.Services.Service .FirstOrDefaultAsync(ct); // 3. Validation: Handle Not Found immediately - if (purchaseInvoice == null || !purchaseInvoice.IsActive) + if (purchaseInvoice == null) { _logger.LogWarning("Purchase Invoice not found or inactive. InvoiceId: {InvoiceId}", id); return ApiResponse.ErrorResponse("Purchase invoice not found", "The specified purchase invoice does not exist or has been deleted.", 404); @@ -930,7 +930,164 @@ namespace Marco.Pms.Services.Service } } - //public async Task DeletePurchaseInvoiceAsync(Guid id, Guid tenantId, CancellationToken ct = default) + public async Task> DeletePurchaseInvoice(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // Check if the employee has the necessary permissions + var deletePermission = await HasPermissionAsync(PermissionsMaster.DeletePurchaseInvoice, loggedInEmployee.Id); + if (!deletePermission) + { + _logger.LogWarning("DeletePurchaseInvoiceAsync failed: EmployeeId {EmployeeId} does not have permission.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Permission denied", "You do not have permission to delete this invoice.", 403); + } + + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + var purchaseInvoice = await context.PurchaseInvoiceDetails.FirstOrDefaultAsync(x => x.Id == id && x.TenantId == tenantId, ct); + if (purchaseInvoice == null) + { + _logger.LogWarning("DeletePurchaseInvoiceAsync failed: InvoiceId {InvoiceId} not found.", id); + return ApiResponse.ErrorResponse("Invoice not found", "The invoice with the specified ID was not found.", 404); + } + + using var scope = _serviceScopeFactory.CreateScope(); + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + var existingEntityBson = updateLogHelper.EntityToBsonDocument(purchaseInvoice); + + purchaseInvoice.IsActive = isActive; + + await context.SaveChangesAsync(ct); + + await updateLogHelper.PushToUpdateLogsAsync( + new UpdateLogsObject + { + EntityId = id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, + "PurchaseInvoiceModificationLog"); + + return ApiResponse.SuccessResponse(new { }, "Invoice deleted successfully.", 200); + } + + /// + /// Soft-deletes or restores a Purchase Invoice by toggling its active flag, + /// with permission checks, audit logging, and structured logging suitable + /// for enterprise-grade observability. + /// + /// The Purchase Invoice identifier. + /// + /// Indicates the new active state: + /// false = mark as deleted/inactive (soft delete), + /// true = restore/reactivate. + /// + /// The currently logged-in employee performing the operation. + /// Tenant identifier to enforce multi-tenant isolation. + /// Cancellation token for cooperative cancellation. + /// + /// Standardized with operation result or error details. + /// + public async Task> DeletePurchaseInvoiceAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId, CancellationToken ct) + { + // Guard clause: validate invoice identifier. + if (id == Guid.Empty) + { + _logger.LogWarning("DeletePurchaseInvoiceAsync called with empty InvoiceId. TenantId: {TenantId}, EmployeeId: {EmployeeId}", tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Invoice reference is required.", "DeletePurchaseInvoiceAsync received an empty invoice Id.", 400); + } + + try + { + // Step 1: Permission check for the current employee. + var hasDeletePermission = await HasPermissionAsync(PermissionsMaster.DeletePurchaseInvoice, loggedInEmployee.Id); + + if (!hasDeletePermission) + { + _logger.LogWarning("DeletePurchaseInvoiceAsync permission denied. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("You do not have permission to modify this invoice.", "DeletePurchaseInvoiceAsync failed due to missing DeletePurchaseInvoice permission.", + 403); + } + + // Step 2: Create a short-lived DbContext for this operation. + await using var context = await _dbContextFactory.CreateDbContextAsync(ct); + + // Step 3: Retrieve the invoice scoped to the current tenant. + var purchaseInvoice = await context.PurchaseInvoiceDetails + .FirstOrDefaultAsync(x => x.Id == id && x.TenantId == tenantId, ct); + + if (purchaseInvoice == null) + { + _logger.LogWarning( + "DeletePurchaseInvoiceAsync failed: Invoice not found. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + + return ApiResponse.ErrorResponse("Invoice not found.", $"Purchase invoice not found for Id: {id}, TenantId: {tenantId}.", 404); + } + + // Step 4: Create a scoped helper for MongoDB update logs/audit trail. + using var scope = _serviceScopeFactory.CreateScope(); + var updateLogHelper = scope.ServiceProvider.GetRequiredService(); + + // Capture the existing state for audit logging before modification. + var existingEntityBson = updateLogHelper.EntityToBsonDocument(purchaseInvoice); + + // Step 5: Apply the soft-delete or restore operation. + purchaseInvoice.IsActive = isActive; + + // Persist changes with cancellation support. + var rowsAffected = await context.SaveChangesAsync(ct); + + if (rowsAffected <= 0) + { + _logger.LogError(null, "DeletePurchaseInvoiceAsync failed to persist changes. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Failed to update the invoice status.", "DeletePurchaseInvoiceAsync SaveChangesAsync returned 0 rows affected.", 500); + } + + // Step 6: Push audit log to MongoDB (non-critical but important for traceability). + await updateLogHelper.PushToUpdateLogsAsync( + new UpdateLogsObject + { + EntityId = id.ToString(), + UpdatedById = loggedInEmployee.Id.ToString(), + OldObject = existingEntityBson, + UpdatedAt = DateTime.UtcNow + }, + "PurchaseInvoiceModificationLog"); + + _logger.LogInfo("DeletePurchaseInvoiceAsync completed successfully. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}, NewIsActive: {IsActive}", + id, tenantId, loggedInEmployee.Id, isActive); + + var action = isActive ? "restored" : "deleted"; + + return ApiResponse.SuccessResponse(new { InvoiceId = id, IsActive = isActive }, $"Invoice has been {action} successfully.", 200); + } + catch (OperationCanceledException) + { + // Explicit cancellation handling to avoid misclassification as an error. + _logger.LogError(null, "DeletePurchaseInvoiceAsync operation was canceled. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("The operation was canceled.", "DeletePurchaseInvoiceAsync was canceled by the caller.", 499); + } + catch (DbUpdateException dbEx) + { + // Database-related error with structured logging. + _logger.LogError(dbEx, "Database update error in DeletePurchaseInvoiceAsync. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("An error occurred while updating the invoice.", "Database update exception occurred in DeletePurchaseInvoiceAsync.", 500); + } + catch (Exception ex) + { + // Catch-all for any unexpected failures. + _logger.LogError(ex, "Unexpected error in DeletePurchaseInvoiceAsync. InvoiceId: {InvoiceId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", + id, tenantId, loggedInEmployee.Id); + return ApiResponse.ErrorResponse("An unexpected error occurred while updating the invoice status.", "Unhandled exception in DeletePurchaseInvoiceAsync.", 500); + } + } + #endregion @@ -1073,7 +1230,7 @@ namespace Marco.Pms.Services.Service // Note: We project only what we need or map later to avoid EF translation issues with complex Mappers. var purchaseInvoiceEntity = await context.PurchaseInvoiceDetails .AsNoTracking() - .FirstOrDefaultAsync(pid => pid.Id == model.PurchaseInvoiceId && pid.IsActive && pid.TenantId == tenantId, ct); + .FirstOrDefaultAsync(pid => pid.Id == model.PurchaseInvoiceId && pid.TenantId == tenantId, ct); if (purchaseInvoiceEntity == null) { diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs index a1e2e9c..eeba2a5 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IPurchaseInvoiceService.cs @@ -15,6 +15,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetPurchaseInvoiceDetailsAsync(Guid id, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> CreatePurchaseInvoiceAsync(PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); Task> UpdatePurchaseInvoiceAsync(Guid id, PurchaseInvoiceDetails purchaseInvoice, PurchaseInvoiceDto model, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); + Task> DeletePurchaseInvoiceAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId, CancellationToken ct); #endregion -- 2.43.0 From 638d9faf1f63e442f3e54718fec534f65796a8f1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 16:46:39 +0530 Subject: [PATCH 21/58] Added encryption filter in collection controller --- .../Controllers/CollectionController.cs | 6 +- .../Extensions/EncryptResponseAttribute.cs | 99 +++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs diff --git a/Marco.Pms.Services/Controllers/CollectionController.cs b/Marco.Pms.Services/Controllers/CollectionController.cs index 61b18b4..ab6f8c1 100644 --- a/Marco.Pms.Services/Controllers/CollectionController.cs +++ b/Marco.Pms.Services/Controllers/CollectionController.cs @@ -28,9 +28,11 @@ using Invoice = Marco.Pms.Model.Collection.Invoice; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] + public class CollectionController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs new file mode 100644 index 0000000..ad6a580 --- /dev/null +++ b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs @@ -0,0 +1,99 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using System.Security.Cryptography; + +public class EncryptResponseAttribute : TypeFilterAttribute +{ + public EncryptResponseAttribute() : base(typeof(EncryptResponseFilter)) + { + } + + private class EncryptResponseFilter : IAsyncResultFilter + { + // 32-byte Key + private readonly string _keyBase64 = "h9J4kL2mN5pQ8rS1tV3wX6yZ0aB7cD9eF1gH3jK5mN6="; + + public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) + { + // 1. EXECUTE THE CONTROLLER FIRST + // We let the controller run to populate context.Result + // Note: We are intercepting *before* the response goes to the client. + + try + { + if (context.Result is ObjectResult objectResult && objectResult.Value != null) + { + // 2. SERIALIZE (Safe Settings) + var settings = new JsonSerializerSettings + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + NullValueHandling = NullValueHandling.Ignore + }; + + var plainJson = JsonConvert.SerializeObject(objectResult.Value, settings); + + // 3. ENCRYPT ASYNC (Prevents Thread Blocking 502) + var encryptedText = await EncryptAsync(plainJson); + + // 4. RETURN CONTENT RESULT + // Use ContentResult to send raw text. + // OkObjectResult would try to JSON-serialize the string again (adding quotes). + context.Result = new ContentResult + { + Content = encryptedText, + ContentType = "text/plain", + StatusCode = 200 + }; + } + } + catch (Exception ex) + { + // FAIL-SAFE LOGGING + Console.WriteLine($"Encryption Crashed: {ex.Message}"); + // We do NOT modify context.Result here. + // The original unencrypted ObjectResult will flow through to the client. + // This ensures the user gets DATA, not a 502. + } + + await next(); + } + + private async Task EncryptAsync(string plainText) + { + if (string.IsNullOrEmpty(plainText)) return plainText; + + using var aes = Aes.Create(); + aes.Key = Convert.FromBase64String(_keyBase64); + aes.GenerateIV(); + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.PKCS7; + + // We do NOT use 'using' on the MemoryStream here yet, + // because we need to read from it after the CryptoStream finishes. + using var ms = new MemoryStream(); + + // Write IV first (16 bytes) + ms.Write(aes.IV, 0, aes.IV.Length); + + using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV)) + using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) + using (var sw = new StreamWriter(cs)) + { + // CRITICAL FIX: Use Async Write + await sw.WriteAsync(plainText); + + // Flush the writer, but do not close the underlying streams yet via 'using' exit + await sw.FlushAsync(); + } + + // At this point, CryptoStream is closed (disposed by using block), + // causing the final block to be flushed to MemoryStream. + // MemoryStream is technically closed, but .NET allows ToArray() on closed MemoryStreams. + + return Convert.ToBase64String(ms.ToArray()); + } + } +} \ No newline at end of file -- 2.43.0 From e1ca7e6152a83e03ea4641f113465116f05c187f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 16:53:24 +0530 Subject: [PATCH 22/58] Added response filter in all controllers --- Marco.Pms.Services/Controllers/AppMenuController.cs | 1 + Marco.Pms.Services/Controllers/AttendanceController.cs | 1 + Marco.Pms.Services/Controllers/AuthController.cs | 1 + Marco.Pms.Services/Controllers/DashboardController.cs | 3 ++- Marco.Pms.Services/Controllers/DirectoryController.cs | 5 +++-- Marco.Pms.Services/Controllers/DocumentController.cs | 5 +++-- Marco.Pms.Services/Controllers/EmployeeController.cs | 5 +++-- Marco.Pms.Services/Controllers/ExpenseController.cs | 5 +++-- Marco.Pms.Services/Controllers/FeatureController.cs | 5 +++-- Marco.Pms.Services/Controllers/FileController.cs | 3 ++- Marco.Pms.Services/Controllers/ForumController.cs | 1 + Marco.Pms.Services/Controllers/ImageController.cs | 5 +++-- Marco.Pms.Services/Controllers/LogController.cs | 3 ++- Marco.Pms.Services/Controllers/MarketController.cs | 3 ++- Marco.Pms.Services/Controllers/MasterController.cs | 3 ++- Marco.Pms.Services/Controllers/OrganizationController.cs | 5 +++-- Marco.Pms.Services/Controllers/PaymentController.cs | 3 ++- Marco.Pms.Services/Controllers/ProjectController.cs | 5 +++-- Marco.Pms.Services/Controllers/ReportController.cs | 5 +++-- Marco.Pms.Services/Controllers/RolesController.cs | 5 +++-- Marco.Pms.Services/Controllers/ServiceProjectController.cs | 5 +++-- Marco.Pms.Services/Controllers/TaskController.cs | 5 +++-- Marco.Pms.Services/Controllers/TenantController.cs | 5 +++-- Marco.Pms.Services/Controllers/UserController.cs | 5 +++-- 24 files changed, 58 insertions(+), 34 deletions(-) diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 81b749c..276bf5a 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -17,6 +17,7 @@ namespace Marco.Pms.Services.Controllers { [Authorize] [ApiController] + [EncryptResponse] [Route("api/[controller]")] public class AppMenuController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 2c90522..65253cc 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -26,6 +26,7 @@ namespace MarcoBMS.Services.Controllers { [Authorize] [ApiController] + [EncryptResponse] [Route("api/[controller]")] public class AttendanceController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/AuthController.cs b/Marco.Pms.Services/Controllers/AuthController.cs index a9801e3..3d70c1f 100644 --- a/Marco.Pms.Services/Controllers/AuthController.cs +++ b/Marco.Pms.Services/Controllers/AuthController.cs @@ -22,6 +22,7 @@ using System.Text; namespace MarcoBMS.Services.Controllers { [ApiController] + [EncryptResponse] [Route("api/[controller]")] public class AuthController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index eee93bd..14e8e3c 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -16,8 +16,9 @@ using System.Globalization; namespace Marco.Pms.Services.Controllers { [Authorize] - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class DashboardController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/DirectoryController.cs b/Marco.Pms.Services/Controllers/DirectoryController.cs index e84adb6..cfaa8e8 100644 --- a/Marco.Pms.Services/Controllers/DirectoryController.cs +++ b/Marco.Pms.Services/Controllers/DirectoryController.cs @@ -7,9 +7,10 @@ using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { - [ApiController] - [Route("api/[controller]")] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class DirectoryController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 4fdb588..f59b61b 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -24,9 +24,10 @@ using Document = Marco.Pms.Model.DocumentManager.Document; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class DocumentController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 15da5d4..d6a53de 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -26,9 +26,10 @@ using System.Net; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class EmployeeController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index c3196a0..f253602 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -7,9 +7,10 @@ using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class ExpenseController : ControllerBase { private readonly UserHelper _userHelper; diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index 05ded40..91433b4 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -11,9 +11,10 @@ using Microsoft.EntityFrameworkCore; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] + [Authorize] [ApiController] - // [Authorize] + [EncryptResponse] + [Route("api/[controller]")] public class FeatureController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/FileController.cs b/Marco.Pms.Services/Controllers/FileController.cs index ac8282a..b415770 100644 --- a/Marco.Pms.Services/Controllers/FileController.cs +++ b/Marco.Pms.Services/Controllers/FileController.cs @@ -4,8 +4,9 @@ using Microsoft.AspNetCore.Mvc; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class FileController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/ForumController.cs b/Marco.Pms.Services/Controllers/ForumController.cs index 4e3b948..63ae816 100644 --- a/Marco.Pms.Services/Controllers/ForumController.cs +++ b/Marco.Pms.Services/Controllers/ForumController.cs @@ -19,6 +19,7 @@ namespace Marco.Pms.Services.Controllers { [Authorize] [ApiController] + [EncryptResponse] [Route("api/[controller]")] public class ForumController : ControllerBase { diff --git a/Marco.Pms.Services/Controllers/ImageController.cs b/Marco.Pms.Services/Controllers/ImageController.cs index 0cb1c95..1a3aedb 100644 --- a/Marco.Pms.Services/Controllers/ImageController.cs +++ b/Marco.Pms.Services/Controllers/ImageController.cs @@ -18,9 +18,10 @@ using System.Text.Json; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class ImageController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/LogController.cs b/Marco.Pms.Services/Controllers/LogController.cs index c206d0b..58baa6b 100644 --- a/Marco.Pms.Services/Controllers/LogController.cs +++ b/Marco.Pms.Services/Controllers/LogController.cs @@ -8,8 +8,9 @@ using System.Text.Json; namespace Marco.Pms.Services.Controllers { [Authorize] - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class LogController : ControllerBase { private readonly ILogger _logger; diff --git a/Marco.Pms.Services/Controllers/MarketController.cs b/Marco.Pms.Services/Controllers/MarketController.cs index e6065c0..290266e 100644 --- a/Marco.Pms.Services/Controllers/MarketController.cs +++ b/Marco.Pms.Services/Controllers/MarketController.cs @@ -14,8 +14,9 @@ using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class MarketController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 8668ee3..84ecbb6 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -20,8 +20,9 @@ using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Controllers { [Authorize] - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class MasterController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/OrganizationController.cs b/Marco.Pms.Services/Controllers/OrganizationController.cs index 80a8847..d4a8a36 100644 --- a/Marco.Pms.Services/Controllers/OrganizationController.cs +++ b/Marco.Pms.Services/Controllers/OrganizationController.cs @@ -8,9 +8,10 @@ using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class OrganizationController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/PaymentController.cs b/Marco.Pms.Services/Controllers/PaymentController.cs index 9671800..9ab2a5e 100644 --- a/Marco.Pms.Services/Controllers/PaymentController.cs +++ b/Marco.Pms.Services/Controllers/PaymentController.cs @@ -7,8 +7,9 @@ using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class PaymentController : ControllerBase { private readonly UserHelper _userHelper; diff --git a/Marco.Pms.Services/Controllers/ProjectController.cs b/Marco.Pms.Services/Controllers/ProjectController.cs index 9b49119..b9f9bcc 100644 --- a/Marco.Pms.Services/Controllers/ProjectController.cs +++ b/Marco.Pms.Services/Controllers/ProjectController.cs @@ -13,9 +13,10 @@ using MongoDB.Driver; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class ProjectController : ControllerBase { private readonly IProjectServices _projectServices; diff --git a/Marco.Pms.Services/Controllers/ReportController.cs b/Marco.Pms.Services/Controllers/ReportController.cs index bb1a68b..5d33e9f 100644 --- a/Marco.Pms.Services/Controllers/ReportController.cs +++ b/Marco.Pms.Services/Controllers/ReportController.cs @@ -17,9 +17,10 @@ using System.Net.Mail; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class ReportController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/RolesController.cs b/Marco.Pms.Services/Controllers/RolesController.cs index b0db8ab..6be04f9 100644 --- a/Marco.Pms.Services/Controllers/RolesController.cs +++ b/Marco.Pms.Services/Controllers/RolesController.cs @@ -20,9 +20,10 @@ using System.Data; #nullable disable namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class RolesController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/ServiceProjectController.cs b/Marco.Pms.Services/Controllers/ServiceProjectController.cs index 8c56826..910f759 100644 --- a/Marco.Pms.Services/Controllers/ServiceProjectController.cs +++ b/Marco.Pms.Services/Controllers/ServiceProjectController.cs @@ -10,9 +10,10 @@ using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { - [ApiController] - [Route("api/[controller]")] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class ServiceProjectController : Controller { private readonly IServiceProject _serviceProject; diff --git a/Marco.Pms.Services/Controllers/TaskController.cs b/Marco.Pms.Services/Controllers/TaskController.cs index c6a96b3..5fb79e1 100644 --- a/Marco.Pms.Services/Controllers/TaskController.cs +++ b/Marco.Pms.Services/Controllers/TaskController.cs @@ -24,9 +24,10 @@ using Document = Marco.Pms.Model.DocumentManager.Document; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class TaskController : ControllerBase { private readonly ApplicationDbContext _context; diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 6f8f130..0cb0eb2 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -30,9 +30,10 @@ using System.Text.Json; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class TenantController : ControllerBase { private readonly IDbContextFactory _dbContextFactory; diff --git a/Marco.Pms.Services/Controllers/UserController.cs b/Marco.Pms.Services/Controllers/UserController.cs index 8db84a6..484b3e1 100644 --- a/Marco.Pms.Services/Controllers/UserController.cs +++ b/Marco.Pms.Services/Controllers/UserController.cs @@ -14,9 +14,10 @@ using System.Net.Mail; namespace MarcoBMS.Services.Controllers { - [Route("api/[controller]")] - [ApiController] [Authorize] + [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class UserController : ControllerBase { -- 2.43.0 From 4282a6e1f756b38857f28f9d3ce4812aea3d6641 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 1 Dec 2025 16:58:00 +0530 Subject: [PATCH 23/58] Solved the authorize not found error --- Marco.Pms.Services/Controllers/FeatureController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Marco.Pms.Services/Controllers/FeatureController.cs b/Marco.Pms.Services/Controllers/FeatureController.cs index 91433b4..a5ffa22 100644 --- a/Marco.Pms.Services/Controllers/FeatureController.cs +++ b/Marco.Pms.Services/Controllers/FeatureController.cs @@ -6,6 +6,7 @@ using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Services.Helpers; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; -- 2.43.0 From 5d8a5e0cc8f750f6bd99a3db421483a8be9157c5 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Dec 2025 11:13:41 +0530 Subject: [PATCH 24/58] Added an API to get todays attendance record for current logged-in-employee --- ...VM.cs => DashBoardEmployeeAttendanceVM.cs} | 2 +- .../DashBoard/ProjectAttendanceVM.cs | 2 +- .../Controllers/AppMenuController.cs | 7 + .../Controllers/DashboardController.cs | 138 +++++++++++++++++- 4 files changed, 143 insertions(+), 6 deletions(-) rename Marco.Pms.Model/ViewModels/DashBoard/{EmployeeAttendanceVM.cs => DashBoardEmployeeAttendanceVM.cs} (88%) diff --git a/Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs b/Marco.Pms.Model/ViewModels/DashBoard/DashBoardEmployeeAttendanceVM.cs similarity index 88% rename from Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs rename to Marco.Pms.Model/ViewModels/DashBoard/DashBoardEmployeeAttendanceVM.cs index 7d0629e..7bca043 100644 --- a/Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs +++ b/Marco.Pms.Model/ViewModels/DashBoard/DashBoardEmployeeAttendanceVM.cs @@ -1,6 +1,6 @@ namespace Marco.Pms.Model.ViewModels.DashBoard { - public class EmployeeAttendanceVM + public class DashBoardEmployeeAttendanceVM { public string? FirstName { get; set; } public string? LastName { get; set; } diff --git a/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs index 12d61ec..bf7fd4e 100644 --- a/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs +++ b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs @@ -2,7 +2,7 @@ { public class ProjectAttendanceVM { - public List? AttendanceTable { get; set; } + public List? AttendanceTable { get; set; } public int CheckedInEmployee { get; set; } public int AssignedEmployee { get; set; } } diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 81b749c..82b122f 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -832,6 +832,13 @@ namespace Marco.Pms.Services.Controllers Available = true, MobileLink = "/dashboard/service-projects" }); + response.Add(new MenuSectionApplicationVM + { + Id = Guid.Parse("5fab4b88-c9a0-417b-aca2-130980fdb0cf"), + Name = "Infra Projects", + Available = true, + MobileLink = "/dashboard/infra-projects" + }); // Step 3: Log success response = response.Where(ms => !string.IsNullOrWhiteSpace(ms.MobileLink)).ToList(); diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index eee93bd..30f8345 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1,8 +1,11 @@ -using Marco.Pms.DataAccess.Data; +using AutoMapper; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.AttendanceVM; using Marco.Pms.Model.ViewModels.DashBoard; using Marco.Pms.Services.Service; using Marco.Pms.Services.Service.ServiceInterfaces; @@ -26,6 +29,9 @@ namespace Marco.Pms.Services.Controllers private readonly ILoggingService _logger; private readonly PermissionServices _permissionServices; private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly IMapper _mapper; + + public static readonly Guid ActiveId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); private static readonly Guid Review = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"); @@ -40,7 +46,8 @@ namespace Marco.Pms.Services.Controllers IProjectServices projectServices, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, - PermissionServices permissionServices) + PermissionServices permissionServices, + IMapper mapper) { _context = context; _userHelper = userHelper; @@ -48,8 +55,10 @@ namespace Marco.Pms.Services.Controllers _logger = logger; _serviceScopeFactory = serviceScopeFactory; _permissionServices = permissionServices; + _mapper = mapper; tenantId = userHelper.GetTenantId(); } + /// /// Fetches project progression data (planned and completed tasks) in graph form for a tenant and specified (or all) projects over a date range. /// @@ -499,7 +508,7 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse( new ProjectAttendanceVM { - AttendanceTable = new List(), + AttendanceTable = new List(), CheckedInEmployee = 0, AssignedEmployee = 0 }, @@ -523,7 +532,7 @@ namespace Marco.Pms.Services.Controllers .Join(employees, attendance => attendance.EmployeeId, employee => employee.Id, - (attendance, employee) => new EmployeeAttendanceVM + (attendance, employee) => new DashBoardEmployeeAttendanceVM { FirstName = employee.FirstName, LastName = employee.LastName, @@ -1074,5 +1083,126 @@ namespace Marco.Pms.Services.Controllers ApiResponse.ErrorResponse("An error occurred while fetching pending expenses.", "An error occurred while fetching pending expenses.", 500)); // [Error Response] } } + + /// + /// Retrieves today's attendance details for a specific employee on a given project, + /// defaulting to the currently logged-in employee when no employeeId is provided. + /// Includes related project and employee information for UI display. + /// + /// The project identifier whose attendance is requested. + /// + /// Optional employee identifier. When null, the currently logged-in employee is used. + /// + /// + /// 200 OK with an payload on success, or a standardized + /// error envelope on validation or processing failure. + /// + [HttpGet("get/attendance/employee/{projectId}")] + public async Task GetAttendanceByEmployeeAsync(Guid projectId, [FromQuery] Guid? employeeId) + { + // TenantId is assumed to come from a base controller, HttpContext, or similar. + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetAttendanceByEmployeeAsync called with empty TenantId. ProjectId={ProjectId}", projectId); + + return BadRequest( + ApiResponse.ErrorResponse("Invalid tenant information.", "TenantId is empty in GetAttendanceByEmployeeAsync.", 400)); + } + + if (projectId == Guid.Empty) + { + _logger.LogWarning("GetAttendanceByEmployeeAsync called with empty ProjectId. TenantId={TenantId}", tenantId); + + return BadRequest( + ApiResponse.ErrorResponse("Project reference is required.", "ProjectId is empty in GetAttendanceByEmployeeAsync.", 400)); + } + + // Resolve the currently logged-in employee (e.g., from token or session). + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var attendanceEmployeeId = employeeId ?? loggedInEmployee.Id; + + try + { + + // Step 1: Ensure employee is allocated to the project for this tenant. + var projectAllocation = await _context.ProjectAllocations + .Include(pa => pa.Employee)!.ThenInclude(e => e.JobRole) + .Include(pa => pa.Employee)!.ThenInclude(e => e.Organization) + .Include(pa => pa.Project) + .FirstOrDefaultAsync(pa => + pa.ProjectId == projectId && + pa.EmployeeId == attendanceEmployeeId && + pa.IsActive && + pa.TenantId == tenantId); + + if (projectAllocation == null) + { + _logger.LogWarning( + "GetAttendanceByEmployeeAsync failed: Employee not allocated to project. TenantId={TenantId}, ProjectId={ProjectId}, EmployeeId={EmployeeId}, RequestedById={RequestedById}", + tenantId, projectId, attendanceEmployeeId, loggedInEmployee.Id); + + return BadRequest(ApiResponse.ErrorResponse("The employee is not allocated to the selected project.", "Project allocation not found for given ProjectId, EmployeeId, and TenantId.", + 400)); + } + + // Step 2: Fetch today's attendance (if any) for the selected employee and project. + var today = DateTime.UtcNow.Date; // Prefer UTC for server-side comparisons. + + var attendance = await _context.Attendes + .Include(a => a.Approver) + .Include(a => a.RequestedBy) + .FirstOrDefaultAsync(a => + a.TenantId == tenantId && + a.EmployeeId == attendanceEmployeeId && + a.ProjectID == projectId && + a.AttendanceDate.Date == today); + + // Step 3: Map to view model with defensive null handling. + var attendanceVm = new EmployeeAttendanceVM + { + Id = attendance?.Id ?? Guid.Empty, + EmployeeAvatar = null, // Can be filled from a file service or CDN later. + EmployeeId = projectAllocation.EmployeeId, + FirstName = projectAllocation.Employee?.FirstName, + OrganizationName = projectAllocation.Employee?.Organization?.Name, + LastName = projectAllocation.Employee?.LastName, + JobRoleName = projectAllocation.Employee?.JobRole?.Name, + ProjectId = projectId, + ProjectName = projectAllocation.Project?.Name, + CheckInTime = attendance?.InTime, + CheckOutTime = attendance?.OutTime, + Activity = attendance?.Activity ?? ATTENDANCE_MARK_TYPE.CHECK_IN, + ApprovedAt = attendance?.ApprovedAt, + Approver = attendance == null + ? null + : _mapper.Map(attendance.Approver), + RequestedAt = attendance?.RequestedAt, + RequestedBy = attendance == null + ? null + : _mapper.Map(attendance.RequestedBy) + }; + + _logger.LogInfo("GetAttendanceByEmployeeAsync completed successfully. TenantId={TenantId}, ProjectId={ProjectId}, EmployeeId={EmployeeId}, HasAttendance={HasAttendance}", + tenantId, projectId, attendanceEmployeeId, attendance != null); + + return Ok(ApiResponse.SuccessResponse(attendanceVm, "Attendance fetched successfully.", 200)); + } + catch (OperationCanceledException) + { + _logger.LogWarning("GetAttendanceByEmployeeAsync was canceled. TenantId={TenantId}, ProjectId={ProjectId}, EmployeeId={EmployeeId}", + tenantId, projectId, attendanceEmployeeId); + + return StatusCode(499, ApiResponse.ErrorResponse("The request was canceled.", "GetAttendanceByEmployeeAsync was canceled by the client.", 499)); + } + catch (Exception ex) + { + _logger.LogError(ex, "GetAttendanceByEmployeeAsync failed with an unexpected error. TenantId={TenantId}, ProjectId={ProjectId}, EmployeeId={EmployeeId}", + tenantId, projectId, attendanceEmployeeId); + + return StatusCode(500, ApiResponse.ErrorResponse("An error occurred while fetching attendance.", "Unhandled exception in GetAttendanceByEmployeeAsync.", 500)); + } + } + } } -- 2.43.0 From 3caf944c50cd840e7f3f063e1571d58a5059e637 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Dec 2025 14:59:42 +0530 Subject: [PATCH 25/58] Added globle search in purchase invoices (title, UID) --- Marco.Pms.Services/Service/PurchaseInvoiceService.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 34b618c..6e138b0 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -232,6 +232,11 @@ namespace Marco.Pms.Services.Service query = query.Where(pid => projectIds.Contains(pid.ProjectId)); } + if (!string.IsNullOrWhiteSpace(searchString)) + { + query = query.Where(pid => pid.Title.Contains(searchString) || + (pid.UIDPrefix + "/" + pid.UIDPostfix.ToString().PadLeft(5, '0')).Contains(searchString)); + } // Compute total count before paging var totalCount = await query.CountAsync(ct); -- 2.43.0 From 447e915505d5499d28355b3b166ee949632f7a5e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 3 Dec 2025 15:43:14 +0530 Subject: [PATCH 26/58] Added proforma related information in purchase inovice list VM --- .../ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs index ba8ef19..cc2888d 100644 --- a/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs +++ b/Marco.Pms.Model/ViewModels/PurchaseInvoice/PurchaseInvoiceListVM.cs @@ -10,6 +10,9 @@ namespace Marco.Pms.Model.ViewModels.PurchaseInvoice public string? Title { get; set; } public string? Description { get; set; } public string? PurchaseInvoiceUId { get; set; } + public string? ProformaInvoiceNumber { get; set; } + public DateTime? ProformaInvoiceDate { get; set; } + public double? ProformaInvoiceAmount { get; set; } public BasicProjectVM? Project { get; set; } public BasicOrganizationVm? Supplier { get; set; } public PurchaseInvoiceStatus? Status { get; set; } -- 2.43.0 From 1a3c030495682f49ebcfdd2b92e9802dc4d92c5a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Dec 2025 10:02:01 +0530 Subject: [PATCH 27/58] Added proform amount check in add payment API --- Marco.Pms.Services/Service/PurchaseInvoiceService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index 6e138b0..f973b75 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -1535,8 +1535,8 @@ namespace Marco.Pms.Services.Service var alreadyPaidAmount = existingPayments.Sum(pi => pi.Amount); var proposedTotalPaidAmount = alreadyPaidAmount + model.Amount; - - if (proposedTotalPaidAmount > purchaseInvoice.TotalAmount) + bool proformaCheck = purchaseInvoice.ProformaInvoiceAmount.HasValue ? proposedTotalPaidAmount > purchaseInvoice.ProformaInvoiceAmount : true; + if (proposedTotalPaidAmount > purchaseInvoice.TotalAmount && proformaCheck) { _logger.LogWarning("Attempt to add payment exceeding invoice total. InvoiceId: {InvoiceId}, TenantId: {TenantId}, InvoiceTotal: {InvoiceTotal}, AlreadyPaid: {AlreadyPaid}, NewAmount: {NewAmount}, ProposedTotal: {ProposedTotal}", model.InvoiceId, tenantId, purchaseInvoice.TotalAmount, alreadyPaidAmount, model.Amount, proposedTotalPaidAmount); -- 2.43.0 From aa604f4d9eeafbf7e58904755c40b38e4873964a Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Dec 2025 12:12:20 +0530 Subject: [PATCH 28/58] Added the job progression API --- .../Controllers/DashboardController.cs | 165 +++++++++++------- 1 file changed, 99 insertions(+), 66 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index edccc51..4066166 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -2,6 +2,7 @@ using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.DashBoard; using Marco.Pms.Services.Service; @@ -1075,78 +1076,110 @@ namespace Marco.Pms.Services.Controllers } } - //[HttpGet("job/progression")] - //public async Task GetJobProgressionAsync([FromQuery] Guid? projectId) - //{ - // Guid AssignedStatus = Guid.Parse("cfa1886d-055f-4ded-84c6-42a2a8a14a66"); - // Guid InProgressStatus = Guid.Parse("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"); - // Guid ReviewDoneStatus = Guid.Parse("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"); - // Guid ClosedStatus = Guid.Parse("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"); + [HttpGet("job/progression")] + public async Task GetJobProgressionAsync([FromQuery] Guid? projectId) + { + Guid AssignedStatus = Guid.Parse("cfa1886d-055f-4ded-84c6-42a2a8a14a66"); + Guid InProgressStatus = Guid.Parse("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"); + Guid ReviewDoneStatus = Guid.Parse("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"); + Guid ClosedStatus = Guid.Parse("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"); - // if (tenantId == Guid.Empty) - // { - // _logger.LogWarning("Invalid request: TenantId is empty on progression endpoint"); - // return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "Provided Invalid TenantId", 400)); - // } + if (tenantId == Guid.Empty) + { + _logger.LogWarning("Invalid request: TenantId is empty on progression endpoint"); + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "Provided Invalid TenantId", 400)); + } - // var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - // var jobIds = await _context.JobEmployeeMappings - // .Where(jem => jem.AssigneeId == loggedInEmployee.Id && jem.TenantId == tenantId) - // .Select(jem => jem.JobTicketId) - // .ToListAsync(); + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var jobIds = await _context.JobEmployeeMappings + .Where(jem => jem.AssigneeId == loggedInEmployee.Id && jem.TenantId == tenantId) + .Select(jem => jem.JobTicketId) + .ToListAsync(); - // if (projectId.HasValue) - // { - // var hasPermission = await _permissionServices.HasServiceProjectPermission(loggedInEmployee.Id, projectId.Value); - // if (!hasPermission) - // { - // return StatusCode(403, - // ApiResponse.ErrorResponse("You do not have permission to access this resource", "You do not have permission to access this resource", 403)); - // } - // var jobs = await _context.JobTickets - // .Include(jt => jt.Project) - // .Include(jt => jt.CreatedBy).ThenInclude(e => e!.JobRole) - // .Where(jt => jt.ProjectId == projectId.Value - // && jt.StatusId != ReviewDoneStatus - // && jt.StatusId != ClosedStatus - // && jt.Project != null - // && jt.CreatedBy != null - // && jt.TenantId == tenantId) - // .ToListAsync(); + var query = _context.JobTickets + .Include(jt => jt.Project) + .Include(jt => jt.CreatedBy).ThenInclude(e => e!.JobRole) + .Where(jt => jt.StatusId != ReviewDoneStatus + && jt.StatusId != ClosedStatus + && jt.Project != null + && jt.CreatedBy != null + && jt.TenantId == tenantId); - // var inProgressJobIds = jobs.Where(jt => jt.StatusId == InProgressStatus).Select(jt => jt.Id).ToList(); + if (projectId.HasValue) + { + var hasPermission = await _permissionServices.HasServiceProjectPermission(loggedInEmployee.Id, projectId.Value); + if (!hasPermission) + { + return StatusCode(403, + ApiResponse.ErrorResponse("You do not have permission to access this resource", "You do not have permission to access this resource", 403)); + } + query = query.Where(jt => jt.ProjectId == projectId.Value); + } + var jobs = await query + .ToListAsync(); - // var latestTagIns = await _context.JobAttendance - // .Include(ja => ja.Employee) - // .Where(ja => inProgressJobIds.Contains(ja.JobTicketId) - // && ja.Action == TAGGING_MARK_TYPE.TAG_IN - // && ja.TaggedOutAt == null - // && ja.TenantId == tenantId) - // .GroupBy(ja => ja.JobTicketId) - // .Select(g => new - // { - // JobTicketId = g.Key, - // Employee = g.Select(ja => ja.Employee).FirstOrDefault(), - // TagInAt = g.Max(ja => ja.TaggedInAt) - // }) - // .ToListAsync(); + var inProgressJobIds = jobs.Where(jt => jt.StatusId == InProgressStatus).Select(jt => jt.Id).ToList(); - // var assignedJobs = jobs - // .Where(jt => jt.StatusId == AssignedStatus) - // .Take(5) - // .Select(jt => new - // { - // Project = jt.Project!.Name, - // AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, - // Title = jt.Title, - // AssignedAt = jt.CreatedAt, + var latestTagIns = await _context.JobAttendance + .Include(ja => ja.Employee) + .Where(ja => inProgressJobIds.Contains(ja.JobTicketId) + && ja.Action == TAGGING_MARK_TYPE.TAG_IN + && ja.TaggedOutAt == null + && ja.TenantId == tenantId) + .GroupBy(ja => ja.JobTicketId) + .Select(g => new + { + JobTicketId = g.Key, + Employee = g.Select(ja => ja.Employee).FirstOrDefault(), + TagInAt = g.Max(ja => ja.TaggedInAt) + }) + .ToListAsync(); - // }) - // .ToList(); - // var inProgressJobs = jobs.Where(jt => jt.StatusId == InProgressStatus).Take(5).ToList(); - // var selfAssignedJobs = jobs.Where(jt => jobIds.Contains(jt.Id)).Take(5).ToList(); - // } - // return Ok(); - //} + var assignedJobs = jobs + .Where(jt => jt.StatusId == AssignedStatus) + .Take(5) + .Select(jt => new + { + Project = jt.Project!.Name, + AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, + Title = jt.Title, + AssignedAt = jt.CreatedAt, + + }) + .ToList(); + var inProgressJobs = jobs + .Where(jt => jt.StatusId == InProgressStatus) + .Take(5) + .Select(jt => new + { + Project = jt.Project!.Name, + AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, + Title = jt.Title, + AssignedAt = jt.CreatedAt, + + }) + .ToList(); + var selfAssignedJobs = jobs + .Where(jt => jobIds.Contains(jt.Id)) + .Take(5) + .Select(jt => new + { + Project = jt.Project!.Name, + AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, + Title = jt.Title, + AssignedAt = jt.CreatedAt, + + }) + .ToList(); + + var response = new + { + AssignedJobs = assignedJobs, + InProgressJobs = inProgressJobs, + AllJobs = selfAssignedJobs + }; + + return Ok(ApiResponse.SuccessResponse(response, "job progression fetched successfully", 200)); + } } } -- 2.43.0 From 26ac59fa52c821970db2397234b4788b5595508c Mon Sep 17 00:00:00 2001 From: "pramod.mahajan" Date: Thu, 4 Dec 2025 13:03:16 +0530 Subject: [PATCH 29/58] changed msg if invoice-payment exceed to tax profoma amount --- Marco.Pms.Services/Service/PurchaseInvoiceService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs index f973b75..4be3475 100644 --- a/Marco.Pms.Services/Service/PurchaseInvoiceService.cs +++ b/Marco.Pms.Services/Service/PurchaseInvoiceService.cs @@ -1541,7 +1541,7 @@ namespace Marco.Pms.Services.Service _logger.LogWarning("Attempt to add payment exceeding invoice total. InvoiceId: {InvoiceId}, TenantId: {TenantId}, InvoiceTotal: {InvoiceTotal}, AlreadyPaid: {AlreadyPaid}, NewAmount: {NewAmount}, ProposedTotal: {ProposedTotal}", model.InvoiceId, tenantId, purchaseInvoice.TotalAmount, alreadyPaidAmount, model.Amount, proposedTotalPaidAmount); - return ApiResponse.ErrorResponse("Total payment amount cannot exceed the invoice amount.", "Payment addition rejected due to exceeding invoice total amount.", + return ApiResponse.ErrorResponse("Total payment amount cannot be exceed the Tax Invoice or Profoma Amount .", "Payment addition rejected due to exceeding Invoice / Profoma Total amount.", 400); } -- 2.43.0 From 0960702f0c8b853eab5bd824134fe6a507c8d421 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 4 Dec 2025 14:32:50 +0530 Subject: [PATCH 30/58] Added the new entites in invoice attachment type table --- .../Data/ApplicationDbContext.cs | 18 + ..._Invoice_Attachment_Type_Table.Designer.cs | 9484 +++++++++++++++++ ...823_Added_Invoice_Attachment_Type_Table.cs | 46 + .../ApplicationDbContextModelSnapshot.cs | 18 + .../Controllers/DashboardController.cs | 4 +- 5 files changed, 9568 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index a36b099..4dc5793 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -588,6 +588,24 @@ namespace Marco.Pms.DataAccess.Data Id = Guid.Parse("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), Name = "E-Invoice", Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code." + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("31cd7533-3ffc-4e84-a0b4-db3b94d016b2"), + Name = "Proforma Invoice", + Description = "Proforma Invoice" + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("060c79a4-81c7-40a4-8cc3-56362ac9fad6"), + Name = "Sales Order", + Description = "Sales Order" + }, + new InvoiceAttachmentType + { + Id = Guid.Parse("12773c2c-64e7-478c-af17-8471f943a5ed"), + Name = "Other", + Description = "Other" } ); diff --git a/Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.Designer.cs new file mode 100644 index 0000000..bda6707 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.Designer.cs @@ -0,0 +1,9484 @@ +// +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("20251204085823_Added_Invoice_Attachment_Type_Table")] + partial class Added_Invoice_Attachment_Type_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("ApprovedAt") + .HasColumnType("datetime(6)"); + + b.Property("ApprovedById") + .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("RequestedAt") + .HasColumnType("datetime(6)"); + + b.Property("RequestedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RequestedById"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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.Collection.Invoice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BasicAmount") + .HasColumnType("double"); + + b.Property("BilledToId") + .HasColumnType("char(36)"); + + b.Property("ClientSubmitedDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ExceptedPaymentDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MarkAsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BilledToId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .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("PaymentAdjustmentHeads"); + + b.HasData( + new + { + Id = new Guid("dbdc047f-a2d2-4db0-b0e6-b9d9f923a0f1"), + Description = "An advance payment is a sum paid before receiving goods or services, often to secure a transaction or cover initial costs.", + IsActive = true, + Name = "Advance payment", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("66c3c241-8b52-4327-a5ad-c1faf102583e"), + Description = "The base amount refers to the principal sum or original value used as a reference in financial calculations, excluding taxes, fees, or additional charges.", + IsActive = true, + Name = "Base Amount", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0d70cb2e-827e-44fc-90a5-c2c55ba51ba9"), + Description = "TDS, or Tax Deducted at Source, is a system under the Indian Income Tax Act where tax is deducted at the point of income generation—such as salary, interest, or rent—and remitted to the government to prevent tax evasion and ensure timely collection.", + IsActive = true, + Name = "Tax Deducted at Source (TDS)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("95f35acd-d979-4177-91ea-fd03a00e49ff"), + Description = "Retention refers to a company's ability to keep customers, employees, or profits over time, commonly measured as a percentage and critical for long-term business sustainability and growth.", + IsActive = true, + Name = "Retention", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("3f09b19a-8d45-4cf2-be27-f4f09b38b9f7"), + Description = "Tax is a mandatory financial charge imposed by a government on individuals or entities to fund public services and government operations, without direct benefit to the taxpayer.", + IsActive = true, + Name = "Tax", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ec5e6a5f-ce62-44e5-8911-8426bbb4dde8"), + Description = "A penalty in the context of taxation is a financial sanction imposed by the government on individuals or entities for non-compliance with tax laws, such as late filing, underreporting income, or failure to pay taxes, and is typically calculated as a percentage of the tax due or a fixed amount.", + IsActive = true, + Name = "Penalty", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("50584332-1cb7-4359-9721-c8ea35040881"), + Description = "Utility fees are recurring charges for essential services such as electricity, water, gas, sewage, waste disposal, internet, and telecommunications, typically based on usage and necessary for operating a home or business.", + IsActive = true, + Name = "Utility fees", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("ReceivedInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("HasApplicationAccess") + .HasColumnType("tinyint(1)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .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("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }, + new + { + Id = new Guid("dbf17591-09fe-4c93-9e1a-12db8f5cc5de"), + Description = "Collection Admin is a permission that grants a user full administrative control over collections, including creating, editing, managing access, and deleting collections within a system.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Collection Admin" + }, + new + { + Id = new Guid("c8d7eea5-4033-4aad-9ebe-76de49896830"), + Description = "View Collection is a permission that allows users to see and browse assets or items within a collection without making any modifications or edits to its contents.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "View Collection" + }, + new + { + Id = new Guid("b93141fd-dbd3-4051-8f57-bf25d18e3555"), + Description = "Authorizes users to create new collections for organizing related resources and managing access", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Create Collection" + }, + new + { + Id = new Guid("455187b4-fef1-41f9-b3d0-025d0b6302c3"), + Description = "Ability to modify collection properties, content, and access rights.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Edit Collection" + }, + new + { + Id = new Guid("061d9ccd-85b4-4cb0-be06-2f9f32cebb72"), + Description = " Enables entry and processing of payment transactions.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Add Payment" + }, + new + { + Id = new Guid("6382ea8b-aff2-4cd2-a48f-a652b35825d8"), + Description = "Manage Recurring Template payment permission allows authorized users to set up, modify, and execute automated recurring payments using predefined templates, ensuring secure and controlled handling of repetitive financial transactions.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "Manage Recurring" + }, + new + { + Id = new Guid("7ddf2fba-c44d-4fe3-b4ec-690ff70be2e3"), + Description = "The \"View All Recurring Template payment permission\" generally allows users to see and access all recurring payment templates in the system, enabling them to review, manage, and process recurring transactions efficiently.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View All Recurring" + }, + new + { + Id = new Guid("e5d21efe-573d-4a16-a0f8-414d3e442e78"), + Description = "View Self Recurring Template payment permission allows a user to view and access their own recurring payment templates without editing rights.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View Self Recurring" + }, + new + { + Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), + Description = "Allow user to create new organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Add Organization" + }, + new + { + Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), + Description = "Allow the user to update the basic information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Edit Organization" + }, + new + { + Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), + Description = "Allow the user to view information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "View Organization" + }, + new + { + Id = new Guid("91e09825-512a-465e-82ad-fa355b305585"), + Description = "Allows the user to view only the purchase invoices they created.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View Self Purchase Invoice" + }, + new + { + Id = new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), + Description = "Allows the user to view all purchase invoices across the entire organization.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View All Purchase Invoice" + }, + new + { + Id = new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), + Description = "Allows full control to create, edit, and process purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Manage Purchase Invoice" + }, + new + { + Id = new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), + Description = "Allows the user to mark purchase invoices as inactive or void.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Delete Purchase Invoice" + }, + new + { + Id = new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), + Description = "Allows the user to create delivery challans for purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Add Delivery Challan" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", 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("CurrentBalance") + .HasColumnType("double"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("FinanceUIdPostfix") + .HasColumnType("int"); + + b.Property("FinanceUIdPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TenantId"); + + b.ToTable("AdvancePaymentTransactions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseUId") + .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("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAttachmentRequried") + .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("ExpenseCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + IsAttachmentRequried = 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("a1cc95ed-b276-4a3e-9f00-0a249b522d64"), + NextStatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("RecurringPaymentStatus"); + + b.HasData( + new + { + Id = new Guid("da462422-13b2-45cc-a175-910a225f6fc8"), + Name = "Active" + }, + new + { + Id = new Guid("3ec864d2-8bf5-42fb-ba70-5090301dd816"), + Name = "De-Activated" + }, + new + { + Id = new Guid("306856fb-5655-42eb-bf8b-808bb5e84725"), + Name = "Completed" + }, + new + { + Id = new Guid("8bfc9346-e092-4a80-acbf-515ae1ef6868"), + Name = "Paused" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("de04b6c7-a5cd-4a61-88b0-b43b0008202e"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseStatusId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAdvancePayment") + .HasColumnType("tinyint(1)"); + + b.Property("IsExpenseCreated") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaidTransactionId") + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("RecurringPaymentId") + .HasColumnType("char(36)"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("ExpenseStatusId"); + + b.HasIndex("PaidById"); + + b.HasIndex("RecurringPaymentId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PaymentRequests"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentRequestAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", 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("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVariable") + .HasColumnType("tinyint(1)"); + + b.Property("LatestPRGeneratedAt") + .HasColumnType("datetime(6)"); + + b.Property("NextStrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("NotifyTo") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentBufferDays") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("StrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RecurringPayments"); + }); + + 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.ActivityGroupMaster", 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit for Review", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }, + new + { + Id = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + Color = "#0E9F6E", + Description = "Create new Expense.", + DisplayName = "Create Expense", + IsActive = true, + IsSystem = true, + Name = "Done" + }); + }); + + 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("IsAttachmentRequried") + .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"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("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("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + Description = "Collection Management is a feature that enables organizations to track, organize, and manage the status and recovery of receivables or assets efficiently throughout their lifecycle, supporting systematic follow-up and resolution of outstanding accounts.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Collection Management" + }, + new + { + Id = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + Description = "Recurring Template Management is the automated creation and scheduling of repetitive tasks, processes, or transactions using predefined templates at set intervals to ensure consistent and efficient workflow execution without manual recreation each time.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Recurring Template Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + Description = "Managing all organization related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Organization Management" + }, + new + { + Id = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + Description = "Managing all Purchase invoice related rights", + IsActive = true, + ModuleId = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Name = "Purchase Invoice Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.ToTable("GlobalActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.ToTable("GlobalActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalServiceMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("GlobalServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }, + new + { + Id = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Description = "Inventory Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Inventory" + }, + new + { + Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), + Description = "Finance Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Finance" + }); + }); + + 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.HasKey("Id"); + + 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" + }, + 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" + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking" + }, + 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" + }, + new + { + Id = new Guid("a820f240-5e9a-4ae9-9091-8a7aa7720cea"), + Description = "A credit card is a payment card that allows you to borrow funds from a financial institution to pay for goods and services", + IsActive = true, + Name = "Credit card" + }, + new + { + Id = new Guid("95697409-baf6-4f78-86ab-42d93d9569a8"), + Description = "A debit card is a payment card that deducts funds directly from the cardholder's bank account when a purchase is made.", + IsActive = true, + Name = "Debit Card" + }, + new + { + Id = new Guid("f67beee6-6763-4108-922c-03bd86b9178d"), + Description = "When a bill is paid using the amount received in advance from a company.", + IsActive = true, + Name = "Advance Payment" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", 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("ServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("StatusUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationHierarchyId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationHierarchyId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TenantId"); + + b.ToTable("OrgHierarchyLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("ServiceId"); + + b.ToTable("OrgServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("OrgTypeMasters"); + + b.HasData( + new + { + Id = new Guid("5ee49bcd-b6d3-482f-9aaf-484afe04abec"), + Name = "Service Provider" + }, + new + { + Id = new Guid("a283356a-9b02-4029-afb7-e65c703efdd4"), + Name = "Sub-Contractor" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + + b.HasData( + new + { + Id = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + Address = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactNumber = "123456789", + ContactPerson = "Admin", + CreatedAt = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "admin@marcoaiot.com", + IsActive = true, + Name = "MarcoBMS", + SPRID = 5400L + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("ReportToId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ReportToId"); + + b.HasIndex("TenantId"); + + b.ToTable("OrganizationHierarchies"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletionDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationTypeId") + .HasColumnType("char(36)"); + + b.Property("ParentOrganizationId") + .HasColumnType("char(36)"); + + b.Property("ProjectServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("OrganizationTypeId"); + + b.HasIndex("ParentOrganizationId"); + + b.HasIndex("ProjectServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActualEndDate") + .HasColumnType("datetime(6)"); + + b.Property("ActualStartDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime(6)"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ReassignedDate") + .HasColumnType("datetime(6)"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PaymentGetway.PaymentDetail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EncryptedDetails") + .HasColumnType("longblob"); + + b.Property("Method") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Nonce") + .HasColumnType("longblob"); + + b.Property("OrderId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Status") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Tag") + .HasColumnType("longblob"); + + b.HasKey("Id"); + + b.ToTable("PaymentDetails"); + }); + + 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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PMCId") + .HasColumnType("char(36)"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("PromoterId") + .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("PMCId"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("PromoterId"); + + 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", + PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + 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.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }, + new + { + Id = new Guid("31cd7533-3ffc-4e84-a0b4-db3b94d016b2"), + Description = "Proforma Invoice", + Name = "Proforma Invoice" + }, + new + { + Id = new Guid("060c79a4-81c7-40a4-8cc3-56362ac9fad6"), + Description = "Sales Order", + Name = "Sales Order" + }, + new + { + Id = new Guid("12773c2c-64e7-478c-af17-8471f943a5ed"), + Description = "Other", + Name = "Other" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceAttachmentTypeId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceAttachmentTypeId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("StatusId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + + 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.ServiceProject.JobAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("JobCommentId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("JobCommentId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TaggedInAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedInTime") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendance"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobAttendanceId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("MarkedAt") + .HasColumnType("datetime(6)"); + + b.Property("MarkedTIme") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobAttendanceId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssigneeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssigneeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobEmployeeMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("JobStatus"); + + b.HasData( + new + { + Id = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + DisplayName = "New", + Level = 1, + Name = "New" + }, + new + { + Id = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + DisplayName = "Assigned", + Level = 2, + Name = "Assigned" + }, + new + { + Id = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + DisplayName = "In Progress", + Level = 3, + Name = "In Progress" + }, + new + { + Id = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + DisplayName = "Work Done", + Level = 4, + Name = "Work Done" + }, + new + { + Id = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + DisplayName = "Review Done", + Level = 5, + Name = "Review Done" + }, + new + { + Id = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + DisplayName = "Closed", + Level = 6, + Name = "Closed" + }, + new + { + Id = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + DisplayName = "On Hold", + Level = 7, + Name = "On Hold" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobStatusMappings"); + + b.HasData( + new + { + Id = new Guid("024e1810-6a57-4a0d-8d2e-be88da79fcd4"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cb0db140-87fa-4a6f-812d-2834bd0f53a9"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("42f24930-387e-4f51-9c2d-3e29ffaaf02a"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c83c23-09be-40fd-9d05-f44795d8dee8"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8c4ecdae-7435-4475-8389-15bc453561a1"), + NextStatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a44b0a66-ee33-47e7-a01f-6b8d9b621543"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7165ecee-10e3-4fc0-85d2-6d93d5b11776"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("87891499-e45d-406b-bf22-722db1beedc9"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dc986ec4-858e-4c98-b330-4a5c98c91f07"), + NextStatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ca8b4358-3122-4aaa-bcf8-0b66e4ab313a"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5602d32c-290e-48a3-83dd-91af6d12ed46"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9c2918be-b3c1-46fb-a03b-14dd613e1021"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ab974bdb-2d8f-4ddc-9b71-bd6d198bae75"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2787c903-1b39-4e7d-a0f2-3bb2309bb341"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("76bc5551-8f80-469d-ba23-95d7e746c9a9"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("JobTagId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("JobTagId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", 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("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsArchive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectBranchId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectBranchId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobTickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactInformation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ProjectBranches"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("ContactEmail") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPhone") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ServiceProjects"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectServiceMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ServiceProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceProjectTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceProjectId"); + + b.HasIndex("ServiceProjectTagId"); + + b.ToTable("ServiceProjectTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.TeamRoleMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TeamRoleMasters"); + + b.HasData( + new + { + Id = new Guid("8cfbf16f-7d3b-4c29-af5b-18935f20aa7b"), + Description = "A Support role involves assisting users or customers by resolving technical or service-related issues, answering inquiries, and ensuring a positive experience with products or services.", + Name = "Support" + }, + new + { + Id = new Guid("145d7222-408b-4733-8a17-f417e070b8b8"), + Description = "A Service Engineer installs, maintains, repairs, and troubleshoots equipment to ensure optimal operation and customer satisfaction.", + Name = "Service Engineer" + }, + new + { + Id = new Guid("03bf5853-5e0b-4eb8-9f37-33bd999a05b3"), + Description = "A Manager oversees and coordinates a team or department to achieve organizational goals through planning, decision-making, and leadership.", + Name = "Manager" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationSize") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("TenantEnquires"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PaymentDetailId") + .HasColumnType("char(36)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PaymentDetailId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ExpiredAt") + .HasColumnType("datetime(6)"); + + b.Property("FcmToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("FCMTokenMappings"); + }); + + 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.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "RequestedBy") + .WithMany() + .HasForeignKey("RequestedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Employee"); + + b.Navigation("RequestedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.Invoice", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "BilledTo") + .WithMany() + .HasForeignKey("BilledToId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("BilledTo"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId") + .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.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("PaymentRequest"); + + b.Navigation("ProcessedBy"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.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.Expenses.PaymentRequest", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "ExpenseStatus") + .WithMany() + .HasForeignKey("ExpenseStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById"); + + b.HasOne("Marco.Pms.Model.Expenses.RecurringPayment", "RecurringPayment") + .WithMany() + .HasForeignKey("RecurringPaymentId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("ExpenseStatus"); + + b.Navigation("PaidBy"); + + b.Navigation("RecurringPayment"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PaymentRequest"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", "OrganizationHierarchy") + .WithMany() + .HasForeignKey("OrganizationHierarchyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OrganizationHierarchy"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Organization"); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportTo") + .WithMany() + .HasForeignKey("ReportToId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportTo"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", "OrganizationType") + .WithMany() + .HasForeignKey("OrganizationTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "ParentOrganization") + .WithMany() + .HasForeignKey("ParentOrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", "ProjectService") + .WithMany() + .HasForeignKey("ProjectServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("OrganizationType"); + + b.Navigation("ParentOrganization"); + + b.Navigation("ProjectService"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC") + .WithMany() + .HasForeignKey("PMCId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter") + .WithMany() + .HasForeignKey("PromoterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PMC"); + + b.Navigation("ProjectStatus"); + + b.Navigation("Promoter"); + + 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.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", "InvoiceAttachmentType") + .WithMany() + .HasForeignKey("InvoiceAttachmentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("InvoiceAttachmentType"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Status"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobComment", "JobComment") + .WithMany() + .HasForeignKey("JobCommentId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("JobComment"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + 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.ServiceProject.JobAttendance", "JobAttendance") + .WithMany() + .HasForeignKey("JobAttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("JobAttendance"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobTag", "JobTag") + .WithMany() + .HasForeignKey("JobTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobTag"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ProjectBranch", "ProjectBranch") + .WithMany() + .HasForeignKey("ProjectBranchId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("ProjectBranch"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Client"); + + b.Navigation("CreatedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById"); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "ServiceProject") + .WithMany() + .HasForeignKey("ServiceProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProjectTag", "ServiceProjectTag") + .WithMany() + .HasForeignKey("ServiceProjectTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceProject"); + + b.Navigation("ServiceProjectTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("Organization"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PaymentGetway.PaymentDetail", "PaymentDetail") + .WithMany() + .HasForeignKey("PaymentDetailId"); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("PaymentDetail"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.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/20251204085823_Added_Invoice_Attachment_Type_Table.cs b/Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.cs new file mode 100644 index 0000000..bf86357 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251204085823_Added_Invoice_Attachment_Type_Table.cs @@ -0,0 +1,46 @@ +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_Invoice_Attachment_Type_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "InvoiceAttachmentTypes", + columns: new[] { "Id", "Description", "Name" }, + values: new object[,] + { + { new Guid("060c79a4-81c7-40a4-8cc3-56362ac9fad6"), "Sales Order", "Sales Order" }, + { new Guid("12773c2c-64e7-478c-af17-8471f943a5ed"), "Other", "Other" }, + { new Guid("31cd7533-3ffc-4e84-a0b4-db3b94d016b2"), "Proforma Invoice", "Proforma Invoice" } + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "InvoiceAttachmentTypes", + keyColumn: "Id", + keyValue: new Guid("060c79a4-81c7-40a4-8cc3-56362ac9fad6")); + + migrationBuilder.DeleteData( + table: "InvoiceAttachmentTypes", + keyColumn: "Id", + keyValue: new Guid("12773c2c-64e7-478c-af17-8471f943a5ed")); + + migrationBuilder.DeleteData( + table: "InvoiceAttachmentTypes", + keyColumn: "Id", + keyValue: new Guid("31cd7533-3ffc-4e84-a0b4-db3b94d016b2")); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 13d55eb..83c923c 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -5104,6 +5104,24 @@ namespace Marco.Pms.DataAccess.Migrations Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", Name = "E-Invoice" + }, + new + { + Id = new Guid("31cd7533-3ffc-4e84-a0b4-db3b94d016b2"), + Description = "Proforma Invoice", + Name = "Proforma Invoice" + }, + new + { + Id = new Guid("060c79a4-81c7-40a4-8cc3-56362ac9fad6"), + Description = "Sales Order", + Name = "Sales Order" + }, + new + { + Id = new Guid("12773c2c-64e7-478c-af17-8471f943a5ed"), + Description = "Other", + Name = "Other" }); }); diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 30f8345..a03c01c 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1127,8 +1127,8 @@ namespace Marco.Pms.Services.Controllers // Step 1: Ensure employee is allocated to the project for this tenant. var projectAllocation = await _context.ProjectAllocations - .Include(pa => pa.Employee)!.ThenInclude(e => e.JobRole) - .Include(pa => pa.Employee)!.ThenInclude(e => e.Organization) + .Include(pa => pa.Employee)!.ThenInclude(e => e!.JobRole) + .Include(pa => pa.Employee)!.ThenInclude(e => e!.Organization) .Include(pa => pa.Project) .FirstOrDefaultAsync(pa => pa.ProjectId == projectId && -- 2.43.0 From 94e2e4f18b60efd72017af4cc536414c42b286ab Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 5 Dec 2025 14:42:15 +0530 Subject: [PATCH 31/58] Added an API to get collection overview --- .../Controllers/DashboardController.cs | 294 +++++++++++++++++- 1 file changed, 287 insertions(+), 7 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index eee93bd..a02f7a8 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -2,8 +2,11 @@ using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; +using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.DashBoard; +using Marco.Pms.Model.ViewModels.Organization; +using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Services.Service; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; @@ -20,11 +23,11 @@ namespace Marco.Pms.Services.Controllers [ApiController] public class DashboardController : ControllerBase { + private readonly IDbContextFactory _dbContextFactory; private readonly ApplicationDbContext _context; private readonly UserHelper _userHelper; private readonly IProjectServices _projectServices; private readonly ILoggingService _logger; - private readonly PermissionServices _permissionServices; private readonly IServiceScopeFactory _serviceScopeFactory; public static readonly Guid ActiveId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8"); @@ -40,16 +43,17 @@ namespace Marco.Pms.Services.Controllers IProjectServices projectServices, IServiceScopeFactory serviceScopeFactory, ILoggingService logger, - PermissionServices permissionServices) + IDbContextFactory dbContextFactory) { _context = context; _userHelper = userHelper; _projectServices = projectServices; _logger = logger; _serviceScopeFactory = serviceScopeFactory; - _permissionServices = permissionServices; tenantId = userHelper.GetTenantId(); + _dbContextFactory = dbContextFactory; } + /// /// Fetches project progression data (planned and completed tasks) in graph form for a tenant and specified (or all) projects over a date range. /// @@ -254,8 +258,10 @@ namespace Marco.Pms.Services.Controllers if (projectId.HasValue) { + using var scope = _serviceScopeFactory.CreateScope(); + var _permission = scope.ServiceProvider.GetRequiredService(); // Security Check: Ensure the requested project is in the user's accessible list. - var hasPermission = await _permissionServices.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} on project {ProjectId} (not active or not accessible).", loggedInEmployee.Id, projectId.Value); @@ -340,9 +346,11 @@ namespace Marco.Pms.Services.Controllers if (projectId.HasValue) { // --- Logic for a SINGLE Project --- + using var scope = _serviceScopeFactory.CreateScope(); + var _permission = scope.ServiceProvider.GetRequiredService(); // 2a. Security Check: Verify permission for the specific project. - var hasPermission = await _permissionServices.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} on project {ProjectId}.", loggedInEmployee.Id, projectId.Value); @@ -669,7 +677,11 @@ namespace Marco.Pms.Services.Controllers // Step 3: Check if logged-in employee has permission for this project var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - bool hasPermission = await _permissionServices.HasProjectPermission(loggedInEmployee!, projectId); + + using var scope = _serviceScopeFactory.CreateScope(); + var _permission = scope.ServiceProvider.GetRequiredService(); + + bool hasPermission = await _permission.HasProjectPermission(loggedInEmployee!, projectId); if (!hasPermission) { _logger.LogWarning("Unauthorized access by EmployeeId: {EmployeeId} to ProjectId: {ProjectId}", loggedInEmployee.Id, projectId); @@ -747,7 +759,6 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(sortedResult, $"{sortedResult.Count} records fetched for attendance overview", 200)); } - [HttpGet("expense/monthly")] public async Task GetExpenseReportByProjectsAsync([FromQuery] Guid? projectId, [FromQuery] Guid? categoryId, [FromQuery] int months) { @@ -1074,5 +1085,274 @@ namespace Marco.Pms.Services.Controllers ApiResponse.ErrorResponse("An error occurred while fetching pending expenses.", "An error occurred while fetching pending expenses.", 500)); // [Error Response] } } + + [HttpGet("collection/overview")] + + /// + /// Returns a high-level collection overview (aging buckets, due vs collected, top client) + /// for invoices of the current tenant, optionally filtered by project. + /// + /// Optional project identifier to filter invoices. + /// Standardized API response with collection KPIs. + [HttpGet("collection-overview")] + public async Task GetCollectionOverviewAsync([FromQuery] Guid? projectId) + { + // Correlation ID pattern for distributed tracing (if you use one) + var correlationId = HttpContext.TraceIdentifier; + + _logger.LogInfo("Started GetCollectionOverviewAsync. CorrelationId: {CorrelationId}, ProjectId: {ProjectId}", correlationId, projectId ?? Guid.Empty); + + try + { + // Validate and identify current employee/tenant context + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Base invoice query for this tenant; AsNoTracking for read-only performance [web:1][web:5] + var invoiceQuery = _context.Invoices + .Where(i => i.TenantId == tenantId && i.IsActive) + .Include(i => i.BilledTo) + .AsNoTracking(); + + // Fetch infra and service projects in parallel using factory-created contexts + // NOTE: Avoid Task.Run over async IO where possible. Here each uses its own context instance. [web:6][web:15] + var infraProjectTask = GetInfraProjectsAsync(tenantId); + var serviceProjectTask = GetServiceProjectsAsync(tenantId); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result + .Union(serviceProjectTask.Result) + .ToList(); + + // Optional project filter: validate existence in cached list first + if (projectId.HasValue) + { + var project = projects.FirstOrDefault(p => p.Id == projectId.Value); + if (project == null) + { + _logger.LogWarning( + "Project {ProjectId} not found for tenant {TenantId} in GetCollectionOverviewAsync. CorrelationId: {CorrelationId}", + projectId, tenantId, correlationId); + + return StatusCode( + StatusCodes.Status404NotFound, + ApiResponse.ErrorResponse( + "Project Not Found", + "The requested project does not exist or is not associated with the current tenant.", + StatusCodes.Status404NotFound)); + } + + invoiceQuery = invoiceQuery.Where(i => i.ProjectId == projectId.Value); + } + + var invoices = await invoiceQuery.ToListAsync(); + + if (invoices.Count == 0) + { + _logger.LogInfo( + "No invoices found for tenant {TenantId} in GetCollectionOverviewAsync. CorrelationId: {CorrelationId}", + tenantId, correlationId); + + // Return an empty but valid overview instead of 404 – endpoint is conceptually valid + var emptyResponse = new + { + TotalDueAmount = 0d, + TotalCollectedAmount = 0d, + TotalValue = 0d, + PendingPercentage = 0d, + CollectedPercentage = 0d, + Bucket0To30Invoices = 0, + Bucket30To60Invoices = 0, + Bucket60To90Invoices = 0, + Bucket90PlusInvoices = 0, + Bucket0To30Amount = 0d, + Bucket30To60Amount = 0d, + Bucket60To90Amount = 0d, + Bucket90PlusAmount = 0d, + TopClientBalance = 0d, + TopClient = new BasicOrganizationVm() + }; + + return Ok(ApiResponse.SuccessResponse(emptyResponse, "No invoices found for the current tenant and filters; returning empty collection overview.", 200)); + } + + var invoiceIds = invoices.Select(i => i.Id).ToList(); + + // Pre-aggregate payments per invoice in the DB where possible [web:1][web:17] + var paymentGroups = await _context.ReceivedInvoicePayments + .AsNoTracking() + .Where(p => invoiceIds.Contains(p.InvoiceId) && p.TenantId == tenantId) + .GroupBy(p => p.InvoiceId) + .Select(g => new + { + InvoiceId = g.Key, + PaidAmount = g.Sum(p => p.Amount) + }) + .ToListAsync(); + + // Create a lookup to avoid repeated LINQ Where on each iteration + var paymentsLookup = paymentGroups.ToDictionary(p => p.InvoiceId, p => p.PaidAmount); + + double totalDueAmount = 0; + var today = DateTime.UtcNow.Date; // use UTC for consistency [web:17] + + var bucketOneInvoices = 0; + double bucketOneAmount = 0; + var bucketTwoInvoices = 0; + double bucketTwoAmount = 0; + var bucketThreeInvoices = 0; + double bucketThreeAmount = 0; + var bucketFourInvoices = 0; + double bucketFourAmount = 0; + + // Main aging calculation loop + foreach (var invoice in invoices) + { + var total = invoice.BasicAmount + invoice.TaxAmount; + var paid = paymentsLookup.TryGetValue(invoice.Id, out var paidAmount) + ? paidAmount + : 0d; + var balance = total - paid; + + // Skip fully paid or explicitly completed invoices + if (balance <= 0 || invoice.MarkAsCompleted) + continue; + + totalDueAmount += balance; + + // Only consider invoices with expected payment date up to today for aging + var expectedDate = invoice.ExceptedPaymentDate.Date; + if (expectedDate > today) + continue; + + var days = (today - expectedDate).Days; + + if (days <= 30 && days > 0) + { + bucketOneInvoices++; + bucketOneAmount += balance; + } + else if (days > 30 && days <= 60) + { + bucketTwoInvoices++; + bucketTwoAmount += balance; + } + else if (days > 60 && days <= 90) + { + bucketThreeInvoices++; + bucketThreeAmount += balance; + } + else if (days > 90) + { + bucketFourInvoices++; + bucketFourAmount += balance; + } + } + + var totalCollectedAmount = paymentGroups.Sum(p => p.PaidAmount); + var totalValue = totalDueAmount + totalCollectedAmount; + var pendingPercentage = totalValue > 0 ? (totalDueAmount / totalValue) * 100 : 0; + var collectedPercentage = totalValue > 0 ? (totalCollectedAmount / totalValue) * 100 : 0; + + // Determine top client by outstanding balance + double topClientBalance = 0; + Organization topClient = new Organization(); + + var groupedByClient = invoices + .Where(i => i.BilledToId.HasValue && i.BilledTo != null) + .GroupBy(i => i.BilledToId); + + foreach (var group in groupedByClient) + { + var clientInvoiceIds = group.Select(i => i.Id).ToList(); + var totalForClient = group.Sum(i => i.BasicAmount + i.TaxAmount); + var paidForClient = paymentGroups + .Where(pg => clientInvoiceIds.Contains(pg.InvoiceId)) + .Sum(pg => pg.PaidAmount); + + var clientBalance = totalForClient - paidForClient; + if (clientBalance > topClientBalance) + { + topClientBalance = clientBalance; + topClient = group.First()!.BilledTo!; + } + } + + BasicOrganizationVm topClientVm = new BasicOrganizationVm(); + if (topClient != null) + { + topClientVm = new BasicOrganizationVm + { + Id = topClient.Id, + Name = topClient.Name, + Email = topClient.Email, + ContactPerson = topClient.ContactPerson, + ContactNumber = topClient.ContactNumber, + Address = topClient.Address, + GSTNumber = topClient.GSTNumber, + SPRID = topClient.SPRID + }; + } + + var response = new + { + TotalDueAmount = totalDueAmount, + TotalCollectedAmount = totalCollectedAmount, + TotalValue = totalValue, + PendingPercentage = Math.Round(pendingPercentage, 2), + CollectedPercentage = Math.Round(collectedPercentage, 2), + Bucket0To30Invoices = bucketOneInvoices, + Bucket30To60Invoices = bucketTwoInvoices, + Bucket60To90Invoices = bucketThreeInvoices, + Bucket90PlusInvoices = bucketFourInvoices, + Bucket0To30Amount = bucketOneAmount, + Bucket30To60Amount = bucketTwoAmount, + Bucket60To90Amount = bucketThreeAmount, + Bucket90PlusAmount = bucketFourAmount, + TopClientBalance = topClientBalance, + TopClient = topClientVm + }; + + _logger.LogInfo("Successfully completed GetCollectionOverviewAsync for tenant {TenantId}. CorrelationId: {CorrelationId}, TotalInvoices: {InvoiceCount}, TotalValue: {TotalValue}", + tenantId, correlationId, invoices.Count, totalValue); + + return Ok(ApiResponse.SuccessResponse(response, "Collection overview fetched successfully.", 200)); + } + catch (Exception ex) + { + // Centralized logging for unhandled exceptions with context, no sensitive data [web:1][web:5][web:10] + _logger.LogError(ex, "Unhandled exception in GetCollectionOverviewAsync. CorrelationId: {CorrelationId}", correlationId); + + // Generic but consistent error payload; let global exception handler standardize if you use ProblemDetails [web:10][web:13][web:16] + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", + "An unexpected error occurred while generating the collection overview. Please try again or contact support with the correlation identifier.", 500)); + } + } + + /// + /// Gets infrastructure projects for a tenant as a lightweight view model. + /// + private async Task> GetInfraProjectsAsync(Guid tenantId) + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects + .AsNoTracking() + .Where(p => p.TenantId == tenantId) + .Select(p => new BasicProjectVM { Id = p.Id, Name = p.Name }) + .ToListAsync(); + } + + /// + /// Gets service projects for a tenant as a lightweight view model. + /// + private async Task> GetServiceProjectsAsync(Guid tenantId) + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ServiceProjects + .AsNoTracking() + .Where(sp => sp.TenantId == tenantId) + .Select(sp => new BasicProjectVM { Id = sp.Id, Name = sp.Name }) + .ToListAsync(); + } } } -- 2.43.0 From 6bcc67bb636930e2416b3c896dbb91e1143b71c5 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 5 Dec 2025 15:40:26 +0530 Subject: [PATCH 32/58] Added an API to get purchase invoice overview --- .../Controllers/DashboardController.cs | 156 +++++++++++++++++- 1 file changed, 155 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 964160e..bf5ec4e 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1225,7 +1225,11 @@ namespace Marco.Pms.Services.Controllers { // Correlation ID pattern for distributed tracing (if you use one) var correlationId = HttpContext.TraceIdentifier; - + if (tenantId == Guid.Empty) + { + _logger.LogWarning("Invalid request: TenantId is empty on progression endpoint"); + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "Provided Invalid TenantId", 400)); + } _logger.LogInfo("Started GetCollectionOverviewAsync. CorrelationId: {CorrelationId}, ProjectId: {ProjectId}", correlationId, projectId ?? Guid.Empty); try @@ -1455,6 +1459,156 @@ namespace Marco.Pms.Services.Controllers } } + [HttpGet("purchase-invoice-overview")] + public async Task GetPurchaseInvoiceOverview() + { + // Correlation id for tracing this request across services/logs. + var correlationId = HttpContext.TraceIdentifier; + + _logger.LogInfo("GetPurchaseInvoiceOverview started. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + + // Basic guard: invalid tenant. + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetPurchaseInvoiceOverview rejected due to empty TenantId. CorrelationId: {CorrelationId}", correlationId); + + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "The tenant identifier provided is invalid or missing.", 400)); + } + + try + { + // Fetch current employee context (if needed for authorization/audit). + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + // Run project queries in parallel to reduce latency. + var infraProjectTask = GetInfraProjectsAsync(tenantId); + var serviceProjectTask = GetServiceProjectsAsync(tenantId); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result + .Union(serviceProjectTask.Result) + .ToList(); + + _logger.LogDebug("GetPurchaseInvoiceOverview loaded projects. Count: {ProjectCount}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", projects.Count, tenantId, correlationId); + + // Query purchase invoices for the tenant. + var purchaseInvoices = await _context.PurchaseInvoiceDetails + .Include(pid => pid.Supplier) + .Include(pid => pid.Status) + .AsNoTracking() + .Where(pid => pid.TenantId == tenantId && pid.IsActive) + .ToListAsync(); + + _logger.LogInfo("GetPurchaseInvoiceOverview loaded invoices. InvoiceCount: {InvoiceCount}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + purchaseInvoices.Count, tenantId, correlationId); + + if (!purchaseInvoices.Any()) + { + // No invoices is not an error; return an empty but well-structured overview. + _logger.LogInfo("GetPurchaseInvoiceOverview: No active purchase invoices found. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + + var emptyResponse = new + { + TotalInvoices = 0, + TotalValue = 0m, + AverageValue = 0m, + StatusBreakdown = Array.Empty(), + ProjectBreakdown = Array.Empty(), + TopSupplier = (object?)null + }; + + return Ok(ApiResponse.SuccessResponse( + emptyResponse, + "No active purchase invoices found for the specified tenant.", + StatusCodes.Status200OK)); + } + + var totalInvoices = purchaseInvoices.Count; + var totalValue = purchaseInvoices.Sum(pid => pid.BaseAmount); + + // Guard against divide-by-zero (in case BaseAmount is all zero). + var averageValue = totalInvoices > 0 + ? totalValue / totalInvoices + : 0; + + // Status-wise aggregation + var statusBreakdown = purchaseInvoices + .Where(pid => pid.Status != null) + .GroupBy(pid => pid.StatusId) + .Select(g => new + { + Id = g.Key, + Name = g.First().Status!.DisplayName, + Count = g.Count(), + TotalValue = g.Sum(pid => pid.BaseAmount), + Percentage = totalValue > 0 + ? Math.Round(g.Sum(pid => pid.BaseAmount) / totalValue * 100, 2) + : 0 + }) + .OrderByDescending(x => x.TotalValue) + .ToList(); + + // Project-wise aggregation (top 3 by value) + var projectBreakdown = purchaseInvoices + .GroupBy(pid => pid.ProjectId) + .Select(g => new + { + Id = g.Key, + Name = projects.FirstOrDefault(p => p.Id == g.Key)?.Name ?? "Unknown Project", + Count = g.Count(), + TotalValue = g.Sum(pid => pid.BaseAmount), + Percentage = totalValue > 0 + ? Math.Round(g.Sum(pid => pid.BaseAmount) / totalValue * 100, 2) + : 0 + }) + .OrderByDescending(pid => pid.TotalValue) + .Take(3) + .ToList(); + + // Top supplier by total value + var supplierBreakdown = purchaseInvoices + .Where(pid => pid.Supplier != null) + .GroupBy(pid => pid.SupplierId) + .Select(g => new + { + Id = g.Key, + Name = g.First().Supplier!.Name, + Count = g.Count(), + TotalValue = g.Sum(pid => pid.BaseAmount), + Percentage = totalValue > 0 + ? Math.Round(g.Sum(pid => pid.BaseAmount) / totalValue * 100, 2) + : 0 + }) + .OrderByDescending(pid => pid.TotalValue) + .FirstOrDefault(); + + var response = new + { + TotalInvoices = totalInvoices, + TotalValue = Math.Round(totalValue, 2), + AverageValue = Math.Round(averageValue, 2), + StatusBreakdown = statusBreakdown, + ProjectBreakdown = projectBreakdown, + TopSupplier = supplierBreakdown + }; + + _logger.LogInfo("GetPurchaseInvoiceOverview completed successfully. TenantId: {TenantId}, TotalInvoices: {TotalInvoices}, TotalValue: {TotalValue}, CorrelationId: {CorrelationId}", + tenantId, totalInvoices, totalValue, correlationId); + + return Ok(ApiResponse.SuccessResponse(response, "Purchase invoice overview retrieved successfully.", 200)); + } + catch (Exception ex) + { + // Capture complete context for diagnostics, but ensure no sensitive data is logged. + _logger.LogError(ex, "Error occurred while processing GetPurchaseInvoiceOverview. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + // Do not expose internal details to clients. Return a generic 500 response. + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An unexpected error occurred while processing the purchase invoice overview.", 500)); + } + } + /// /// Gets infrastructure projects for a tenant as a lightweight view model. /// -- 2.43.0 From 852ddc7e02ac20930404afb6363bd4e92391b0f3 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 5 Dec 2025 19:06:21 +0530 Subject: [PATCH 33/58] Optimized the side menu APIs --- .../Data/ApplicationDbContext.cs | 1 - .../Utility/SidebarMenuHelper.cs | 68 +++ Marco.Pms.Model/AppMenu/WebMenuSection.cs | 19 + Marco.Pms.Model/AppMenu/WebSideMenuItem.cs | 22 + .../Dtos/AppMenu/CreateWebMenuSectionDto.cs | 9 + .../Dtos/AppMenu/CreateWebSideMenuItemDto.cs | 15 + .../ViewModels/AppMenu/WebMenuSectionVM.cs | 12 + .../ViewModels/AppMenu/WebSideMenuItemVM.cs | 12 + .../Controllers/AppMenuController.cs | 519 +++++------------- .../MappingProfiles/MappingProfile.cs | 20 + 10 files changed, 301 insertions(+), 396 deletions(-) create mode 100644 Marco.Pms.Model/AppMenu/WebMenuSection.cs create mode 100644 Marco.Pms.Model/AppMenu/WebSideMenuItem.cs create mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateWebMenuSectionDto.cs create mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs create mode 100644 Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs create mode 100644 Marco.Pms.Model/ViewModels/AppMenu/WebSideMenuItemVM.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index 4dc5793..af5b8ab 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -248,7 +248,6 @@ namespace Marco.Pms.DataAccess.Data public DbSet InvoiceAttachmentTypes { get; set; } #endregion - protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); diff --git a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs index 5aa761d..9a17110 100644 --- a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs +++ b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs @@ -9,6 +9,7 @@ namespace Marco.Pms.CacheHelper public class SidebarMenuHelper { private readonly IMongoCollection _collection; + private readonly IMongoCollection _webCollection; private readonly ILogger _logger; public SidebarMenuHelper(IConfiguration configuration, ILogger logger) @@ -19,8 +20,75 @@ namespace Marco.Pms.CacheHelper var client = new MongoClient(mongoUrl); var database = client.GetDatabase(mongoUrl.DatabaseName); _collection = database.GetCollection("Menus"); + _webCollection = database.GetCollection("WebSideMenus"); } + public async Task> GetAllWebMenuSectionsAsync(Guid tenantId) + { + try + { + var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + + var result = await _webCollection + .Find(filter) + .ToListAsync(); + if (result.Any()) + { + return result; + } + + tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); + filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + + result = await _webCollection + .Find(filter) + .ToListAsync(); + return result; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while fetching Web Menu Sections."); + return new List(); + } + } + + public async Task CreateWebMenuSectionAsync(WebMenuSection section) + { + try + { + await _webCollection.InsertOneAsync(section); + return section; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while adding Web Menu Section."); + return null; + } + } + public async Task AddWebMenuItemAsync(Guid sectionId, List newItems) + { + try + { + + var filter = Builders.Filter.Eq(s => s.Id, sectionId); + + var update = Builders.Update.PushEach(s => s.Items, newItems); + + var result = await _webCollection.UpdateOneAsync(filter, update); + + if (result.ModifiedCount > 0) + { + return await _webCollection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); + } + + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error adding menu item."); + return null; + } + } public async Task CreateMenuSectionAsync(MenuSection section) { try diff --git a/Marco.Pms.Model/AppMenu/WebMenuSection.cs b/Marco.Pms.Model/AppMenu/WebMenuSection.cs new file mode 100644 index 0000000..121d918 --- /dev/null +++ b/Marco.Pms.Model/AppMenu/WebMenuSection.cs @@ -0,0 +1,19 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.AppMenu +{ + public class WebMenuSection + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + + public string? Header { get; set; } + public string? Title { get; set; } + public List Items { get; set; } = new List(); + + [BsonRepresentation(BsonType.String)] + public Guid TenantId { get; set; } + } +} diff --git a/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs new file mode 100644 index 0000000..f45bf6f --- /dev/null +++ b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs @@ -0,0 +1,22 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.AppMenu +{ + public class WebSideMenuItem + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } = Guid.NewGuid(); + + [BsonRepresentation(BsonType.String)] + public Guid? ParentMenuId { get; set; } + public string? Text { get; set; } + public string? Icon { get; set; } + public bool Available { get; set; } = true; + public string Link { get; set; } = string.Empty; + + [BsonRepresentation(BsonType.String)] + public List PermissionIds { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateWebMenuSectionDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateWebMenuSectionDto.cs new file mode 100644 index 0000000..b5d432b --- /dev/null +++ b/Marco.Pms.Model/Dtos/AppMenu/CreateWebMenuSectionDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.AppMenu +{ + public class CreateWebMenuSectionDto + { + public required string Header { get; set; } + public required string Title { get; set; } + public List Items { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs new file mode 100644 index 0000000..e07244c --- /dev/null +++ b/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs @@ -0,0 +1,15 @@ +namespace Marco.Pms.Model.Dtos.AppMenu +{ + public class CreateWebSideMenuItemDto + { + public Guid? Id { get; set; } + public Guid? ParentMenuId { get; set; } + public string? Text { get; set; } + public string? Icon { get; set; } + public bool Available { get; set; } = true; + public string Link { get; set; } = string.Empty; + + // Changed from string → List + public List PermissionIds { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs b/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs new file mode 100644 index 0000000..d233cf8 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.ViewModels.AppMenu +{ + public class WebMenuSectionVM + { + public Guid Id { get; set; } + + public string? Header { get; set; } + public string? Name { get; set; } + public List Items { get; set; } = new List(); + public Guid TenantId { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/AppMenu/WebSideMenuItemVM.cs b/Marco.Pms.Model/ViewModels/AppMenu/WebSideMenuItemVM.cs new file mode 100644 index 0000000..11446fa --- /dev/null +++ b/Marco.Pms.Model/ViewModels/AppMenu/WebSideMenuItemVM.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.ViewModels.AppMenu +{ + public class WebSideMenuItemVM + { + public Guid Id { get; set; } + public string? Name { get; set; } + public string? Icon { get; set; } + public bool Available { get; set; } + public string? Link { get; set; } + public List Submenu { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 82b122f..f42d1f5 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -53,16 +53,123 @@ namespace Marco.Pms.Services.Controllers tenantId = userHelper.GetTenantId(); } + [HttpGet("get/menu")] + public async Task GetAppSideBarMenuAsync() + { + // Correlation ID for distributed tracing across services and logs. + var correlationId = HttpContext.TraceIdentifier; - /// - /// Creates a new sidebar menu section for the tenant. - /// Only accessible by root users or for the super tenant. - /// - /// The data for the new menu section. - /// HTTP response with result of the operation. + _logger.LogInfo("GetAppSideBarMenuAsync started. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + + try + { + // Step 1: Validate tenant context + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetAppSideBarMenuAsync rejected: Invalid TenantId. CorrelationId: {CorrelationId}", correlationId); + + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "The tenant identifier provided is invalid or missing.", 400)); + } + + // Step 2: Resolve current employee context for permission checks + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + var employeeId = loggedInEmployee.Id; + + // Step 3: Create scoped permission service (avoid capturing scoped services in controller) + using var scope = _serviceScopeFactory.CreateScope(); + var permissions = scope.ServiceProvider.GetRequiredService(); + + _logger.LogDebug("GetAppSideBarMenuAsync resolved employee context. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + employeeId, tenantId, correlationId); + + // Step 4: Fetch all menu sections for tenant (null-safe check) + var menus = await _sideBarMenuHelper.GetAllWebMenuSectionsAsync(tenantId); + if (menus == null || !menus.Any()) + { + _logger.LogInfo("GetAppSideBarMenuAsync: No menu sections found. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + return Ok(ApiResponse.SuccessResponse(new List(), "No sidebar menu sections configured for this tenant.", 200)); + } + + _logger.LogDebug("GetAppSideBarMenuAsync loaded {MenuSectionCount} menu sections. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + menus.Count, tenantId, correlationId); + + // Step 5: Filter and build menu response with permission checks + var response = new List(); + + foreach (var menuSection in menus) + { + var sectionVM = _mapper.Map(menuSection); + if (menuSection.Items == null) + { + _logger.LogDebug("Skipping menu section with null items. SectionId: {SectionId}, TenantId: {TenantId}", menuSection.Id, tenantId); + continue; + } + + + foreach (var menuItem in menuSection.Items) + { + // Skip items without permission check if required + if (menuItem.PermissionIds.Any()) + { + var hasPermission = await permissions.HasPermissionAny(menuItem.PermissionIds, employeeId); + if (!hasPermission) + { + _logger.LogDebug("Menu item access denied due to missing permissions. ItemId: {ItemId}, EmployeeId: {EmployeeId}, TenantId: {TenantId}", + menuItem.Id, employeeId, tenantId); + continue; + } + } + + var itemVM = _mapper.Map(menuItem); + if (menuItem.ParentMenuId.HasValue) + { + sectionVM.Items.Where(i => i.Id == menuItem.ParentMenuId.Value).FirstOrDefault()?.Submenu.Add(itemVM); + } + else + { + sectionVM.Items.Add(itemVM); + } + } + + // Only include sections with at least one accessible item + if (sectionVM.Items.Any()) + { + response.Add(sectionVM); + } + } + + _logger.LogInfo("GetAppSideBarMenuAsync completed successfully. TenantId: {TenantId}, EmployeeId: {EmployeeId}, OriginalSections: {OriginalCount}, FilteredSections: {FilteredCount}, CorrelationId: {CorrelationId}", + tenantId, employeeId, menus.Count, response.Count, correlationId); + + return Ok(ApiResponse.SuccessResponse(response, $"Sidebar menu fetched successfully. {response.Count} sections returned.", 200)); + } + catch (OperationCanceledException) + { + _logger.LogWarning("GetAppSideBarMenuAsync cancelled. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(499, ApiResponse.ErrorResponse("Request Cancelled", "The request was cancelled by the client.", 499)); + } + catch (UnauthorizedAccessException ex) + { + _logger.LogError(ex, "GetAppSideBarMenuAsync authorization failed. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(403, (ApiResponse.ErrorResponse("Access Denied", "Insufficient permissions to access menu sections.", 403))); + } + catch (Exception ex) + { + _logger.LogError(ex, "Unexpected error in GetAppSideBarMenuAsync. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An unexpected error occurred while fetching the sidebar menu.", 500)); + } + } [HttpPost("add/sidebar/menu-section")] - public async Task CreateAppSideBarMenu([FromBody] CreateMenuSectionDto menuSectionDto) + public async Task CreateAppSideBarMenuAsync([FromBody] CreateWebMenuSectionDto model) { // Step 1: Fetch logged-in user var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -76,17 +183,17 @@ namespace Marco.Pms.Services.Controllers } // Step 3: Map DTO to entity - var sideMenuSection = _mapper.Map(menuSectionDto); + var sideMenuSection = _mapper.Map(model); sideMenuSection.TenantId = tenantId; try { // Step 4: Save entity using helper - sideMenuSection = await _sideBarMenuHelper.CreateMenuSectionAsync(sideMenuSection); + sideMenuSection = await _sideBarMenuHelper.CreateWebMenuSectionAsync(sideMenuSection); if (sideMenuSection == null) { - _logger.LogWarning("Failed to create sidebar menu section. Tenant: {TenantId}, Request: {@MenuSectionDto}", tenantId, menuSectionDto); + _logger.LogWarning("Failed to create sidebar menu section. Tenant: {TenantId}, Request: {@MenuSectionDto}", tenantId, model); return BadRequest(ApiResponse.ErrorResponse("Invalid MenuSection", 400)); } @@ -100,86 +207,14 @@ namespace Marco.Pms.Services.Controllers { // Step 6: Handle and log unexpected server errors _logger.LogError(ex, "Unexpected error occurred while creating sidebar menu. Tenant: {TenantId}, EmployeeId: {EmployeeId}, Request: {@MenuSectionDto}", - tenantId, loggedInEmployee.Id, menuSectionDto); + tenantId, loggedInEmployee.Id, model); return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred.", 500)); } } - /// - /// Updates an existing sidebar menu section for the tenant. - /// Only accessible by root users or for the super tenant. - /// - /// The unique identifier of the section to update. - /// The updated data for the sidebar menu section. - /// HTTP response with the result of the operation. - - [HttpPut("edit/sidebar/menu-section/{sectionId}")] - public async Task UpdateMenuSection(Guid sectionId, [FromBody] UpdateMenuSectionDto updatedSection) - { - // Step 1: Fetch logged-in user - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - - // Step 2: Authorization check - if (!isRootUser && tenantId != superTenantId) - { - _logger.LogWarning("Access denied: User {UserId} attempted to update sidebar menu section {SectionId} in Tenant {TenantId}", - loggedInEmployee.Id, sectionId, tenantId); - - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); - } - - // Step 3: Validate request - if (sectionId == Guid.Empty || sectionId != updatedSection.Id) - { - _logger.LogWarning("Invalid update request. Tenant: {TenantId}, SectionId: {SectionId}, PayloadId: {PayloadId}, UserId: {UserId}", - tenantId, sectionId, updatedSection.Id, loggedInEmployee.Id); - - return BadRequest(ApiResponse.ErrorResponse("Invalid section ID or mismatched payload.", 400)); - } - - // Step 4: Map DTO to entity - var menuSectionEntity = _mapper.Map(updatedSection); - - try - { - // Step 5: Perform update operation - var result = await _sideBarMenuHelper.UpdateMenuSectionAsync(sectionId, menuSectionEntity); - - if (result == null) - { - _logger.LogWarning("Menu section not found for update. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}", - sectionId, tenantId, loggedInEmployee.Id); - return NotFound(ApiResponse.ErrorResponse("Menu section not found", 404)); - } - - // Step 6: Successful update - _logger.LogInfo("Menu section updated successfully. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}", - sectionId, tenantId, loggedInEmployee.Id); - - return Ok(ApiResponse.SuccessResponse(result, "Menu section updated successfully")); - } - catch (Exception ex) - { - // Step 7: Unexpected server error - _logger.LogError(ex, "Failed to update menu section. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}, Payload: {@UpdatedSection}", - sectionId, tenantId, loggedInEmployee.Id, updatedSection); - - return StatusCode(500, ApiResponse.ErrorResponse("Server error", "An unexpected error occurred while updating the menu section.", 500)); - } - } - - /// - /// Adds a new menu item to an existing sidebar menu section. - /// Only accessible by root users or for the super tenant. - /// - /// The unique identifier of the section the item will be added to. - /// The details of the new menu item. - /// HTTP response with the result of the operation. - - [HttpPost("add/sidebar/menus/{sectionId}/items")] - public async Task AddMenuItem(Guid sectionId, [FromBody] CreateMenuItemDto newItemDto) + [HttpPost("add/sidebar/section/{sectionId}/items")] + public async Task AddMenuItemAsync(Guid sectionId, [FromBody] List model) { // Step 1: Fetch logged-in user var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); @@ -195,7 +230,7 @@ namespace Marco.Pms.Services.Controllers } // Step 3: Input validation - if (sectionId == Guid.Empty || newItemDto == null) + if (sectionId == Guid.Empty || model == null) { _logger.LogWarning("Invalid AddMenuItem request. Tenant: {TenantId}, SectionId: {SectionId}, UserId: {UserId}", tenantId, sectionId, loggedInEmployee.Id); @@ -206,10 +241,10 @@ namespace Marco.Pms.Services.Controllers try { // Step 4: Map DTO to entity - var menuItemEntity = _mapper.Map(newItemDto); + var menuItemEntity = _mapper.Map>(model); // Step 5: Perform Add operation - var result = await _sideBarMenuHelper.AddMenuItemAsync(sectionId, menuItemEntity); + var result = await _sideBarMenuHelper.AddWebMenuItemAsync(sectionId, menuItemEntity); if (result == null) { @@ -229,318 +264,12 @@ namespace Marco.Pms.Services.Controllers { // Step 7: Handle unexpected errors _logger.LogError(ex, "Error occurred while adding menu item. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}, Payload: {@NewItemDto}", - sectionId, tenantId, loggedInEmployee.Id, newItemDto); + sectionId, tenantId, loggedInEmployee.Id, model); return StatusCode(500, ApiResponse.ErrorResponse("Server error", "An unexpected error occurred while adding the menu item.", 500)); } } - /// - /// Updates an existing menu item inside a sidebar menu section. - /// Only accessible by root users or within the super tenant. - /// - /// The ID of the sidebar menu section. - /// The ID of the menu item to update. - /// The updated menu item details. - /// HTTP response with the result of the update operation. - - [HttpPut("edit/sidebar/{sectionId}/items/{itemId}")] - public async Task UpdateMenuItem(Guid sectionId, Guid itemId, [FromBody] UpdateMenuItemDto updatedMenuItem) - { - // Step 1: Fetch logged-in user - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - - // Step 2: Authorization check - if (!isRootUser && tenantId != superTenantId) - { - _logger.LogWarning("Access denied: User {UserId} attempted to update menu item {ItemId} in Section {SectionId}, Tenant {TenantId}", - loggedInEmployee.Id, itemId, sectionId, tenantId); - - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); - } - - // Step 3: Input validation - if (sectionId == Guid.Empty || itemId == Guid.Empty || updatedMenuItem == null || updatedMenuItem.Id != itemId) - { - _logger.LogWarning("Invalid UpdateMenuItem request. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, loggedInEmployee.Id); - - return BadRequest(ApiResponse.ErrorResponse("Invalid section ID, item ID, or menu item payload.", 400)); - } - - // Step 4: Map DTO to entity - var menuItemEntity = _mapper.Map(updatedMenuItem); - - try - { - // Step 5: Perform update operation - var result = await _sideBarMenuHelper.UpdateMenuItemAsync(sectionId, itemId, menuItemEntity); - - if (result == null) - { - _logger.LogWarning("Menu item not found or update failed. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, loggedInEmployee.Id); - return NotFound(ApiResponse.ErrorResponse("Menu item not found or update failed.", 404)); - } - - // Step 6: Success log - _logger.LogInfo("Menu item updated successfully. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, loggedInEmployee.Id); - - return Ok(ApiResponse.SuccessResponse(result, "Sidebar menu item updated successfully.")); - } - catch (Exception ex) - { - // ✅ Step 7: Handle server errors - _logger.LogError(ex, "Error occurred while updating menu item. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}, Payload: {@UpdatedMenuItem}", - tenantId, sectionId, itemId, loggedInEmployee.Id, updatedMenuItem); - - return StatusCode( - 500, - ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while updating the menu item.", 500) - ); - } - } - - /// - /// Adds a new sub-menu item to an existing menu item inside a sidebar menu section. - /// Only accessible by root users or within the super tenant. - /// - /// The ID of the sidebar menu section. - /// The ID of the parent menu item. - /// The details of the new sub-menu item. - /// HTTP response with the result of the add operation. - - [HttpPost("add/sidebar/menus/{sectionId}/items/{itemId}/subitems")] - public async Task AddSubMenuItem(Guid sectionId, Guid itemId, [FromBody] CreateSubMenuItemDto newSubItem) - { - // Step 1: Fetch logged-in user - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - - // Step 2: Authorization check - if (!isRootUser && tenantId != superTenantId) - { - _logger.LogWarning("Access denied: User {UserId} attempted to add sub-menu item in Section {SectionId}, MenuItem {ItemId}, Tenant {TenantId}", - loggedInEmployee.Id, sectionId, itemId, tenantId); - - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); - } - - // Step 3: Validate input - if (sectionId == Guid.Empty || itemId == Guid.Empty || newSubItem == null) - { - _logger.LogWarning("Invalid AddSubMenuItem request. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, loggedInEmployee.Id); - - return BadRequest(ApiResponse.ErrorResponse("Invalid section ID, item ID, or sub-menu item payload.", 400)); - } - - try - { - // Step 4: Map DTO to entity - var subMenuItemEntity = _mapper.Map(newSubItem); - - // Step 5: Perform add operation - var result = await _sideBarMenuHelper.AddSubMenuItemAsync(sectionId, itemId, subMenuItemEntity); - - if (result == null) - { - _logger.LogWarning("Parent menu item not found. Failed to add sub-menu item. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, loggedInEmployee.Id); - - return NotFound(ApiResponse.ErrorResponse("Parent menu item not found.", 404)); - } - - // Step 6: Success logging - _logger.LogInfo("Sub-menu item added successfully. Tenant: {TenantId}, SectionId: {SectionId}, ParentItemId: {ItemId}, SubItemId: {SubItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, result.Id, loggedInEmployee.Id); - - return Ok(ApiResponse.SuccessResponse(result, "Sub-menu item added successfully.")); - } - catch (Exception ex) - { - // Step 7: Handle unexpected errors - _logger.LogError(ex, "Error occurred while adding sub-menu item. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, UserId: {UserId}, Payload: {@NewSubItem}", - tenantId, sectionId, itemId, loggedInEmployee.Id, newSubItem); - - return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while adding the sub-menu item.", 500)); - } - } - - /// - /// Updates an existing sub-menu item inside a sidebar menu section. - /// Only accessible by root users or within the super tenant. - /// - /// The ID of the sidebar menu section. - /// The ID of the parent menu item. - /// The ID of the sub-menu item to update. - /// The updated sub-menu item details. - /// HTTP response with the result of the update operation. - - [HttpPut("edit/sidebar/{sectionId}/items/{itemId}/subitems/{subItemId}")] - public async Task UpdateSubmenuItem(Guid sectionId, Guid itemId, Guid subItemId, [FromBody] UpdateSubMenuItemDto updatedSubMenuItem) - { - // Step 1: Fetch logged-in user - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - - // Step 2: Authorization check - if (!isRootUser && tenantId != superTenantId) - { - _logger.LogWarning("Access denied: User {UserId} attempted to update sub-menu {SubItemId} under MenuItem {ItemId} in Section {SectionId}, Tenant {TenantId}", - loggedInEmployee.Id, subItemId, itemId, sectionId, tenantId); - - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); - } - - // Step 3: Input validation - if (sectionId == Guid.Empty || itemId == Guid.Empty || subItemId == Guid.Empty || updatedSubMenuItem == null || updatedSubMenuItem.Id != subItemId) - { - _logger.LogWarning("Invalid UpdateSubMenuItem request. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, SubItemId: {SubItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, subItemId, loggedInEmployee.Id); - - return BadRequest(ApiResponse.ErrorResponse("Invalid section ID, menu item ID, sub-item ID, or payload mismatch.", 400)); - } - - try - { - // Step 4: Map DTO to entity - var subMenuEntity = _mapper.Map(updatedSubMenuItem); - - // Step 5: Perform update operation - var result = await _sideBarMenuHelper.UpdateSubmenuItemAsync(sectionId, itemId, subItemId, subMenuEntity); - - if (result == null) - { - _logger.LogWarning("Sub-menu item not found or update failed. Tenant: {TenantId}, SectionId: {SectionId}, ItemId: {ItemId}, SubItemId: {SubItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, subItemId, loggedInEmployee.Id); - - return NotFound(ApiResponse.ErrorResponse("Sub-menu item not found.", 404)); - } - - // Step 6: Log success - _logger.LogInfo("Sub-menu item updated successfully. Tenant: {TenantId}, SectionId: {SectionId}, MenuItemId: {ItemId}, SubItemId: {SubItemId}, UserId: {UserId}", - tenantId, sectionId, itemId, subItemId, loggedInEmployee.Id); - - return Ok(ApiResponse.SuccessResponse(result, "Sub-menu item updated successfully.")); - } - catch (Exception ex) - { - // Step 7: Handle unexpected errors - _logger.LogError(ex, "Error occurred while updating sub-menu item. Tenant: {TenantId}, SectionId: {SectionId}, MenuItemId: {ItemId}, SubItemId: {SubItemId}, UserId: {UserId}, Payload: {@UpdatedSubMenuItem}", - tenantId, sectionId, itemId, subItemId, loggedInEmployee.Id, updatedSubMenuItem); - - return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while updating the sub-menu item.", 500)); - } - } - - /// - /// Fetches the sidebar menu for the current tenant and filters items based on employee permissions. - /// - /// The sidebar menu with only the items/sub-items the employee has access to. - - [HttpGet("get/menu")] - public async Task GetAppSideBarMenu() - { - // Step 1: Get logged-in employee - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var employeeId = loggedInEmployee.Id; - - using var scope = _serviceScopeFactory.CreateScope(); - var _permissions = scope.ServiceProvider.GetRequiredService(); - - try - { - // Step 2: Fetch all menu sections for the tenant - var menus = await _sideBarMenuHelper.GetAllMenuSectionsAsync(tenantId); - - if (!(menus?.Any() ?? false)) - { - menus = new List - { - MenuStaticMaster.menu - }; - } - - foreach (var menu in menus) - { - var allowedItems = new List(); - - foreach (var item in menu.Items) - { - // --- Item permission check --- - if (!item.PermissionIds.Any()) - { - allowedItems.Add(item); - } - else - { - // Convert permission string IDs to GUIDs - var menuPermissionIds = item.PermissionIds - .Select(Guid.Parse) - .ToList(); - - bool isAllowed = await _permissions.HasPermissionAny(menuPermissionIds, employeeId); - - // If allowed, filter its submenus as well - if (isAllowed) - { - if (item.Submenu?.Any() == true) - { - var allowedSubmenus = new List(); - - foreach (var subItem in item.Submenu) - { - if (!subItem.PermissionIds.Any()) - { - allowedSubmenus.Add(subItem); - continue; - } - - var subMenuPermissionIds = subItem.PermissionIds - .Select(Guid.Parse) - .ToList(); - - bool isSubItemAllowed = await _permissions.HasPermissionAny(subMenuPermissionIds, employeeId); - - if (isSubItemAllowed) - { - allowedSubmenus.Add(subItem); - } - } - - // Replace with filtered submenus - item.Submenu = allowedSubmenus; - } - - allowedItems.Add(item); - } - } - } - - // Replace with filtered items - menu.Items = allowedItems; - } - - // Step 3: Log success - _logger.LogInfo("Fetched sidebar menu successfully. Tenant: {TenantId}, EmployeeId: {EmployeeId}, SectionsReturned: {Count}", - tenantId, employeeId, menus.Count); - - var response = _mapper.Map>(menus); - return Ok(ApiResponse.SuccessResponse(response, "Sidebar menu fetched successfully")); - } - catch (Exception ex) - { - // Step 4: Handle unexpected errors - _logger.LogError(ex, "Error occurred while fetching sidebar menu. Tenant: {TenantId}, EmployeeId: {EmployeeId}", - tenantId, employeeId); - - return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while fetching the sidebar menu.", 500)); - } - } - /// /// Retrieves the master menu list based on enabled features for the current tenant. /// diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 9a9dac8..b190bc0 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -34,6 +34,7 @@ using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.AppMenu; using Marco.Pms.Model.ViewModels.Collection; using Marco.Pms.Model.ViewModels.Directory; using Marco.Pms.Model.ViewModels.DocumentManager; @@ -564,19 +565,38 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= AppMenu ======================================================= CreateMap(); + CreateMap(); CreateMap(); CreateMap() .ForMember( dest => dest.Name, opt => opt.MapFrom(src => src.Title)); + CreateMap() + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.Title)) + .ForMember( + dest => dest.Items, + opt => opt.MapFrom(src => new List())); + CreateMap(); + CreateMap() + .ForMember( + dest => dest.Id, + opt => opt.MapFrom(src => src.Id.HasValue ? src.Id.Value : Guid.NewGuid())); + CreateMap(); CreateMap() .ForMember( dest => dest.Name, opt => opt.MapFrom(src => src.Text)); + CreateMap() + .ForMember( + dest => dest.Name, + opt => opt.MapFrom(src => src.Text)); + CreateMap(); CreateMap(); CreateMap() -- 2.43.0 From 4c284f9904485114a9a0df91561678cce85d97dc Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 12:06:41 +0530 Subject: [PATCH 34/58] Modified side menu APIs --- .../Utility/SidebarMenuHelper.cs | 233 ++------------- Marco.Pms.Model/AppMenu/WebSideMenuItem.cs | 3 + .../ViewModels/AppMenu/WebMenuSectionVM.cs | 1 - .../Controllers/AppMenuController.cs | 270 ++++++++++-------- .../Controllers/TenantController.cs | 5 +- .../Helpers/CacheUpdateHelper.cs | 2 +- .../Service/PermissionServices.cs | 229 +++++++++++---- 7 files changed, 346 insertions(+), 397 deletions(-) diff --git a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs index 9a17110..844c584 100644 --- a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs +++ b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs @@ -1,15 +1,14 @@ using Marco.Pms.Model.AppMenu; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using MongoDB.Bson; using MongoDB.Driver; namespace Marco.Pms.CacheHelper { public class SidebarMenuHelper { - private readonly IMongoCollection _collection; - private readonly IMongoCollection _webCollection; + private readonly IMongoCollection _oldCollection; + private readonly IMongoCollection _collection; private readonly ILogger _logger; public SidebarMenuHelper(IConfiguration configuration, ILogger logger) @@ -19,17 +18,17 @@ namespace Marco.Pms.CacheHelper var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); var database = client.GetDatabase(mongoUrl.DatabaseName); - _collection = database.GetCollection("Menus"); - _webCollection = database.GetCollection("WebSideMenus"); + _oldCollection = database.GetCollection("Menus"); + _collection = database.GetCollection("WebSideMenus"); } - public async Task> GetAllWebMenuSectionsAsync(Guid tenantId) + public async Task> GetAllWebMenuSectionsAsync(Guid tenantId) { try { - var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - var result = await _webCollection + var result = await _collection .Find(filter) .ToListAsync(); if (result.Any()) @@ -38,9 +37,9 @@ namespace Marco.Pms.CacheHelper } tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); - filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - result = await _webCollection + result = await _collection .Find(filter) .ToListAsync(); return result; @@ -48,229 +47,29 @@ namespace Marco.Pms.CacheHelper catch (Exception ex) { _logger.LogError(ex, "Error occurred while fetching Web Menu Sections."); - return new List(); + return new List(); } } - public async Task CreateWebMenuSectionAsync(WebMenuSection section) + public async Task> AddWebMenuItemAsync(List newItems) { try { - await _webCollection.InsertOneAsync(section); - return section; + await _collection.InsertManyAsync(newItems); + return newItems; } catch (Exception ex) { _logger.LogError(ex, "Error occurred while adding Web Menu Section."); - return null; + return new List(); } } - public async Task AddWebMenuItemAsync(Guid sectionId, List newItems) - { - try - { - - var filter = Builders.Filter.Eq(s => s.Id, sectionId); - - var update = Builders.Update.PushEach(s => s.Items, newItems); - - var result = await _webCollection.UpdateOneAsync(filter, update); - - if (result.ModifiedCount > 0) - { - return await _webCollection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); - } - - return null; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error adding menu item."); - return null; - } - } - public async Task CreateMenuSectionAsync(MenuSection section) - { - try - { - await _collection.InsertOneAsync(section); - return section; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error occurred while adding MenuSection."); - return null; - } - } - - public async Task UpdateMenuSectionAsync(Guid sectionId, MenuSection updatedSection) - { - try - { - var filter = Builders.Filter.Eq(s => s.Id, sectionId); - - var update = Builders.Update - .Set(s => s.Header, updatedSection.Header) - .Set(s => s.Title, updatedSection.Title) - .Set(s => s.Items, updatedSection.Items); - - var result = await _collection.UpdateOneAsync(filter, update); - - if (result.ModifiedCount > 0) - { - return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); - } - - return null; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error updating MenuSection."); - return null; - } - } - - public async Task AddMenuItemAsync(Guid sectionId, MenuItem newItem) - { - try - { - newItem.Id = Guid.NewGuid(); - - var filter = Builders.Filter.Eq(s => s.Id, sectionId); - - var update = Builders.Update.Push(s => s.Items, newItem); - - var result = await _collection.UpdateOneAsync(filter, update); - - if (result.ModifiedCount > 0) - { - return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); - } - - return null; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error adding menu item."); - return null; - } - } - - public async Task UpdateMenuItemAsync(Guid sectionId, Guid itemId, MenuItem updatedItem) - { - try - { - var filter = Builders.Filter.And( - Builders.Filter.Eq(s => s.Id, sectionId), - Builders.Filter.ElemMatch(s => s.Items, i => i.Id == itemId) - ); - - var update = Builders.Update - .Set("Items.$.Text", updatedItem.Text) - .Set("Items.$.Icon", updatedItem.Icon) - .Set("Items.$.Available", updatedItem.Available) - .Set("Items.$.Link", updatedItem.Link) - .Set("Items.$.PermissionIds", updatedItem.PermissionIds); - - var result = await _collection.UpdateOneAsync(filter, update); - - if (result.ModifiedCount > 0) - { - // Re-fetch section and return the updated item - var section = await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); - return section?.Items.FirstOrDefault(i => i.Id == itemId); - } - - return null; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error updating MenuItem."); - return null; - } - } - - public async Task AddSubMenuItemAsync(Guid sectionId, Guid itemId, SubMenuItem newSubItem) - { - try - { - newSubItem.Id = Guid.NewGuid(); - - // Match the MenuSection and the specific MenuItem inside it - var filter = Builders.Filter.And( - Builders.Filter.Eq(s => s.Id, sectionId), - Builders.Filter.ElemMatch(s => s.Items, i => i.Id == itemId) - ); - - // Use positional operator `$` to target matched MenuItem and push into its Submenu - var update = Builders.Update.Push("Items.$.Submenu", newSubItem); - - var result = await _collection.UpdateOneAsync(filter, update); - - if (result.ModifiedCount > 0) - { - return await _collection.Find(s => s.Id == sectionId).FirstOrDefaultAsync(); - } - - return null; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error adding submenu item."); - return null; - } - } - - public async Task UpdateSubmenuItemAsync(Guid sectionId, Guid itemId, Guid subItemId, SubMenuItem updatedSub) - { - try - { - var filter = Builders.Filter.Eq(s => s.Id, sectionId); - - var arrayFilters = new List - { - new BsonDocumentArrayFilterDefinition( - new BsonDocument("item._id", itemId.ToString())), - new BsonDocumentArrayFilterDefinition( - new BsonDocument("sub._id", subItemId.ToString())) - }; - - var update = Builders.Update - .Set("Items.$[item].Submenu.$[sub].Text", updatedSub.Text) - .Set("Items.$[item].Submenu.$[sub].Available", updatedSub.Available) - .Set("Items.$[item].Submenu.$[sub].Link", updatedSub.Link) - .Set("Items.$[item].Submenu.$[sub].PermissionKeys", updatedSub.PermissionIds); - - var options = new UpdateOptions { ArrayFilters = arrayFilters }; - - var result = await _collection.UpdateOneAsync(filter, update, options); - - if (result.ModifiedCount == 0) - return null; - - var updatedSection = await _collection.Find(x => x.Id == sectionId).FirstOrDefaultAsync(); - - var subItem = updatedSection?.Items - .FirstOrDefault(i => i.Id == itemId)? - .Submenu - .FirstOrDefault(s => s.Id == subItemId); - - return subItem; - } - catch (Exception ex) - { - _logger.LogError(ex, "Error updating SubMenuItem."); - return null; - } - } - - public async Task> GetAllMenuSectionsAsync(Guid tenantId) { var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - var result = await _collection + var result = await _oldCollection .Find(filter) .ToListAsync(); if (result.Any()) @@ -281,7 +80,7 @@ namespace Marco.Pms.CacheHelper tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - result = await _collection + result = await _oldCollection .Find(filter) .ToListAsync(); return result; diff --git a/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs index f45bf6f..50483da 100644 --- a/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs +++ b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs @@ -18,5 +18,8 @@ namespace Marco.Pms.Model.AppMenu [BsonRepresentation(BsonType.String)] public List PermissionIds { get; set; } = new List(); + + [BsonRepresentation(BsonType.String)] + public Guid TenantId { get; set; } } } diff --git a/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs b/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs index d233cf8..6c78ece 100644 --- a/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs +++ b/Marco.Pms.Model/ViewModels/AppMenu/WebMenuSectionVM.cs @@ -7,6 +7,5 @@ public string? Header { get; set; } public string? Name { get; set; } public List Items { get; set; } = new List(); - public Guid TenantId { get; set; } } } diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index f42d1f5..0e8a09f 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -53,218 +53,254 @@ namespace Marco.Pms.Services.Controllers tenantId = userHelper.GetTenantId(); } + /// + /// Returns the sidebar menu for the current tenant and logged-in employee, + /// filtered by permission and structured for the web application UI. + /// [HttpGet("get/menu")] public async Task GetAppSideBarMenuAsync() { - // Correlation ID for distributed tracing across services and logs. + // Correlation ID enables tracing this request across services and logs. var correlationId = HttpContext.TraceIdentifier; - _logger.LogInfo("GetAppSideBarMenuAsync started. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + // Log the high-level intent and core context up front (no PII, no secrets). + _logger.LogInfo("GetAppSideBarMenuAsync started. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); try { - // Step 1: Validate tenant context + // 1. Validate tenant context if (tenantId == Guid.Empty) { - _logger.LogWarning("GetAppSideBarMenuAsync rejected: Invalid TenantId. CorrelationId: {CorrelationId}", correlationId); + _logger.LogWarning("GetAppSideBarMenuAsync rejected due to invalid tenant. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); - return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "The tenant identifier provided is invalid or missing.", 400)); + var error = ApiResponse.ErrorResponse("Invalid Tenant Identifier", "The tenant identifier is missing or invalid. Please verify the tenant context and try again.", 400); + + return BadRequest(error); } - // Step 2: Resolve current employee context for permission checks + // 2. Resolve current employee context + // - This call should throw or return a known result if the user is not authenticated. var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var employeeId = loggedInEmployee.Id; + if (loggedInEmployee is null) + { + _logger.LogWarning("GetAppSideBarMenuAsync failed: current employee not resolved. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); - // Step 3: Create scoped permission service (avoid capturing scoped services in controller) - using var scope = _serviceScopeFactory.CreateScope(); - var permissions = scope.ServiceProvider.GetRequiredService(); + var error = ApiResponse.ErrorResponse("User Context Not Found", "The current user context could not be resolved. Please re-authenticate and try again.", 403); + + return StatusCode(403, error); + } + + var employeeId = loggedInEmployee.Id; _logger.LogDebug("GetAppSideBarMenuAsync resolved employee context. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", employeeId, tenantId, correlationId); - // Step 4: Fetch all menu sections for tenant (null-safe check) + // 3. Create scoped permission service + // - Avoid capturing scoped services directly in controller ctor when they depend on per-request state. + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + + // 4. Preload all permission ids for the employee for efficient in-memory checks + var permissionIds = await permissionService.GetPermissionIdsByEmployeeId(employeeId); + + _logger.LogDebug("GetAppSideBarMenuAsync loaded {PermissionCount} permissions for EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", + permissionIds.Count, employeeId, correlationId); + + // 5. Fetch all menu entries configured for this tenant var menus = await _sideBarMenuHelper.GetAllWebMenuSectionsAsync(tenantId); + if (menus == null || !menus.Any()) { - _logger.LogInfo("GetAppSideBarMenuAsync: No menu sections found. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + _logger.LogInfo("GetAppSideBarMenuAsync: No menu sections found for tenant. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); - return Ok(ApiResponse.SuccessResponse(new List(), "No sidebar menu sections configured for this tenant.", 200)); + + var emptyResponse = new List(); + + return Ok(ApiResponse.SuccessResponse(emptyResponse, "No sidebar menu sections are configured for the current tenant.", 200)); } - _logger.LogDebug("GetAppSideBarMenuAsync loaded {MenuSectionCount} menu sections. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + _logger.LogDebug("GetAppSideBarMenuAsync loaded {MenuSectionCount} raw menu records. TenantId: {TenantId}, CorrelationId: {CorrelationId}", menus.Count, tenantId, correlationId); - // Step 5: Filter and build menu response with permission checks - var response = new List(); + // 6. Build logical menu sections (root + children) and apply permission filtering + var responseSections = new List(); - foreach (var menuSection in menus) + // Root container section for the web UI. + var rootSection = new WebMenuSectionVM { - var sectionVM = _mapper.Map(menuSection); - if (menuSection.Items == null) + Id = Guid.Parse("4885d9f4-89b8-447d-9a95-7434b343dfda"), + Header = "Main Navigation", + Name = "Main Menu" + }; + + // To avoid multiple enumerations and improve readability, materialize once. + var menusList = menus.ToList(); + + foreach (var menu in menusList) + { + // Skip any non-root menu entry; these will be attached as children. + if (menu.ParentMenuId.HasValue) { - _logger.LogDebug("Skipping menu section with null items. SectionId: {SectionId}, TenantId: {TenantId}", menuSection.Id, tenantId); continue; } + var itemVm = _mapper.Map(menu); - foreach (var menuItem in menuSection.Items) + // If the menu requires any permission, check now. + if (menu.PermissionIds.Any()) { - // Skip items without permission check if required - if (menuItem.PermissionIds.Any()) + var hasMenuPermission = permissionService.HasPermissionAny(permissionIds, menu.PermissionIds, employeeId); + + if (!hasMenuPermission) { - var hasPermission = await permissions.HasPermissionAny(menuItem.PermissionIds, employeeId); - if (!hasPermission) + _logger.LogDebug("Menu item skipped due to insufficient permissions. MenuId: {MenuId}, EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", + menu.Id, employeeId, correlationId); + continue; + } + } + + // Resolve submenus only for eligible root menu entries. + var subMenus = menusList + .Where(m => m.ParentMenuId.HasValue && m.ParentMenuId == menu.Id) + .ToList(); + + foreach (var subMenu in subMenus) + { + var subMenuVm = _mapper.Map(subMenu); + + // If the submenu requires permissions, validate before adding. + if (subMenu.PermissionIds.Any()) + { + var hasSubPermission = permissionService.HasPermissionAny(permissionIds, subMenu.PermissionIds, employeeId); + + if (!hasSubPermission) { - _logger.LogDebug("Menu item access denied due to missing permissions. ItemId: {ItemId}, EmployeeId: {EmployeeId}, TenantId: {TenantId}", - menuItem.Id, employeeId, tenantId); + _logger.LogDebug( + "Submenu item skipped due to insufficient permissions. MenuId: {MenuId}, ParentMenuId: {ParentMenuId}, EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", + subMenu.Id, subMenu.ParentMenuId!, employeeId, correlationId); continue; } } - var itemVM = _mapper.Map(menuItem); - if (menuItem.ParentMenuId.HasValue) - { - sectionVM.Items.Where(i => i.Id == menuItem.ParentMenuId.Value).FirstOrDefault()?.Submenu.Add(itemVM); - } - else - { - sectionVM.Items.Add(itemVM); - } - } - - // Only include sections with at least one accessible item - if (sectionVM.Items.Any()) - { - response.Add(sectionVM); + // Add the submenu to the root section + itemVm.Submenu.Add(subMenuVm); } + // Add the root menu item + rootSection.Items.Add(itemVm); } - _logger.LogInfo("GetAppSideBarMenuAsync completed successfully. TenantId: {TenantId}, EmployeeId: {EmployeeId}, OriginalSections: {OriginalCount}, FilteredSections: {FilteredCount}, CorrelationId: {CorrelationId}", - tenantId, employeeId, menus.Count, response.Count, correlationId); + if (rootSection.Items.Any()) + { + responseSections.Add(rootSection); + } - return Ok(ApiResponse.SuccessResponse(response, $"Sidebar menu fetched successfully. {response.Count} sections returned.", 200)); + _logger.LogInfo( + "GetAppSideBarMenuAsync completed successfully. TenantId: {TenantId}, EmployeeId: {EmployeeId}, OriginalMenuCount: {OriginalCount}, ReturnedSectionCount: {SectionCount}, CorrelationId: {CorrelationId}", + tenantId, employeeId, menusList.Count, responseSections.Count, correlationId); + + return Ok(ApiResponse.SuccessResponse(responseSections, + responseSections.Any() + ? $"Sidebar menu fetched successfully. {responseSections.Count} section(s) returned." + : "No accessible sidebar menu items were found for the current user.", 200)); } catch (OperationCanceledException) { - _logger.LogWarning("GetAppSideBarMenuAsync cancelled. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + // This typically indicates client disconnected or explicit cancellation. + _logger.LogWarning("GetAppSideBarMenuAsync was cancelled. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); - return StatusCode(499, ApiResponse.ErrorResponse("Request Cancelled", "The request was cancelled by the client.", 499)); + var error = ApiResponse.ErrorResponse("Request Cancelled", "The operation was cancelled, likely due to a client disconnection or explicit cancellation request.", 499); // Non-standard but commonly used in APIs for client closed request. + + return StatusCode(499, error); } catch (UnauthorizedAccessException ex) { - _logger.LogError(ex, "GetAppSideBarMenuAsync authorization failed. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + // Handle authorization-related errors explicitly to avoid leaking details. + _logger.LogError(ex, "GetAppSideBarMenuAsync authorization failure. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); - return StatusCode(403, (ApiResponse.ErrorResponse("Access Denied", "Insufficient permissions to access menu sections.", 403))); + var error = ApiResponse.ErrorResponse("Access Denied", "You do not have sufficient permissions to access the sidebar menu.", 403); + + return StatusCode(403, error); } catch (Exception ex) { - _logger.LogError(ex, "Unexpected error in GetAppSideBarMenuAsync. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + // Fallback handler for unexpected failures. Keep log detailed, response generic. + _logger.LogError(ex, "Unhandled exception in GetAppSideBarMenuAsync. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); - return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An unexpected error occurred while fetching the sidebar menu.", 500)); + var error = ApiResponse.ErrorResponse("Internal Server Error", "An unexpected error occurred while processing the sidebar menu request. Please try again later.", 500); + + return StatusCode(500, error); } } - [HttpPost("add/sidebar/menu-section")] - public async Task CreateAppSideBarMenuAsync([FromBody] CreateWebMenuSectionDto model) + + [HttpPost("add/side-menu")] + public async Task AddMenuItemAsync([FromBody] List model) { - // Step 1: Fetch logged-in user + // Step 1: Validate tenant context + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetAppSideBarMenuAsync rejected: Invalid TenantId."); + + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "The tenant identifier provided is invalid or missing.", 400)); + } + + // Step 2: Fetch logged-in user var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - // Step 2: Authorization check - if (!isRootUser || tenantId != superTenantId) - { - _logger.LogWarning("Access denied: Employee {EmployeeId} attempted to create sidebar menu in Tenant {TenantId}", loggedInEmployee.Id, tenantId); - return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); - } - - // Step 3: Map DTO to entity - var sideMenuSection = _mapper.Map(model); - sideMenuSection.TenantId = tenantId; - - try - { - // Step 4: Save entity using helper - sideMenuSection = await _sideBarMenuHelper.CreateWebMenuSectionAsync(sideMenuSection); - - if (sideMenuSection == null) - { - _logger.LogWarning("Failed to create sidebar menu section. Tenant: {TenantId}, Request: {@MenuSectionDto}", tenantId, model); - return BadRequest(ApiResponse.ErrorResponse("Invalid MenuSection", 400)); - } - - // Step 5: Log success - _logger.LogInfo("Sidebar menu created successfully. SectionId: {SectionId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", - sideMenuSection.Id, tenantId, loggedInEmployee.Id); - - return Ok(ApiResponse.SuccessResponse(sideMenuSection, "Sidebar menu created successfully.", 201)); - } - catch (Exception ex) - { - // Step 6: Handle and log unexpected server errors - _logger.LogError(ex, "Unexpected error occurred while creating sidebar menu. Tenant: {TenantId}, EmployeeId: {EmployeeId}, Request: {@MenuSectionDto}", - tenantId, loggedInEmployee.Id, model); - - return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred.", 500)); - } - } - - [HttpPost("add/sidebar/section/{sectionId}/items")] - public async Task AddMenuItemAsync(Guid sectionId, [FromBody] List model) - { - // Step 1: Fetch logged-in user - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; - - // Step 2: Authorization check + // Step 3: Authorization check if (!isRootUser && tenantId != superTenantId) { - _logger.LogWarning("Access denied: User {UserId} attempted to add menu item to section {SectionId} in Tenant {TenantId}", - loggedInEmployee.Id, sectionId, tenantId); + _logger.LogWarning("Access denied: User {UserId} attempted to add menu item in Tenant {TenantId}", + loggedInEmployee.Id, tenantId); return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); } - // Step 3: Input validation - if (sectionId == Guid.Empty || model == null) + // Step 4: Input validation + if (model == null) { - _logger.LogWarning("Invalid AddMenuItem request. Tenant: {TenantId}, SectionId: {SectionId}, UserId: {UserId}", - tenantId, sectionId, loggedInEmployee.Id); + _logger.LogWarning("Invalid AddMenuItem request. Tenant: {TenantId}, UserId: {UserId}", + tenantId, loggedInEmployee.Id); return BadRequest(ApiResponse.ErrorResponse("Invalid section ID or menu item payload.", 400)); } try { - // Step 4: Map DTO to entity + // Step 5: Map DTO to entity var menuItemEntity = _mapper.Map>(model); - // Step 5: Perform Add operation - var result = await _sideBarMenuHelper.AddWebMenuItemAsync(sectionId, menuItemEntity); + menuItemEntity.ForEach(m => m.TenantId = tenantId); + + // Step 6: Perform Add operation + var result = await _sideBarMenuHelper.AddWebMenuItemAsync(menuItemEntity); if (result == null) { - _logger.LogWarning("Menu section not found. Unable to add menu item. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}", - sectionId, tenantId, loggedInEmployee.Id); + _logger.LogWarning("Menu section not found. Unable to add menu item. TenantId: {TenantId}, UserId: {UserId}", tenantId, loggedInEmployee.Id); return NotFound(ApiResponse.ErrorResponse("Menu section not found", 404)); } - // Step 6: Successful addition - _logger.LogInfo("Menu item added successfully. SectionId: {SectionId}, MenuItemId: {MenuItemId}, TenantId: {TenantId}, UserId: {UserId}", - sectionId, result.Id, tenantId, loggedInEmployee.Id); + // Step 7: Successful addition + _logger.LogInfo("Menu items added successfully TenantId: {TenantId}, UserId: {UserId}", + tenantId, loggedInEmployee.Id); return Ok(ApiResponse.SuccessResponse(result, "Menu item added successfully")); } catch (Exception ex) { - // Step 7: Handle unexpected errors - _logger.LogError(ex, "Error occurred while adding menu item. SectionId: {SectionId}, TenantId: {TenantId}, UserId: {UserId}, Payload: {@NewItemDto}", - sectionId, tenantId, loggedInEmployee.Id, model); + // Step 8: Handle unexpected errors + _logger.LogError(ex, "Error occurred while adding menu item. TenantId: {TenantId}, UserId: {UserId}, Payload: {@NewItemDto}", + tenantId, loggedInEmployee.Id, model); return StatusCode(500, ApiResponse.ErrorResponse("Server error", "An unexpected error occurred while adding the menu item.", 500)); } diff --git a/Marco.Pms.Services/Controllers/TenantController.cs b/Marco.Pms.Services/Controllers/TenantController.cs index 6f8f130..899e4a5 100644 --- a/Marco.Pms.Services/Controllers/TenantController.cs +++ b/Marco.Pms.Services/Controllers/TenantController.cs @@ -384,7 +384,10 @@ namespace Marco.Pms.Services.Controllers response.CreatedBy = createdBy; response.CurrentPlan = _mapper.Map(currentPlan); - response.CurrentPlan.PaymentDetail = paymentsDetails.FirstOrDefault(pd => currentPlan != null && pd.Id == currentPlan.PaymentDetailId); + if (currentPlan != null) + { + response.CurrentPlan.PaymentDetail = paymentsDetails.FirstOrDefault(pd => pd.Id == currentPlan.PaymentDetailId); + } response.CurrentPlanFeatures = await _featureDetailsHelper.GetFeatureDetails(currentPlan?.Plan?.FeaturesId ?? Guid.Empty); // Map subscription history plans to DTO diff --git a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs index 4dd5377..a37ab63 100644 --- a/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs +++ b/Marco.Pms.Services/Helpers/CacheUpdateHelper.cs @@ -809,7 +809,7 @@ namespace Marco.Pms.Services.Helpers } Task> getPermissionIdsTask = Task.Run(async () => { - using var context = _dbContextFactory.CreateDbContext(); + await using var context = await _dbContextFactory.CreateDbContextAsync(); return await context.RolePermissionMappings .Where(rp => roleIds.Contains(rp.ApplicationRoleId)) diff --git a/Marco.Pms.Services/Service/PermissionServices.cs b/Marco.Pms.Services/Service/PermissionServices.cs index be759dc..cbe5dd2 100644 --- a/Marco.Pms.Services/Service/PermissionServices.cs +++ b/Marco.Pms.Services/Service/PermissionServices.cs @@ -4,6 +4,7 @@ using Marco.Pms.Model.Entitlements; using Marco.Pms.Services.Helpers; using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Service; +using Microsoft.CodeAnalysis; using Microsoft.EntityFrameworkCore; namespace Marco.Pms.Services.Service @@ -11,15 +12,13 @@ namespace Marco.Pms.Services.Service public class PermissionServices { private readonly ApplicationDbContext _context; - private readonly RolesHelper _rolesHelper; private readonly CacheUpdateHelper _cache; private readonly ILoggingService _logger; private readonly Guid tenantId; - public PermissionServices(ApplicationDbContext context, RolesHelper rolesHelper, CacheUpdateHelper cache, ILoggingService logger, UserHelper userHelper) + public PermissionServices(ApplicationDbContext context, CacheUpdateHelper cache, ILoggingService logger, UserHelper userHelper) { _context = context; - _rolesHelper = rolesHelper; _cache = cache; _logger = logger; tenantId = userHelper.GetTenantId(); @@ -34,72 +33,23 @@ namespace Marco.Pms.Services.Service /// True if the user has the permission, otherwise false. public async Task HasPermission(Guid featurePermissionId, Guid employeeId, Guid? projectId = null) { - // 1. Try fetching permissions from cache (fast-path lookup). - var featurePermissionIds = await _cache.GetPermissions(employeeId, tenantId); + var featurePermissionIds = await GetPermissionIdsByEmployeeId(employeeId, projectId); - // If not found in cache, fallback to database (slower). - if (featurePermissionIds == null) - { - var featurePermissions = await _rolesHelper.GetFeaturePermissionByEmployeeId(employeeId, tenantId); - featurePermissionIds = featurePermissions.Select(fp => fp.Id).ToList(); - } - - // 2. Handle project-level permission overrides if a project is specified. - if (projectId.HasValue) - { - // Fetch permissions explicitly assigned to this employee in the project. - var projectLevelPermissionIds = await _context.ProjectLevelPermissionMappings - .AsNoTracking() - .Where(pl => pl.ProjectId == projectId.Value && pl.EmployeeId == employeeId) - .Select(pl => pl.PermissionId) - .ToListAsync(); - - if (projectLevelPermissionIds?.Any() ?? false) - { - - // Define modules where project-level overrides apply. - var projectLevelModuleIds = new HashSet - { - Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), - Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), - Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), - Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") - }; - - // Get all feature permissions under those modules where the user didn't have explicit project-level grants. - var allOverriddenPermissions = await _context.FeaturePermissions - .AsNoTracking() - .Where(fp => projectLevelModuleIds.Contains(fp.FeatureId) && - !projectLevelPermissionIds.Contains(fp.Id)) - .Select(fp => fp.Id) - .ToListAsync(); - - // Apply overrides: - // - Remove global permissions overridden by project-level rules. - // - Add explicit project-level permissions. - featurePermissionIds = featurePermissionIds - .Except(allOverriddenPermissions) // Remove overridden - .Concat(projectLevelPermissionIds) // Add project-level - .Distinct() // Ensure no duplicates - .ToList(); - } - } - - // 3. Final check: does the employee have the requested permission? return featurePermissionIds.Contains(featurePermissionId); } public async Task HasPermissionAny(List featurePermissionIds, Guid employeeId) { - var allFeaturePermissionIds = await _cache.GetPermissions(employeeId, tenantId); - if (allFeaturePermissionIds == null) - { - List featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeId(employeeId, tenantId); - allFeaturePermissionIds = featurePermission.Select(fp => fp.Id).ToList(); - } + var allFeaturePermissionIds = await GetPermissionIdsByEmployeeId(employeeId); + var hasPermission = featurePermissionIds.Any(f => allFeaturePermissionIds.Contains(f)); return hasPermission; } + public bool HasPermissionAny(List realPermissionIds, List toCheckPermissionIds, Guid employeeId) + { + var hasPermission = toCheckPermissionIds.Any(f => realPermissionIds.Contains(f)); + return hasPermission; + } public async Task HasProjectPermission(Employee LoggedInEmployee, Guid projectId) { var employeeId = LoggedInEmployee.Id; @@ -199,5 +149,164 @@ namespace Marco.Pms.Services.Service return false; } } + + /// + /// Retrieves permission IDs for an employee, supporting both global role-based permissions + /// and project-specific overrides with cache-first strategy. + /// + /// The ID of the employee to fetch permissions for. + /// Optional project ID for project-level permission overrides. + /// List of unique permission IDs the employee has access to. + /// Thrown when employeeId or tenantId is empty. + public async Task> GetPermissionIdsByEmployeeId(Guid employeeId, Guid? projectId = null) + { + // Input validation + if (employeeId == Guid.Empty) + { + _logger.LogWarning("EmployeeId cannot be empty."); + return new List(); + } + + if (tenantId == Guid.Empty) + { + _logger.LogWarning("TenantId cannot be empty."); + return new List(); + } + _logger.LogDebug( + "GetPermissionIdsByEmployeeId started. EmployeeId: {EmployeeId}, ProjectId: {ProjectId}, TenantId: {TenantId}", + employeeId, projectId ?? Guid.Empty, tenantId); + + try + { + // Phase 1: Cache-first lookup for role-based permissions (fast path) + var featurePermissionIds = await _cache.GetPermissions(employeeId, tenantId); + var permissionsFromCache = featurePermissionIds != null; + + _logger.LogDebug( + "Permission lookup from cache: {CacheHit}, InitialPermissions: {PermissionCount}, EmployeeId: {EmployeeId}", + permissionsFromCache, featurePermissionIds?.Count ?? 0, employeeId); + + // Phase 2: Database fallback if cache miss + if (featurePermissionIds == null) + { + _logger.LogDebug( + "Cache miss detected, falling back to database lookup. EmployeeId: {EmployeeId}, TenantId: {TenantId}", + employeeId, tenantId); + + var roleIds = await _context.EmployeeRoleMappings + .Where(erm => erm.EmployeeId == employeeId && erm.TenantId == tenantId) + .Select(erm => erm.RoleId) + .ToListAsync(); + + if (!roleIds.Any()) + { + _logger.LogDebug( + "No roles found for employee. EmployeeId: {EmployeeId}, TenantId: {TenantId}", + employeeId, tenantId); + return new List(); + } + + featurePermissionIds = await _context.RolePermissionMappings + .Where(rpm => roleIds.Contains(rpm.ApplicationRoleId)) + .Select(rpm => rpm.FeaturePermissionId) + .Distinct() + .ToListAsync(); + + // The cache service might also need its own context, or you can pass the data directly. + // Assuming AddApplicationRole takes the data, not a context. + await _cache.AddApplicationRole(employeeId, roleIds, tenantId); + _logger.LogInfo("Successfully queued cache update for EmployeeId: {EmployeeId}", employeeId); + + _logger.LogDebug( + "Loaded {RoleCount} roles → {PermissionCount} permissions from database. EmployeeId: {EmployeeId}", + roleIds.Count, featurePermissionIds.Count, employeeId); + } + + // Early return for global permissions (no project context) + if (!projectId.HasValue) + { + _logger.LogDebug( + "Returning global permissions. Count: {PermissionCount}, EmployeeId: {EmployeeId}", + featurePermissionIds.Count, employeeId); + return featurePermissionIds; + } + + // Phase 3: Apply project-level permission overrides + _logger.LogDebug( + "Applying project-level overrides. ProjectId: {ProjectId}, EmployeeId: {EmployeeId}", + projectId.Value, employeeId); + + var projectLevelPermissionIds = await _context.ProjectLevelPermissionMappings + .AsNoTracking() + .Where(pl => pl.ProjectId == projectId.Value && + pl.EmployeeId == employeeId) + .Select(pl => pl.PermissionId) + .Distinct() + .ToListAsync(); + + if (!projectLevelPermissionIds.Any()) + { + _logger.LogDebug( + "No project-level permissions found. ProjectId: {ProjectId}, EmployeeId: {EmployeeId}", + projectId.Value, employeeId); + return featurePermissionIds; + } + + // Phase 4: Override logic for specific project modules + var projectOverrideModules = new HashSet + { + // Hard-coded module IDs for project-level override scope + // TODO: Consider moving to configuration or database lookup + Guid.Parse("53176ebf-c75d-42e5-839f-4508ffac3def"), // Module: Projects + Guid.Parse("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), // Module: Expenses + Guid.Parse("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), // Module: Invoices + Guid.Parse("a8cf4331-8f04-4961-8360-a3f7c3cc7462") // Module: Documents + }; + + // Find permissions in override modules that employee lacks at project level + var overriddenPermissions = await _context.FeaturePermissions + .AsNoTracking() + .Where(fp => projectOverrideModules.Contains(fp.FeatureId) && + !projectLevelPermissionIds.Contains(fp.Id)) + .Select(fp => fp.Id) + .ToListAsync(); + + // Apply override rules: + // 1. Remove global permissions overridden by project context + // 2. Add explicit project-level grants + // 3. Ensure uniqueness + var finalPermissions = featurePermissionIds + .Except(overriddenPermissions) // Remove overridden global perms + .Concat(projectLevelPermissionIds) // Add project-specific grants + .Distinct() // Deduplicate + .ToList(); + + _logger.LogDebug( + "Project override applied. Before: {BeforeCount}, After: {AfterCount}, Added: {AddedCount}, Removed: {RemovedCount}, EmployeeId: {EmployeeId}", + featurePermissionIds.Count, finalPermissions.Count, + projectLevelPermissionIds.Count, overriddenPermissions.Count, employeeId); + + return finalPermissions; + } + catch (OperationCanceledException) + { + _logger.LogWarning("GetPermissionIdsByEmployeeId cancelled. EmployeeId: {EmployeeId}", employeeId); + + return new List(); + } + catch (DbUpdateException ex) + { + _logger.LogError(ex, "Database error in GetPermissionIdsByEmployeeId. EmployeeId: {EmployeeId}, TenantId: {TenantId}", employeeId, tenantId); + + return new List(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Unexpected error in GetPermissionIdsByEmployeeId. EmployeeId: {EmployeeId}, TenantId: {TenantId}", employeeId, tenantId); + + return new List(); + } + } + } } -- 2.43.0 From c5949606aa404ccf48e3c61fed4f843fe4970d35 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 12:49:46 +0530 Subject: [PATCH 35/58] Changed the text to name --- Marco.Pms.Model/AppMenu/WebMenuSection.cs | 2 +- Marco.Pms.Model/AppMenu/WebSideMenuItem.cs | 2 +- .../Dtos/AppMenu/CreateMenuItemDto.cs | 17 ------------ .../Dtos/AppMenu/CreateMenuSectionDto.cs | 9 ------- .../Dtos/AppMenu/CreateSubMenuItemDto.cs | 13 --------- .../Dtos/AppMenu/UpdateMenuItemDto.cs | 17 ------------ .../Dtos/AppMenu/UpdateMenuSectionDto.cs | 9 ------- .../Dtos/AppMenu/UpdateSubMenuItemDto.cs | 16 ----------- .../ViewModels/DocumentManager/MenuItemVM.cs | 13 --------- .../DocumentManager/MenuSectionVM.cs | 11 -------- .../DocumentManager/SubMenuItemVM.cs | 12 --------- .../Controllers/AppMenuController.cs | 1 - .../MappingProfiles/MappingProfile.cs | 27 ++----------------- 13 files changed, 4 insertions(+), 145 deletions(-) delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateMenuItemDto.cs delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateMenuSectionDto.cs delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateSubMenuItemDto.cs delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/UpdateMenuItemDto.cs delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/UpdateMenuSectionDto.cs delete mode 100644 Marco.Pms.Model/Dtos/AppMenu/UpdateSubMenuItemDto.cs delete mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs delete mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs delete mode 100644 Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs diff --git a/Marco.Pms.Model/AppMenu/WebMenuSection.cs b/Marco.Pms.Model/AppMenu/WebMenuSection.cs index 121d918..1ccfcab 100644 --- a/Marco.Pms.Model/AppMenu/WebMenuSection.cs +++ b/Marco.Pms.Model/AppMenu/WebMenuSection.cs @@ -10,7 +10,7 @@ namespace Marco.Pms.Model.AppMenu public Guid Id { get; set; } = Guid.NewGuid(); public string? Header { get; set; } - public string? Title { get; set; } + public string? Name { get; set; } public List Items { get; set; } = new List(); [BsonRepresentation(BsonType.String)] diff --git a/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs index 50483da..d9e76ef 100644 --- a/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs +++ b/Marco.Pms.Model/AppMenu/WebSideMenuItem.cs @@ -11,7 +11,7 @@ namespace Marco.Pms.Model.AppMenu [BsonRepresentation(BsonType.String)] public Guid? ParentMenuId { get; set; } - public string? Text { get; set; } + public string? Name { get; set; } public string? Icon { get; set; } public bool Available { get; set; } = true; public string Link { get; set; } = string.Empty; diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateMenuItemDto.cs deleted file mode 100644 index a932aa9..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/CreateMenuItemDto.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class CreateMenuItemDto - { - public required string Text { get; set; } - public required string Icon { get; set; } - public bool Available { get; set; } = true; - - public required string Link { get; set; } - public string? MobileLink { get; set; } - - // Changed from string → List - public List PermissionIds { get; set; } = new List(); - - public List Submenu { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateMenuSectionDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateMenuSectionDto.cs deleted file mode 100644 index e64c137..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/CreateMenuSectionDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class CreateMenuSectionDto - { - public required string Header { get; set; } - public required string Title { get; set; } - public List Items { get; set; } = new List(); - } -} \ No newline at end of file diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateSubMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateSubMenuItemDto.cs deleted file mode 100644 index 60eb92c..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/CreateSubMenuItemDto.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class CreateSubMenuItemDto - { - public required string Text { get; set; } - public bool Available { get; set; } = true; - - public required string Link { get; set; } = string.Empty; - public string? MobileLink { get; set; } - // Changed from string → List - public List PermissionIds { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuItemDto.cs deleted file mode 100644 index b3433f7..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuItemDto.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class UpdateMenuItemDto - { - public required Guid Id { get; set; } - - public required string Text { get; set; } - public required string Icon { get; set; } - public bool Available { get; set; } = true; - - public required string Link { get; set; } - public string? MobileLink { get; set; } - - // Changed from string → List - public List PermissionIds { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuSectionDto.cs b/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuSectionDto.cs deleted file mode 100644 index f42794e..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/UpdateMenuSectionDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class UpdateMenuSectionDto - { - public required Guid Id { get; set; } - public required string Header { get; set; } - public required string Title { get; set; } - } -} diff --git a/Marco.Pms.Model/Dtos/AppMenu/UpdateSubMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/UpdateSubMenuItemDto.cs deleted file mode 100644 index 746e1f4..0000000 --- a/Marco.Pms.Model/Dtos/AppMenu/UpdateSubMenuItemDto.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Marco.Pms.Model.Dtos.AppMenu -{ - public class UpdateSubMenuItemDto - { - public Guid Id { get; set; } - - public string? Text { get; set; } - public bool Available { get; set; } = true; - - public string Link { get; set; } = string.Empty; - public string? MobileLink { get; set; } - - // Changed from string → List - public List PermissionIds { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs deleted file mode 100644 index 5925fe0..0000000 --- a/Marco.Pms.Model/ViewModels/DocumentManager/MenuItemVM.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Marco.Pms.Model.ViewModels.DocumentManager -{ - public class MenuItemVM - { - public Guid Id { get; set; } - - public string? Name { get; set; } - public string? Icon { get; set; } - public bool Available { get; set; } - public string? Link { get; set; } - public List Submenu { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs deleted file mode 100644 index cae8e50..0000000 --- a/Marco.Pms.Model/ViewModels/DocumentManager/MenuSectionVM.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Marco.Pms.Model.ViewModels.DocumentManager -{ - public class MenuSectionVM - { - public Guid Id { get; set; } - - public string? Header { get; set; } - public string? Name { get; set; } - public List Items { get; set; } = new List(); - } -} diff --git a/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs b/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs deleted file mode 100644 index ef14686..0000000 --- a/Marco.Pms.Model/ViewModels/DocumentManager/SubMenuItemVM.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Marco.Pms.Model.ViewModels.DocumentManager -{ - public class SubMenuItemVM - { - public Guid Id { get; set; } - - public string? Name { get; set; } - public bool Available { get; set; } - - public string? Link { get; set; } - } -} diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 0e8a09f..2fe63dd 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -239,7 +239,6 @@ namespace Marco.Pms.Services.Controllers } } - [HttpPost("add/side-menu")] public async Task AddMenuItemAsync([FromBody] List model) { diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index b190bc0..865e668 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -564,45 +564,22 @@ namespace Marco.Pms.Services.MappingProfiles #endregion #region ======================================================= AppMenu ======================================================= - CreateMap(); CreateMap(); - CreateMap(); - CreateMap() - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.Title)); CreateMap() - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.Title)) .ForMember( dest => dest.Items, opt => opt.MapFrom(src => new List())); - CreateMap(); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => src.Id.HasValue ? src.Id.Value : Guid.NewGuid())); - CreateMap(); - CreateMap() - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.Text)); - CreateMap() - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.Text)); + CreateMap(); - CreateMap(); - CreateMap(); - CreateMap() - .ForMember( - dest => dest.Name, - opt => opt.MapFrom(src => src.Text)); #endregion #region ======================================================= Directory ======================================================= -- 2.43.0 From 20df833c48d6b8dacbb2cc1afcf533b7a0301325 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 15:14:57 +0530 Subject: [PATCH 36/58] Added API to get side menu for mobile --- .../Utility/SidebarMenuHelper.cs | 69 ++- Marco.Pms.Model/AppMenu/MobileMenu.cs | 21 + .../AppMenu/CreateMobileSideMenuItemDto.cs | 13 + .../Dtos/AppMenu/CreateWebSideMenuItemDto.cs | 2 +- .../Controllers/AppMenuController.cs | 444 ++++++++---------- .../MappingProfiles/MappingProfile.cs | 3 + 6 files changed, 281 insertions(+), 271 deletions(-) create mode 100644 Marco.Pms.Model/AppMenu/MobileMenu.cs create mode 100644 Marco.Pms.Model/Dtos/AppMenu/CreateMobileSideMenuItemDto.cs diff --git a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs index 844c584..1ca6795 100644 --- a/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs +++ b/Marco.Pms.Helpers/Utility/SidebarMenuHelper.cs @@ -7,8 +7,8 @@ namespace Marco.Pms.CacheHelper { public class SidebarMenuHelper { - private readonly IMongoCollection _oldCollection; - private readonly IMongoCollection _collection; + private readonly IMongoCollection _webCollection; + private readonly IMongoCollection _mobileCollection; private readonly ILogger _logger; public SidebarMenuHelper(IConfiguration configuration, ILogger logger) @@ -18,8 +18,9 @@ namespace Marco.Pms.CacheHelper var mongoUrl = new MongoUrl(connectionString); var client = new MongoClient(mongoUrl); var database = client.GetDatabase(mongoUrl.DatabaseName); - _oldCollection = database.GetCollection("Menus"); - _collection = database.GetCollection("WebSideMenus"); + _webCollection = database.GetCollection("WebSideMenus"); + _mobileCollection = database.GetCollection("MobileSideMenus"); + } public async Task> GetAllWebMenuSectionsAsync(Guid tenantId) @@ -28,7 +29,7 @@ namespace Marco.Pms.CacheHelper { var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - var result = await _collection + var result = await _webCollection .Find(filter) .ToListAsync(); if (result.Any()) @@ -39,7 +40,7 @@ namespace Marco.Pms.CacheHelper tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - result = await _collection + result = await _webCollection .Find(filter) .ToListAsync(); return result; @@ -50,12 +51,11 @@ namespace Marco.Pms.CacheHelper return new List(); } } - public async Task> AddWebMenuItemAsync(List newItems) { try { - await _collection.InsertManyAsync(newItems); + await _webCollection.InsertManyAsync(newItems); return newItems; } catch (Exception ex) @@ -64,27 +64,48 @@ namespace Marco.Pms.CacheHelper return new List(); } } - - public async Task> GetAllMenuSectionsAsync(Guid tenantId) + public async Task> GetAllMobileMenuSectionsAsync(Guid tenantId) { - var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - - var result = await _oldCollection - .Find(filter) - .ToListAsync(); - if (result.Any()) + try { + var filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + + var result = await _mobileCollection + .Find(filter) + .ToListAsync(); + if (result.Any()) + { + return result; + } + + tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); + filter = Builders.Filter.Eq(e => e.TenantId, tenantId); + + result = await _mobileCollection + .Find(filter) + .ToListAsync(); return result; } - - tenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); - filter = Builders.Filter.Eq(e => e.TenantId, tenantId); - - result = await _oldCollection - .Find(filter) - .ToListAsync(); - return result; + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while fetching Web Menu Sections."); + return new List(); + } } + public async Task> AddMobileMenuItemAsync(List newItems) + { + try + { + await _mobileCollection.InsertManyAsync(newItems); + return newItems; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while adding Mobile Menu Section."); + return new List(); + } + } + } diff --git a/Marco.Pms.Model/AppMenu/MobileMenu.cs b/Marco.Pms.Model/AppMenu/MobileMenu.cs new file mode 100644 index 0000000..fbe1075 --- /dev/null +++ b/Marco.Pms.Model/AppMenu/MobileMenu.cs @@ -0,0 +1,21 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.AppMenu +{ + public class MobileMenu + { + [BsonId] + [BsonRepresentation(BsonType.String)] + public Guid Id { get; set; } + public string? Name { get; set; } + public bool Available { get; set; } + public string? MobileLink { get; set; } + + [BsonRepresentation(BsonType.String)] + public List PermissionIds { get; set; } = new List(); + + [BsonRepresentation(BsonType.String)] + public Guid TenantId { get; set; } + } +} diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateMobileSideMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateMobileSideMenuItemDto.cs new file mode 100644 index 0000000..c7ba5b4 --- /dev/null +++ b/Marco.Pms.Model/Dtos/AppMenu/CreateMobileSideMenuItemDto.cs @@ -0,0 +1,13 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Marco.Pms.Model.Dtos.AppMenu +{ + public class CreateMobileSideMenuItemDto + { + public string? Name { get; set; } + public bool Available { get; set; } + public string? MobileLink { get; set; } + public List PermissionIds { get; set; } = new List(); + } +} diff --git a/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs b/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs index e07244c..3415a09 100644 --- a/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs +++ b/Marco.Pms.Model/Dtos/AppMenu/CreateWebSideMenuItemDto.cs @@ -4,7 +4,7 @@ { public Guid? Id { get; set; } public Guid? ParentMenuId { get; set; } - public string? Text { get; set; } + public string? Name { get; set; } public string? Icon { get; set; } public bool Available { get; set; } = true; public string Link { get; set; } = string.Empty; diff --git a/Marco.Pms.Services/Controllers/AppMenuController.cs b/Marco.Pms.Services/Controllers/AppMenuController.cs index 2fe63dd..d098bbd 100644 --- a/Marco.Pms.Services/Controllers/AppMenuController.cs +++ b/Marco.Pms.Services/Controllers/AppMenuController.cs @@ -2,7 +2,6 @@ using Marco.Pms.CacheHelper; using Marco.Pms.Model.AppMenu; using Marco.Pms.Model.Dtos.AppMenu; -using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.AppMenu; using Marco.Pms.Model.ViewModels.DocumentManager; @@ -26,6 +25,7 @@ namespace Marco.Pms.Services.Controllers private readonly IMapper _mapper; private readonly ILoggingService _logger; private readonly IServiceScopeFactory _serviceScopeFactory; + private readonly PermissionServices _permissionService; private readonly Guid tenantId; private static readonly Guid superTenantId = Guid.Parse("b3466e83-7e11-464c-b93a-daf047838b26"); @@ -42,7 +42,8 @@ namespace Marco.Pms.Services.Controllers SidebarMenuHelper sideBarMenuHelper, IMapper mapper, ILoggingService logger, - IServiceScopeFactory serviceScopeFactory) + IServiceScopeFactory serviceScopeFactory, + PermissionServices permissionService) { _userHelper = userHelper; @@ -51,6 +52,7 @@ namespace Marco.Pms.Services.Controllers _logger = logger; _serviceScopeFactory = serviceScopeFactory; tenantId = userHelper.GetTenantId(); + _permissionService = permissionService; } /// @@ -99,18 +101,13 @@ namespace Marco.Pms.Services.Controllers _logger.LogDebug("GetAppSideBarMenuAsync resolved employee context. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", employeeId, tenantId, correlationId); - // 3. Create scoped permission service - // - Avoid capturing scoped services directly in controller ctor when they depend on per-request state. - using var scope = _serviceScopeFactory.CreateScope(); - var permissionService = scope.ServiceProvider.GetRequiredService(); - - // 4. Preload all permission ids for the employee for efficient in-memory checks - var permissionIds = await permissionService.GetPermissionIdsByEmployeeId(employeeId); + // 3. Preload all permission ids for the employee for efficient in-memory checks + var permissionIds = await _permissionService.GetPermissionIdsByEmployeeId(employeeId); _logger.LogDebug("GetAppSideBarMenuAsync loaded {PermissionCount} permissions for EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", permissionIds.Count, employeeId, correlationId); - // 5. Fetch all menu entries configured for this tenant + // 4. Fetch all menu entries configured for this tenant var menus = await _sideBarMenuHelper.GetAllWebMenuSectionsAsync(tenantId); if (menus == null || !menus.Any()) @@ -126,7 +123,7 @@ namespace Marco.Pms.Services.Controllers _logger.LogDebug("GetAppSideBarMenuAsync loaded {MenuSectionCount} raw menu records. TenantId: {TenantId}, CorrelationId: {CorrelationId}", menus.Count, tenantId, correlationId); - // 6. Build logical menu sections (root + children) and apply permission filtering + // 5. Build logical menu sections (root + children) and apply permission filtering var responseSections = new List(); // Root container section for the web UI. @@ -153,7 +150,7 @@ namespace Marco.Pms.Services.Controllers // If the menu requires any permission, check now. if (menu.PermissionIds.Any()) { - var hasMenuPermission = permissionService.HasPermissionAny(permissionIds, menu.PermissionIds, employeeId); + var hasMenuPermission = _permissionService.HasPermissionAny(permissionIds, menu.PermissionIds, employeeId); if (!hasMenuPermission) { @@ -175,7 +172,7 @@ namespace Marco.Pms.Services.Controllers // If the submenu requires permissions, validate before adding. if (subMenu.PermissionIds.Any()) { - var hasSubPermission = permissionService.HasPermissionAny(permissionIds, subMenu.PermissionIds, employeeId); + var hasSubPermission = _permissionService.HasPermissionAny(permissionIds, subMenu.PermissionIds, employeeId); if (!hasSubPermission) { @@ -240,7 +237,7 @@ namespace Marco.Pms.Services.Controllers } [HttpPost("add/side-menu")] - public async Task AddMenuItemAsync([FromBody] List model) + public async Task AddWebMenuItemAsync([FromBody] List model) { // Step 1: Validate tenant context if (tenantId == Guid.Empty) @@ -306,9 +303,194 @@ namespace Marco.Pms.Services.Controllers } /// - /// Retrieves the master menu list based on enabled features for the current tenant. + /// Retrieves the mobile sidebar menu sections for the authenticated employee within the current tenant, + /// filtered by employee permissions and structured for mobile application consumption. + /// Supports permission-based access control and tenant isolation. /// - /// List of master menu items available for the tenant + /// A filtered list of accessible mobile menu sections or appropriate error response. + /// Returns filtered mobile menu sections successfully. + /// Invalid tenant identifier provided. + /// Employee context not resolved or insufficient permissions. + /// Internal server error during menu retrieval or processing. + + [HttpGet("get/menu-mobile")] + public async Task GetAppSideBarMenuForMobileAsync() + { + // Correlation ID enables distributed tracing across services, middleware, and structured logs. + var correlationId = HttpContext.TraceIdentifier; + + _logger.LogInfo("GetAppSideBarMenuForMobileAsync started. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + try + { + // 1. Validate tenant isolation - critical for multi-tenant security + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetAppSideBarMenuForMobileAsync rejected: invalid tenant context. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + var error = ApiResponse.ErrorResponse( + "InvalidTenantContext", + "Tenant identifier is missing or invalid. Verify tenant context and retry.", + 400); + + return BadRequest(error); + } + + // 2. Resolve authenticated employee context with tenant isolation + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee is null) + { + _logger.LogWarning("GetAppSideBarMenuForMobileAsync failed: employee context not resolved. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + var error = ApiResponse.ErrorResponse("EmployeeContextNotFound", "Current employee context could not be resolved. Please authenticate and retry.", 403); + + return StatusCode(403, error); + } + + var employeeId = loggedInEmployee.Id; + _logger.LogDebug("GetAppSideBarMenuForMobileAsync resolved employee: EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + employeeId, tenantId, correlationId); + + // 3. Bulk-load employee permissions for efficient in-memory permission checks (avoids N+1 queries) + var permissionIds = await _permissionService.GetPermissionIdsByEmployeeId(employeeId); + _logger.LogDebug("GetAppSideBarMenuForMobileAsync loaded {PermissionCount} permissions for EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + permissionIds?.Count ?? 0, employeeId, tenantId, correlationId); + + // 4. Fetch tenant-specific mobile menu configuration + var allMenus = await _sideBarMenuHelper.GetAllMobileMenuSectionsAsync(tenantId); + if (allMenus == null || !allMenus.Any()) + { + _logger.LogInfo("GetAppSideBarMenuForMobileAsync: no mobile menu sections configured. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + var emptyResponse = new List(); + return Ok(ApiResponse.SuccessResponse(emptyResponse, + "No mobile sidebar menu sections configured for this tenant.", 200)); + } + + _logger.LogDebug("GetAppSideBarMenuForMobileAsync loaded {MenuCount} raw sections. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + allMenus.Count, tenantId, correlationId); + + // 5. Filter menus by employee permissions (in-memory for performance) + var accessibleMenus = new List(); + foreach (var menuSection in allMenus) + { + // Skip permission check for public menu items + if (!menuSection.PermissionIds.Any()) + { + accessibleMenus.Add(menuSection); + continue; + } + + // Perform permission intersection check + var hasAccess = _permissionService.HasPermissionAny(permissionIds ?? new List(), + menuSection.PermissionIds, employeeId); + + if (hasAccess) + { + accessibleMenus.Add(menuSection); + _logger.LogDebug("GetAppSideBarMenuForMobileAsync granted menu access. MenuId: {MenuId}, EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", + menuSection.Id, employeeId, correlationId); + } + else + { + _logger.LogDebug("GetAppSideBarMenuForMobileAsync denied menu access. MenuId: {MenuId}, EmployeeId: {EmployeeId}, CorrelationId: {CorrelationId}", + menuSection.Id, employeeId, correlationId); + } + } + + // 6. Defensive mapping with null-safety + var response = _mapper.Map>(accessibleMenus); + _logger.LogInfo("GetAppSideBarMenuForMobileAsync completed successfully. AccessibleMenus: {AccessibleCount}/{TotalCount}, EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + accessibleMenus.Count, allMenus.Count, employeeId, tenantId, correlationId); + + return Ok(ApiResponse.SuccessResponse(response, + $"Mobile sidebar menu fetched successfully ({response?.Count ?? 0} sections accessible).", 200)); + } + catch (OperationCanceledException) + { + _logger.LogWarning("GetAppSideBarMenuForMobileAsync cancelled. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(499, ApiResponse.ErrorResponse("RequestCancelled", + "Request was cancelled by client or timeout.", 499)); + } + catch (UnauthorizedAccessException ex) + { + _logger.LogError(ex, "GetAppSideBarMenuForMobileAsync authorization failed. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(403, ApiResponse.ErrorResponse("AuthorizationFailed", + "Insufficient permissions to access mobile menu sections.", 403)); + } + catch (Exception ex) + { + _logger.LogError(ex, "GetAppSideBarMenuForMobileAsync failed unexpectedly. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + + return StatusCode(500, ApiResponse.ErrorResponse("InternalServerError", + "An unexpected error occurred while fetching the mobile sidebar menu. Please contact support if issue persists.", 500)); + } + } + + + [HttpPost("add/mobile/side-menu")] + public async Task AddMobileMenuItemAsync([FromBody] List model) + { + // Step 1: Validate tenant context + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetAppSideBarMenuAsync rejected: Invalid TenantId."); + + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "The tenant identifier provided is invalid or missing.", 400)); + } + + // Step 2: Fetch logged-in user + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var isRootUser = loggedInEmployee.ApplicationUser?.IsRootUser ?? false; + + // Step 3: Authorization check + if (!isRootUser && tenantId != superTenantId) + { + _logger.LogWarning("Access denied: User {UserId} attempted to add menu item in Tenant {TenantId}", + loggedInEmployee.Id, tenantId); + + return StatusCode(403, ApiResponse.ErrorResponse("Access Denied", "User does not have permission.", 403)); + } + + // Step 4: Input validation + if (model == null) + { + _logger.LogWarning("Invalid AddMenuItem request. Tenant: {TenantId}, UserId: {UserId}", + tenantId, loggedInEmployee.Id); + + return BadRequest(ApiResponse.ErrorResponse("Invalid section ID or menu item payload.", 400)); + } + + // Step 5: Map DTO to entity + var menuItemEntity = _mapper.Map>(model); + + menuItemEntity.ForEach(m => m.TenantId = tenantId); + + // Step 6: Perform Add operation + var result = await _sideBarMenuHelper.AddMobileMenuItemAsync(menuItemEntity); + + if (result == null) + { + _logger.LogWarning("Menu section not found. Unable to add menu item. TenantId: {TenantId}, UserId: {UserId}", tenantId, loggedInEmployee.Id); + + return NotFound(ApiResponse.ErrorResponse("Menu section not found", 404)); + } + + // Step 7: Successful addition + _logger.LogInfo("Menu items added successfully TenantId: {TenantId}, UserId: {UserId}", + tenantId, loggedInEmployee.Id); + + return Ok(ApiResponse.SuccessResponse(result, "Menu item added successfully")); + } [HttpGet("get/master-list")] public async Task GetMasterList() @@ -390,236 +572,6 @@ namespace Marco.Pms.Services.Controllers } } - [HttpGet("get/menu-mobile")] - public async Task GetAppSideBarMenuForobile() - { - // Step 1: Get logged-in employee - var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var employeeId = loggedInEmployee.Id; - - using var scope = _serviceScopeFactory.CreateScope(); - var _permissions = scope.ServiceProvider.GetRequiredService(); - - try - { - // Step 2: Fetch all menu sections for the tenant - var menus = await _sideBarMenuHelper.GetAllMenuSectionsAsync(tenantId); - if (!(menus?.Any() ?? false)) - { - menus = new List - { - MenuStaticMaster.menu - }; - } - List response = new List(); - - foreach (var menu in menus) - { - var allowedItems = new List(); - - foreach (var item in menu.Items) - { - // --- Item permission check --- - if (!item.PermissionIds.Any()) - { - MenuSectionApplicationVM menuVM = new MenuSectionApplicationVM - { - Id = item.Id, - Name = item.Text, - Available = true, - MobileLink = item.MobileLink, - }; - response.Add(menuVM); - - if (item.Submenu?.Any() == true) - { - var allowedSubmenus = new List(); - - foreach (var subItem in item.Submenu) - { - if (!subItem.PermissionIds.Any()) - { - MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM - { - Id = subItem.Id, - Name = subItem.Text, - Available = true, - MobileLink = subItem.MobileLink - }; - response.Add(subMenuVM); - continue; - } - - var subMenuPermissionIds = subItem.PermissionIds - .Select(Guid.Parse) - .ToList(); - - bool isSubItemAllowed = await _permissions.HasPermissionAny(subMenuPermissionIds, employeeId); - - if (isSubItemAllowed) - { - MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM - { - Id = subItem.Id, - Name = subItem.Text, - Available = true, - MobileLink = subItem.MobileLink - }; - response.Add(subMenuVM); - } - } - - // Replace with filtered submenus - item.Submenu = allowedSubmenus; - } - } - else - { - // Convert permission string IDs to GUIDs - var menuPermissionIds = item.PermissionIds - .Select(Guid.Parse) - .ToList(); - - bool isAllowed = await _permissions.HasPermissionAny(menuPermissionIds, employeeId); - - // If allowed, filter its submenus as well - if (isAllowed) - { - if (item.Submenu?.Any() == true) - { - var allowedSubmenus = new List(); - - foreach (var subItem in item.Submenu) - { - if (!subItem.PermissionIds.Any()) - { - MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM - { - Id = subItem.Id, - Name = subItem.Text, - Available = true, - MobileLink = subItem.MobileLink - }; - response.Add(subMenuVM); - continue; - } - - var subMenuPermissionIds = subItem.PermissionIds - .Select(Guid.Parse) - .ToList(); - - bool isSubItemAllowed = await _permissions.HasPermissionAny(subMenuPermissionIds, employeeId); - - if (isSubItemAllowed) - { - MenuSectionApplicationVM subMenuVM = new MenuSectionApplicationVM - { - Id = subItem.Id, - Name = subItem.Text, - Available = true, - MobileLink = subItem.MobileLink, - }; - response.Add(subMenuVM); - } - } - - // Replace with filtered submenus - item.Submenu = allowedSubmenus; - } - - MenuSectionApplicationVM menuVM = new MenuSectionApplicationVM - { - Id = item.Id, - Name = item.Text, - Available = true, - MobileLink = item.MobileLink - }; - response.Add(menuVM); - } - } - } - - // Replace with filtered items - menu.Items = allowedItems; - } - - var viewDocumentTask = Task.Run(async () => - { - using var taskScope = _serviceScopeFactory.CreateScope(); - var permissions = taskScope.ServiceProvider.GetRequiredService(); - return await permissions.HasPermission(PermissionsMaster.ViewDocument, employeeId); - }); - - var uploadDocumentTask = Task.Run(async () => - { - using var taskScope = _serviceScopeFactory.CreateScope(); - var permissions = taskScope.ServiceProvider.GetRequiredService(); - return await permissions.HasPermission(PermissionsMaster.UploadDocument, employeeId); - }); - - var verifyDocumentTask = Task.Run(async () => - { - using var taskScope = _serviceScopeFactory.CreateScope(); - var permissions = taskScope.ServiceProvider.GetRequiredService(); - return await permissions.HasPermission(PermissionsMaster.VerifyDocument, employeeId); - }); - - var downloadDocumentTask = Task.Run(async () => - { - using var taskScope = _serviceScopeFactory.CreateScope(); - var permissions = taskScope.ServiceProvider.GetRequiredService(); - return await permissions.HasPermission(PermissionsMaster.DownloadDocument, employeeId); - }); - - await Task.WhenAll(viewDocumentTask, uploadDocumentTask, verifyDocumentTask, downloadDocumentTask); - - var viewDocument = viewDocumentTask.Result; - var uploadDocument = uploadDocumentTask.Result; - var verifyDocument = verifyDocumentTask.Result; - var downloadDocument = downloadDocumentTask.Result; - - if (viewDocument || uploadDocument || verifyDocument || downloadDocument) - { - response.Add(new MenuSectionApplicationVM - { - Id = Guid.Parse("443d6444-250b-4164-89fd-bcd7cedd9e43"), - Name = "Documents", - Available = true, - MobileLink = "/dashboard/document-main-page" - }); - } - - response.Add(new MenuSectionApplicationVM - { - Id = Guid.Parse("7faddfe7-994b-4712-91c2-32ba44129d9b"), - Name = "Service Projects", - Available = true, - MobileLink = "/dashboard/service-projects" - }); - response.Add(new MenuSectionApplicationVM - { - Id = Guid.Parse("5fab4b88-c9a0-417b-aca2-130980fdb0cf"), - Name = "Infra Projects", - Available = true, - MobileLink = "/dashboard/infra-projects" - }); - - // Step 3: Log success - response = response.Where(ms => !string.IsNullOrWhiteSpace(ms.MobileLink)).ToList(); - _logger.LogInfo("Fetched sidebar menu successfully. Tenant: {TenantId}, EmployeeId: {EmployeeId}, SectionsReturned: {Count}", - tenantId, employeeId, menus.Count); - return Ok(ApiResponse.SuccessResponse(response, "Sidebar menu fetched successfully", 200)); - } - catch (Exception ex) - { - // Step 4: Handle unexpected errors - _logger.LogError(ex, "Error occurred while fetching sidebar menu. Tenant: {TenantId}, EmployeeId: {EmployeeId}", - tenantId, employeeId); - - return StatusCode(500, ApiResponse.ErrorResponse("Server Error", "An unexpected error occurred while fetching the sidebar menu.", 500)); - } - } - } } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 865e668..bd6b2dc 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -580,6 +580,9 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap(); + CreateMap(); + CreateMap(); + #endregion #region ======================================================= Directory ======================================================= -- 2.43.0 From a0a65fc08c356eb199b6c5edb9e138fbe4c0b0d5 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 15:55:08 +0530 Subject: [PATCH 37/58] Saving the mail logs in mongodb rather than my sql --- .../Data/ApplicationDbContext.cs | 2 +- ...06102239_Removed_MaiLogs_Table.Designer.cs | 9453 +++++++++++++++++ .../20251206102239_Removed_MaiLogs_Table.cs | 42 + .../ApplicationDbContextModelSnapshot.cs | 31 - Marco.Pms.Helpers/Utility/MailLogHelper.cs | 34 + Marco.Pms.Services/Helpers/ReportHelper.cs | 8 +- Marco.Pms.Services/Program.cs | 1 + .../appsettings.Development.json | 3 +- 8 files changed, 9539 insertions(+), 35 deletions(-) create mode 100644 Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.Designer.cs create mode 100644 Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.cs create mode 100644 Marco.Pms.Helpers/Utility/MailLogHelper.cs diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index af5b8ab..d2dc283 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -55,7 +55,7 @@ namespace Marco.Pms.DataAccess.Data public DbSet Documents { get; set; } public DbSet MailingList { get; set; } public DbSet MailDetails { get; set; } - public DbSet MailLogs { get; set; } + //public DbSet MailLogs { get; set; } public DbSet OTPDetails { get; set; } public DbSet MPINDetails { get; set; } public DbSet FCMTokenMappings { get; set; } diff --git a/Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.Designer.cs b/Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.Designer.cs new file mode 100644 index 0000000..ffb9b02 --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.Designer.cs @@ -0,0 +1,9453 @@ +// +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("20251206102239_Removed_MaiLogs_Table")] + partial class Removed_MaiLogs_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("ApprovedAt") + .HasColumnType("datetime(6)"); + + b.Property("ApprovedById") + .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("RequestedAt") + .HasColumnType("datetime(6)"); + + b.Property("RequestedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RequestedById"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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("TimeStamp") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + 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.Collection.Invoice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BasicAmount") + .HasColumnType("double"); + + b.Property("BilledToId") + .HasColumnType("char(36)"); + + b.Property("ClientSubmitedDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ExceptedPaymentDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MarkAsCompleted") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BilledToId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("InvoiceComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .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("PaymentAdjustmentHeads"); + + b.HasData( + new + { + Id = new Guid("dbdc047f-a2d2-4db0-b0e6-b9d9f923a0f1"), + Description = "An advance payment is a sum paid before receiving goods or services, often to secure a transaction or cover initial costs.", + IsActive = true, + Name = "Advance payment", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("66c3c241-8b52-4327-a5ad-c1faf102583e"), + Description = "The base amount refers to the principal sum or original value used as a reference in financial calculations, excluding taxes, fees, or additional charges.", + IsActive = true, + Name = "Base Amount", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0d70cb2e-827e-44fc-90a5-c2c55ba51ba9"), + Description = "TDS, or Tax Deducted at Source, is a system under the Indian Income Tax Act where tax is deducted at the point of income generation—such as salary, interest, or rent—and remitted to the government to prevent tax evasion and ensure timely collection.", + IsActive = true, + Name = "Tax Deducted at Source (TDS)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("95f35acd-d979-4177-91ea-fd03a00e49ff"), + Description = "Retention refers to a company's ability to keep customers, employees, or profits over time, commonly measured as a percentage and critical for long-term business sustainability and growth.", + IsActive = true, + Name = "Retention", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("3f09b19a-8d45-4cf2-be27-f4f09b38b9f7"), + Description = "Tax is a mandatory financial charge imposed by a government on individuals or entities to fund public services and government operations, without direct benefit to the taxpayer.", + IsActive = true, + Name = "Tax", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ec5e6a5f-ce62-44e5-8911-8426bbb4dde8"), + Description = "A penalty in the context of taxation is a financial sanction imposed by the government on individuals or entities for non-compliance with tax laws, such as late filing, underreporting income, or failure to pay taxes, and is typically calculated as a percentage of the tax due or a fixed amount.", + IsActive = true, + Name = "Penalty", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("50584332-1cb7-4359-9721-c8ea35040881"), + Description = "Utility fees are recurring charges for essential services such as electricity, water, gas, sewage, waste disposal, internet, and telecommunications, typically based on usage and necessary for operating a home or business.", + IsActive = true, + Name = "Utility fees", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("ReceivedInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedByID") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedByID"); + + b.HasIndex("TenantId"); + + b.ToTable("Buckets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasColumnType("longtext"); + + b.Property("ContactCategoryId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Designation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Organization") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactCategoryId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("Contacts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactCategoryMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsEmails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ContactNotes"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("Label") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.ToTable("ContactsPhones"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactProjectMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ContactId") + .HasColumnType("char(36)"); + + b.Property("ContactTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ContactId"); + + b.HasIndex("ContactTagId"); + + b.ToTable("ContactTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ContactTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("RefereanceId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UpdatedById"); + + b.ToTable("DirectoryUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BucketId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("BucketId"); + + b.HasIndex("EmployeeId"); + + b.ToTable("EmployeeBucketMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("DocumentTagId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("DocumentTagId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ChildAttachmentId") + .HasColumnType("char(36)"); + + b.Property("ParentAttachmentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ChildAttachmentId"); + + b.HasIndex("ParentAttachmentId"); + + b.HasIndex("TenantId"); + + b.ToTable("AttachmentVersionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Base64Data") + .HasColumnType("longtext"); + + b.Property("BatchId") + .HasColumnType("char(36)"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("S3Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("ThumbS3Key") + .HasColumnType("longtext"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DocumentDataId") + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("longtext"); + + b.Property("DocumentTypeId") + .HasColumnType("char(36)"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsCurrentVersion") + .HasColumnType("tinyint(1)"); + + b.Property("IsVerified") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.Property("VerifiedAt") + .HasColumnType("datetime(6)"); + + b.Property("VerifiedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentDataId"); + + b.HasIndex("DocumentTypeId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.HasIndex("UploadedById"); + + b.HasIndex("VerifiedById"); + + b.ToTable("DocumentAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Project documents are formal records that outline the plans, progress, and details necessary to execute and manage a project effectively.", + EntityTypeId = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Name = "Project Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + CreatedAt = new DateTime(2025, 9, 15, 12, 42, 3, 202, DateTimeKind.Utc), + Description = "Employment details along with legal IDs like passports or driver’s licenses to verify identity and work authorization.", + EntityTypeId = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Name = "Employee Documents", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTagMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedContentType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DocumentCategoryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("IsValidationRequired") + .HasColumnType("tinyint(1)"); + + b.Property("MaxSizeAllowedInMB") + .HasColumnType("double"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RegexExpression") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentCategoryId"); + + b.HasIndex("TenantId"); + + b.ToTable("DocumentTypeMasters"); + + b.HasData( + new + { + Id = new Guid("336225ac-67f3-4e14-ba7a-8fad03cf2832"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Aadhaar card", + RegexExpression = "^[2-9][0-9]{11}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6344393b-9bb1-45f8-b620-9f6e279d012c"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Pan Card", + RegexExpression = "^[A-Z]{5}[0-9]{4}[A-Z]{1}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2d1d7441-46a8-425e-9395-94d0956f8e91"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Voter Card", + RegexExpression = "^[A-Z]{3}[0-9]{7}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c40b80-c207-4a0c-a4d3-381414afe35a"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Passport", + RegexExpression = "^[A-PR-WY][1-9]\\d\\s?\\d{4}[1-9]$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f76d8215-d399-4f0e-b414-12e427f50be3"), + AllowedContentType = "application/pdf,image/jpeg", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("2d9fb9cf-db53-476b-a452-492e88e2b51f"), + IsActive = true, + IsMandatory = true, + IsSystem = true, + IsValidationRequired = true, + MaxSizeAllowedInMB = 2.0, + Name = "Bank Passbook", + RegexExpression = "^\\d{9,18}$", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("260abd7e-c96d-4ae4-a29b-9b5bb5d24ebd"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Bill of Quantities (BOQ)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a1a190ba-c4a8-432f-b26d-1231ca1d44bc"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Work Order", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("07ca7182-9ac0-4407-b988-59901170cb86"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Letter of Agreement", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("846e89a9-5735-45ec-a21d-c97f85a94ada"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Health and Safety Document", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7cc41c91-23cb-442b-badd-f932138d149f"), + AllowedContentType = "application/pdf,application/msword,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.openxmlformats-officedocument.wordprocessingml.document", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 1.0, + Name = "Standard Operating Procedure (SOP)", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5668de00-5d84-47f7-b9b5-7fefd1219f05"), + AllowedContentType = "application/pdf,image/vnd.dwg,application/acad", + CreatedAt = new DateTime(2025, 9, 3, 10, 46, 49, 955, DateTimeKind.Utc), + DocumentCategoryId = new Guid("cfbff269-072b-477a-b48b-72cdc57dd1d3"), + IsActive = true, + IsMandatory = false, + IsSystem = true, + IsValidationRequired = false, + MaxSizeAllowedInMB = 20.0, + Name = "Drawings", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Gender") + .HasColumnType("longtext"); + + b.Property("HasApplicationAccess") + .HasColumnType("tinyint(1)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .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("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PermanentAddress") + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("longtext"); + + b.Property("Photo") + .HasColumnType("longblob"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationUserId"); + + b.HasIndex("JobRoleId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("RoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("EmployeeRoleMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("time(6)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("StartTime") + .HasColumnType("time(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkShifts"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ActivityCheckList", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityId") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsChecked") + .HasColumnType("tinyint(1)"); + + b.Property("IsMandatory") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("ActivityCheckLists"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.CheckListMappings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CheckListId") + .HasColumnType("char(36)"); + + b.Property("TaskAllocationId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("CheckListMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FeatureId") + .HasColumnType("char(36)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("FeatureId"); + + b.ToTable("FeaturePermissions"); + + b.HasData( + new + { + Id = new Guid("d032cb1a-3f30-462c-bef0-7ace73a71c0b"), + Description = "Able add, modify and suspend any tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Manage Tenants" + }, + new + { + Id = new Guid("00e20637-ce8d-4417-bec4-9b31b5e65092"), + Description = "Modify only his tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "Modify Tenant" + }, + new + { + Id = new Guid("647145c6-2108-4c98-aab4-178602236e55"), + Description = "Asscess information related to tenant.", + FeatureId = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + IsEnabled = true, + Name = "View Tenant" + }, + new + { + Id = new Guid("6ea44136-987e-44ba-9e5d-1cf8f5837ebc"), + Description = "Access all information related to the project.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project" + }, + new + { + Id = new Guid("172fc9b6-755b-4f62-ab26-55c34a330614"), + Description = "Potentially edit the project name, description, start/end dates, or status.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project" + }, + new + { + Id = new Guid("b94802ce-0689-4643-9e1d-11c86950c35b"), + Description = "The \"Manage Team\" feature allows authorized users to organize project personnel by adding, removing, and assigning employee to projects.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Team" + }, + new + { + Id = new Guid("8d7cc6e3-9147-41f7-aaa7-fa507e450bd4"), + Description = "Grants a user comprehensive read-only access to all details concerning the project's underlying systems, technologies, resources, and configurations", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "View Project Infra" + }, + new + { + Id = new Guid("cf2825ad-453b-46aa-91d9-27c124d63373"), + Description = "This allows them to create, modify, and manage all aspects of the supporting infrastructure.", + FeatureId = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + IsEnabled = true, + Name = "Manage Project Infra" + }, + new + { + Id = new Guid("9fcc5f87-25e3-4846-90ac-67a71ab92e3c"), + Description = "Grants a user comprehensive read-only access to all details associated with tasks within a project. This includes task descriptions, statuses, assignees, due dates, dependencies, progress, history, and any related attachments or discussions.", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "View Task" + }, + new + { + Id = new Guid("08752f33-3b29-4816-b76b-ea8a968ed3c5"), + Description = "This allows them to create new tasks, modify existing task attributes (description, status, assignee, due date, etc.),", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Add/Edit Task" + }, + new + { + Id = new Guid("6a32379b-8b3f-49a6-8c48-4b7ac1b55dc2"), + Description = "Grants a user the ability to designate team members responsible for specific tasks and to update the completion status or provide progress updates for those tasks", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Assign/Report Progress" + }, + new + { + Id = new Guid("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c"), + Description = "Grants a user the authority to officially confirm the completion or acceptance of a task, often signifying that it meets the required standards or criteria", + FeatureId = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + IsEnabled = true, + Name = "Approve Task" + }, + new + { + Id = new Guid("60611762-7f8a-4fb5-b53f-b1139918796b"), + Description = "Grants a user read-only access to details about the all individuals within the system. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View All Employees" + }, + new + { + Id = new Guid("b82d2b7e-0d52-45f3-997b-c008ea460e7f"), + Description = "Grants a user read-only access to details about the individuals within the system which are is assigned to same projects as user. This typically includes names, contact information, roles, departments, and potentially other relevant employee data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "View Team Members" + }, + new + { + Id = new Guid("a97d366a-c2bb-448d-be93-402bd2324566"), + Description = "Grants a user the authority to create new employee profiles and modify existing employee details within the system. This typically includes adding or updating information such as names, contact details, roles, departments, skills, and potentially other personal or professional data", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Add/Edit Employee" + }, + new + { + Id = new Guid("fbd213e0-0250-46f1-9f5f-4b2a1e6e76a3"), + Description = "Grants a user the authority to manage employee application roles, enabling them to assign or revoke access privileges within the system.", + FeatureId = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + IsEnabled = true, + Name = "Assign Roles" + }, + new + { + Id = new Guid("915e6bff-65f6-4e3f-aea8-3fd217d3ea9e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Team Attendance " + }, + new + { + Id = new Guid("57802c4a-00aa-4a1f-a048-fd2f70dd44b6"), + Description = "Grants a user the authority to approve requests from employees to adjust or correct their recorded attendance. This typically involves reviewing the reason for the regularization, verifying any supporting documentation, and then officially accepting the changes to the employee's attendance records", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Regularize Attendance" + }, + new + { + Id = new Guid("ccb0589f-712b-43de-92ed-5b6088e7dc4e"), + Description = "Team Attendance refers to tracking and managing the attendance of all team members collectively, often monitored by a team lead or manager.", + FeatureId = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + IsEnabled = true, + Name = "Self Attendance" + }, + new + { + Id = new Guid("5ffbafe0-7ab0-48b1-bb50-c1bf76b65f9d"), + Description = "Grants a user read-only access to foundational or reference data within the system. \"Masters\" typically refer to predefined lists, categories, or templates that are used throughout the application to standardize information and maintain consistency", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "View Masters" + }, + new + { + Id = new Guid("588a8824-f924-4955-82d8-fc51956cf323"), + Description = "Grants a user the authority to create, modify, and delete foundational or reference data within the system. These \"masters\" are typically the core lists, categories, and configurations that other data and functionalities rely upon, such as departments, job titles, product categories", + FeatureId = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + IsEnabled = true, + Name = "Manage Masters" + }, + new + { + Id = new Guid("71189504-f1c8-4ca5-8db6-810497be2854"), + Description = "Grants a user the authority to view all documents related to employees and projects", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "View Document" + }, + new + { + Id = new Guid("3f6d1f67-6fa5-4b7c-b17b-018d4fe4aab8"), + Description = "Grants a user the authority to upload the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Upload Document" + }, + new + { + Id = new Guid("c423fd81-6273-4b9d-bb5e-76a0fb343833"), + Description = "Grants a user the authority to modify document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Mofify Document" + }, + new + { + Id = new Guid("40863a13-5a66-469d-9b48-135bc5dbf486"), + Description = "Grants a user the authority to delete the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Delete Document" + }, + new + { + Id = new Guid("404373d0-860f-490e-a575-1c086ffbce1d"), + Description = "Grants a user the authority to download the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Download Document" + }, + new + { + Id = new Guid("13a1f30f-38d1-41bf-8e7a-b75189aab8e0"), + Description = "Grants a user the authority to verify the document", + FeatureId = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + IsEnabled = true, + Name = "Verify Document" + }, + new + { + Id = new Guid("4286a13b-bb40-4879-8c6d-18e9e393beda"), + Description = "Full control over all directories, including the ability to manage permissions for all directories in the system.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Admin" + }, + new + { + Id = new Guid("62668630-13ce-4f52-a0f0-db38af2230c5"), + Description = "Full control over directories they created or have been assigned. Can also manage permissions for those directories.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory Manager" + }, + new + { + Id = new Guid("0f919170-92d4-4337-abd3-49b66fc871bb"), + Description = "Full control over directories they created. Can view contacts in directories they either created or were assigned to. Can manage permissions only for directories they created.", + FeatureId = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + IsEnabled = true, + Name = "Directory User" + }, + new + { + Id = new Guid("385be49f-8fde-440e-bdbc-3dffeb8dd116"), + Description = "Allows a user to view only the expense records that they have personally submitted", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View Self" + }, + new + { + Id = new Guid("01e06444-9ca7-4df4-b900-8c3fa051b92f"), + Description = "Allows a user to view all expense records across the organization or project, regardless of who submitted or paid them", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "View All" + }, + new + { + Id = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + Description = "Allows a user to create and submit new expense records, including attaching relevant documents like receipts or invoices.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Upload" + }, + new + { + Id = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + Description = "Allows a user to examine submitted expenses for accuracy, completeness, and policy compliance before they are approved or rejected.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Review" + }, + new + { + Id = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + Description = "Allows a user to authorize or reject submitted expenses, making them officially accepted or declined within the system.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Approve" + }, + new + { + Id = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + Description = "Allows a user to handle post-approval actions such as recording payments, updating financial records, or marking expenses as reimbursed or settled.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Process" + }, + new + { + Id = new Guid("bdee29a2-b73b-402d-8dd1-c4b1f81ccbc3"), + Description = "Allows a user to configure and control system settings, such as managing expense types, payment modes, permissions, and overall workflow rules.", + FeatureId = new Guid("a4e25142-449b-4334-a6e5-22f70e4732d7"), + IsEnabled = true, + Name = "Manage" + }, + new + { + Id = new Guid("dbf17591-09fe-4c93-9e1a-12db8f5cc5de"), + Description = "Collection Admin is a permission that grants a user full administrative control over collections, including creating, editing, managing access, and deleting collections within a system.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Collection Admin" + }, + new + { + Id = new Guid("c8d7eea5-4033-4aad-9ebe-76de49896830"), + Description = "View Collection is a permission that allows users to see and browse assets or items within a collection without making any modifications or edits to its contents.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "View Collection" + }, + new + { + Id = new Guid("b93141fd-dbd3-4051-8f57-bf25d18e3555"), + Description = "Authorizes users to create new collections for organizing related resources and managing access", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Create Collection" + }, + new + { + Id = new Guid("455187b4-fef1-41f9-b3d0-025d0b6302c3"), + Description = "Ability to modify collection properties, content, and access rights.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Edit Collection" + }, + new + { + Id = new Guid("061d9ccd-85b4-4cb0-be06-2f9f32cebb72"), + Description = " Enables entry and processing of payment transactions.", + FeatureId = new Guid("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + IsEnabled = true, + Name = "Add Payment" + }, + new + { + Id = new Guid("6382ea8b-aff2-4cd2-a48f-a652b35825d8"), + Description = "Manage Recurring Template payment permission allows authorized users to set up, modify, and execute automated recurring payments using predefined templates, ensuring secure and controlled handling of repetitive financial transactions.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "Manage Recurring" + }, + new + { + Id = new Guid("7ddf2fba-c44d-4fe3-b4ec-690ff70be2e3"), + Description = "The \"View All Recurring Template payment permission\" generally allows users to see and access all recurring payment templates in the system, enabling them to review, manage, and process recurring transactions efficiently.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View All Recurring" + }, + new + { + Id = new Guid("e5d21efe-573d-4a16-a0f8-414d3e442e78"), + Description = "View Self Recurring Template payment permission allows a user to view and access their own recurring payment templates without editing rights.", + FeatureId = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + IsEnabled = true, + Name = "View Self Recurring" + }, + new + { + Id = new Guid("068cb3c1-49c5-4746-9f29-1fce16e820ac"), + Description = "Allow user to create new organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Add Organization" + }, + new + { + Id = new Guid("c1ae1363-ab8a-4bd9-a9d1-8c2c6083873a"), + Description = "Allow the user to update the basic information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "Edit Organization" + }, + new + { + Id = new Guid("7a6cf830-0008-4e03-b31d-0d050cb634f4"), + Description = "Allow the user to view information of the organization", + FeatureId = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + IsEnabled = true, + Name = "View Organization" + }, + new + { + Id = new Guid("91e09825-512a-465e-82ad-fa355b305585"), + Description = "Allows the user to view only the purchase invoices they created.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View Self Purchase Invoice" + }, + new + { + Id = new Guid("d6ae78d3-a941-4cc4-8d0a-d40479be4211"), + Description = "Allows the user to view all purchase invoices across the entire organization.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "View All Purchase Invoice" + }, + new + { + Id = new Guid("68ff925d-8ebf-4034-a137-8d3317c56ca1"), + Description = "Allows full control to create, edit, and process purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Manage Purchase Invoice" + }, + new + { + Id = new Guid("a4b77638-bf31-42bb-afd4-d5bbd15ccadc"), + Description = "Allows the user to mark purchase invoices as inactive or void.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Delete Purchase Invoice" + }, + new + { + Id = new Guid("b24eba39-4a92-4f7a-b33b-b5308fbc48b9"), + Description = "Allows the user to create delivery challans for purchase invoices.", + FeatureId = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + IsEnabled = true, + Name = "Add Delivery Challan" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("PermissionId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectLevelPermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.Property("ApplicationRoleId") + .HasColumnType("char(36)"); + + b.Property("FeaturePermissionId") + .HasColumnType("char(36)"); + + b.HasKey("ApplicationRoleId", "FeaturePermissionId"); + + b.HasIndex("FeaturePermissionId"); + + b.ToTable("RolePermissionMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", 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("CurrentBalance") + .HasColumnType("double"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("FinanceUIdPostfix") + .HasColumnType("int"); + + b.Property("FinanceUIdPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("TenantId"); + + b.ToTable("AdvancePaymentTransactions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("TenantId"); + + b.ToTable("BillAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("ExpenseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpenseId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ExpenseLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("ApprovedById") + .HasColumnType("char(36)"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseUId") + .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("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("PreApproved") + .HasColumnType("tinyint(1)"); + + b.Property("ProcessedById") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReviewedById") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplerName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionDate") + .HasColumnType("datetime(6)"); + + b.Property("TransactionId") + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ApprovedById"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("PaidById"); + + b.HasIndex("PaymentModeId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("ProcessedById"); + + b.HasIndex("ReviewedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("Expenses"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ReimburseById") + .HasColumnType("char(36)"); + + b.Property("ReimburseDate") + .HasColumnType("datetime(6)"); + + b.Property("ReimburseNote") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ReimburseTransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ReimburseById"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburse"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ExpensesId") + .HasColumnType("char(36)"); + + b.Property("ExpensesReimburseId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ExpensesId"); + + b.HasIndex("ExpensesReimburseId"); + + b.HasIndex("TenantId"); + + b.ToTable("ExpensesReimburseMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAttachmentRequried") + .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("ExpenseCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("5e0c6227-d49d-41ff-9f1f-781f0aee2469"), + Description = "Materials, equipment and supplies purchased for site operations.", + IsActive = true, + IsAttachmentRequried = 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = false, + 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = 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, + IsAttachmentRequried = true, + Name = "Compliance & Safety", + NoOfPersonsRequired = false, + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.ToTable("ExpensesStatusMapping"); + + b.HasData( + new + { + Id = new Guid("a1cc95ed-b276-4a3e-9f00-0a249b522d64"), + NextStatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("5cf7f1df-9d1f-4289-add0-1775ad614f25"), + NextStatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("4ddddc10-0ffd-4884-accf-d4fa0bd97f54"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("36c00548-241c-43ec-bc95-cacebedb925c"), + NextStatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("1fca1700-1266-477d-bba4-9ac3753aa33c"), + NextStatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("6b867bec-66e6-42a7-9611-f4595af9b9ce"), + NextStatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("ef1fcfbc-60e0-4f17-9308-c583a05d48fd"), + NextStatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("af1e4492-98ee-4451-8ab7-fd8323f29c32"), + NextStatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("RecurringPaymentStatus"); + + b.HasData( + new + { + Id = new Guid("da462422-13b2-45cc-a175-910a225f6fc8"), + Name = "Active" + }, + new + { + Id = new Guid("3ec864d2-8bf5-42fb-ba70-5090301dd816"), + Name = "De-Activated" + }, + new + { + Id = new Guid("306856fb-5655-42eb-bf8b-808bb5e84725"), + Name = "Completed" + }, + new + { + Id = new Guid("8bfc9346-e092-4a80-acbf-515ae1ef6868"), + Name = "Paused" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.StatusPermissionMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("PermissionId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PermissionId"); + + b.HasIndex("StatusId"); + + b.ToTable("StatusPermissionMapping"); + + b.HasData( + new + { + Id = new Guid("722b0c3c-5a78-456d-b9bb-b6ba1b21d59b"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8") + }, + new + { + Id = new Guid("7deb0945-e1c9-411f-8b3c-c9bdbe3c3c2d"), + PermissionId = new Guid("0f57885d-bcb2-4711-ac95-d841ace6d5a7"), + StatusId = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7") + }, + new + { + Id = new Guid("9e2ec648-1ca2-4747-9329-e911b18edb3e"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b") + }, + new + { + Id = new Guid("0b7926fc-a34b-4a5b-8c7d-1003480cf0fa"), + PermissionId = new Guid("1f4bda08-1873-449a-bb66-3e8222bd871b"), + StatusId = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8") + }, + new + { + Id = new Guid("cd15f9b9-be45-4deb-9c71-2f23f872dbcd"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729") + }, + new + { + Id = new Guid("f6f26b2f-2fa6-40b7-8601-cbd4bcdda0cc"), + PermissionId = new Guid("eaafdd76-8aac-45f9-a530-315589c6deca"), + StatusId = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27") + }, + new + { + Id = new Guid("214354e5-daad-4569-ad69-eb5bf4e87fbc"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("61578360-3a49-4c34-8604-7b35a3787b95") + }, + new + { + Id = new Guid("de04b6c7-a5cd-4a61-88b0-b43b0008202e"), + PermissionId = new Guid("ea5a1529-4ee8-4828-80ea-0e23c9d4dd11"), + StatusId = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("ExpenseStatusId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsAdvancePayment") + .HasColumnType("tinyint(1)"); + + b.Property("IsExpenseCreated") + .HasColumnType("tinyint(1)"); + + b.Property("PaidAt") + .HasColumnType("datetime(6)"); + + b.Property("PaidById") + .HasColumnType("char(36)"); + + b.Property("PaidTransactionId") + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("RecurringPaymentId") + .HasColumnType("char(36)"); + + b.Property("TDSPercentage") + .HasColumnType("double"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("ExpenseStatusId"); + + b.HasIndex("PaidById"); + + b.HasIndex("RecurringPaymentId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PaymentRequests"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("PaymentRequestId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("PaymentRequestId"); + + b.HasIndex("TenantId"); + + b.ToTable("PaymentRequestAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", 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("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("ExpenseCategoryId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsVariable") + .HasColumnType("tinyint(1)"); + + b.Property("LatestPRGeneratedAt") + .HasColumnType("datetime(6)"); + + b.Property("NextStrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("NotifyTo") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Payee") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentBufferDays") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("StrikeDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("ExpenseCategoryId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("RecurringPayments"); + }); + + 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.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.ActivityGroupMaster", 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.HasIndex("TenantId"); + + b.ToTable("ActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.CurrencyMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CurrencyName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Symbol") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CurrencyMaster"); + + b.HasData( + new + { + Id = new Guid("78e96e4a-7ce0-4164-ae3a-c833ad45ec2c"), + CurrencyCode = "INR", + CurrencyName = "Indian Rupee", + IsActive = true, + Symbol = "₹" + }, + new + { + Id = new Guid("2f672568-a67b-4961-acb2-a8c7834e1762"), + CurrencyCode = "USD", + CurrencyName = "US Dollar", + IsActive = true, + Symbol = "$" + }, + new + { + Id = new Guid("4d1155bb-1448-4d97-a732-96c92eb99c45"), + CurrencyCode = "EUR", + CurrencyName = "Euro", + IsActive = true, + Symbol = "€" + }, + new + { + Id = new Guid("3e456237-ef06-4ea1-a261-188c9b0c6df6"), + CurrencyCode = "GBP", + CurrencyName = "Pound Sterling", + IsActive = true, + Symbol = "£" + }, + new + { + Id = new Guid("297e237a-56d3-48f6-b39d-ec3991dea8bf"), + CurrencyCode = "JPY", + CurrencyName = "Japanese Yen", + IsActive = true, + Symbol = "¥" + }, + new + { + Id = new Guid("efe9b4f6-64d6-446e-a42d-1c7aaf6dd70d"), + CurrencyCode = "RUB", + CurrencyName = "Russian Ruble", + IsActive = true, + Symbol = "₽" + }, + new + { + Id = new Guid("b960166a-f7e9-49e3-bb4b-28511f126c08"), + CurrencyCode = "CNY", + CurrencyName = "Chinese Yuan (Renminbi)", + IsActive = true, + Symbol = "¥" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.EntityTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("EntityTypeMasters"); + + b.HasData( + new + { + Id = new Guid("c8fe7115-aa27-43bc-99f4-7b05fabe436e"), + Description = "Emtities related to project.", + Name = "Project Entity" + }, + new + { + Id = new Guid("dbb9555a-7a0c-40f2-a9ed-f0463f1ceed7"), + Description = "Employee related entitie", + Name = "Employee Entity" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("ExpensesStatusMaster"); + + b.HasData( + new + { + Id = new Guid("297e0d8f-f668-41b5-bfea-e03b354251c8"), + Color = "#8592a3", + Description = "Expense has been created but not yet submitted.", + DisplayName = "Draft", + IsActive = true, + IsSystem = true, + Name = "Draft" + }, + new + { + Id = new Guid("6537018f-f4e9-4cb3-a210-6c3b2da999d7"), + Color = "#696cff", + Description = "Reviewer is currently reviewing the expense.", + DisplayName = "Submit for Review", + IsActive = true, + IsSystem = true, + Name = "Review Pending" + }, + new + { + Id = new Guid("965eda62-7907-4963-b4a1-657fb0b2724b"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(review rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("4068007f-c92f-4f37-a907-bc15fe57d4d8"), + Color = "#03c3ec", + Description = "Review is completed, waiting for action of approver.", + DisplayName = "Mark as Reviewed", + IsActive = true, + IsSystem = true, + Name = "Approval Pending" + }, + new + { + Id = new Guid("d1ee5eec-24b6-4364-8673-a8f859c60729"), + Color = "#ff3e1d", + Description = "Expense was declined, often with a reason(approval rejected).", + DisplayName = "Reject", + IsActive = true, + IsSystem = true, + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("f18c5cfd-7815-4341-8da2-2c2d65778e27"), + Color = "#ffab00", + Description = "Approved expense is awaiting final payment.", + DisplayName = "Mark as Approved", + IsActive = true, + IsSystem = true, + Name = "Payment Pending" + }, + new + { + Id = new Guid("61578360-3a49-4c34-8604-7b35a3787b95"), + Color = "#71dd37", + Description = "Expense has been settled.", + DisplayName = "Mark as Processed", + IsActive = true, + IsSystem = true, + Name = "Processed" + }, + new + { + Id = new Guid("b8586f67-dc19-49c3-b4af-224149efe1d3"), + Color = "#0E9F6E", + Description = "Create new Expense.", + DisplayName = "Create Expense", + IsActive = true, + IsSystem = true, + Name = "Done" + }); + }); + + 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("IsAttachmentRequried") + .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"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ModuleId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ModuleId"); + + b.ToTable("Features"); + + b.HasData( + new + { + Id = new Guid("53176ebf-c75d-42e5-839f-4508ffac3def"), + Description = "Manage Project", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Project Management" + }, + new + { + Id = new Guid("9d4b5489-2079-40b9-bd77-6e1bf90bc19f"), + Description = "Manage Tasks", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Task Management" + }, + new + { + Id = new Guid("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("fc586e7d-ed1a-45e5-bb51-9f34af98ec13"), + Description = "Collection Management is a feature that enables organizations to track, organize, and manage the status and recovery of receivables or assets efficiently throughout their lifecycle, supporting systematic follow-up and resolution of outstanding accounts.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Collection Management" + }, + new + { + Id = new Guid("86e80017-0698-4efe-93d0-806de67266e0"), + Description = "Recurring Template Management is the automated creation and scheduling of repetitive tasks, processes, or transactions using predefined templates at set intervals to ensure consistent and efficient workflow execution without manual recreation each time.", + IsActive = true, + ModuleId = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Name = "Recurring Template Management" + }, + new + { + Id = new Guid("81ab8a87-8ccd-4015-a917-0627cee6a100"), + Description = "Manage Employee", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Employee Management" + }, + new + { + Id = new Guid("52c9cf54-1eb2-44d2-81bb-524cf29c0a94"), + Description = "Attendance", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Attendance Management" + }, + new + { + Id = new Guid("a8cf4331-8f04-4961-8360-a3f7c3cc7462"), + Description = "Manage Document", + IsActive = true, + ModuleId = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Name = "Document Management" + }, + new + { + Id = new Guid("be3b3afc-6ccf-4566-b9b6-aafcb65546be"), + Description = "Global Masters", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Masters" + }, + new + { + Id = new Guid("39e66f81-efc6-446c-95bd-46bff6cfb606"), + Description = "Managing all directory related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Directory Management" + }, + new + { + Id = new Guid("6d4c82d6-dbce-48ab-b8b8-f785f4d8c914"), + Description = "Managing all organization related rights", + IsActive = true, + ModuleId = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Name = "Organization Management" + }, + new + { + Id = new Guid("271cc47f-7b05-46c7-b5ae-ef0177ec3b60"), + Description = "Managing all Purchase invoice related rights", + IsActive = true, + ModuleId = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Name = "Purchase Invoice Management" + }, + new + { + Id = new Guid("2f3509b7-160d-410a-b9b6-daadd96c986d"), + Description = "Managing all tenant related rights", + IsActive = true, + ModuleId = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Name = "Tenant Management" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceId"); + + b.ToTable("GlobalActivityGroupMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActivityGroupId") + .HasColumnType("char(36)"); + + b.Property("ActivityName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("UnitOfMeasurement") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ActivityGroupId"); + + b.ToTable("GlobalActivityMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalServiceMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("GlobalServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Industry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Industries"); + + b.HasData( + new + { + Id = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + Name = "Information Technology (IT) Services" + }, + new + { + Id = new Guid("0a63e657-2c5f-49b5-854b-42c978293154"), + Name = "Manufacturing & Production" + }, + new + { + Id = new Guid("bdc61e3b-69ea-4394-bab6-079ec135b5bd"), + Name = "Energy & Resources" + }, + new + { + Id = new Guid("5ca200ac-00d7-415e-a410-b948e27ac9d2"), + Name = "Finance & Professional Services" + }, + new + { + Id = new Guid("d5621700-cd87-441f-8cdb-6051ddfc83b4"), + Name = "Hospitals and Healthcare Services" + }, + new + { + Id = new Guid("23608891-657e-40f0-bbd4-2b0a2ec1a76f"), + Name = "Social Services" + }, + new + { + Id = new Guid("a493f4e3-16b1-4411-be3c-6bf2987a3168"), + Name = "Retail & Consumer Services" + }, + new + { + Id = new Guid("e9d8ce92-9371-4ed9-9831-83c07f78edec"), + Name = "Transportation & Logistics" + }, + new + { + Id = new Guid("8a0d6134-2dbe-4e0a-b250-ff34cb7b9df0"), + Name = "Education & Training" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Module", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Key") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Modules"); + + b.HasData( + new + { + Id = new Guid("bf59fd88-b57a-4d67-bf01-3780f385896b"), + Description = "Project Module", + Key = "b04da7e9-0406-409c-ac7f-b97256e6ea02", + Name = "Project" + }, + new + { + Id = new Guid("2a231490-bcb1-4bdd-91f1-f25fb7f25b23"), + Description = "Employee Module", + Key = "0971c7fb-6ce1-458a-ae3f-8d3205893637", + Name = "Employee" + }, + new + { + Id = new Guid("c43db8c7-ab73-47f4-9d3b-f83e81357924"), + Description = "Masters Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Masters" + }, + new + { + Id = new Guid("f482a079-4dec-4f2d-9867-6baf2a4f23d9"), + Description = "Tenant Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Tenant" + }, + new + { + Id = new Guid("74e7af50-d55f-4b59-a724-9847ceb7bc17"), + Description = "Inventory Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Inventory" + }, + new + { + Id = new Guid("0a79687a-86d7-430d-a2d7-8b8603cc76a1"), + Description = "Finance Module", + Key = "504ec132-e6a9-422f-8f85-050602cfce05", + Name = "Finance" + }); + }); + + 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.HasKey("Id"); + + 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" + }, + 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" + }, + new + { + Id = new Guid("ed667353-8eea-4fd1-8750-719405932480"), + Description = "Online banking portals used to transfer funds directly between accounts", + IsActive = true, + Name = "NetBanking" + }, + 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" + }, + new + { + Id = new Guid("a820f240-5e9a-4ae9-9091-8a7aa7720cea"), + Description = "A credit card is a payment card that allows you to borrow funds from a financial institution to pay for goods and services", + IsActive = true, + Name = "Credit card" + }, + new + { + Id = new Guid("95697409-baf6-4f78-86ab-42d93d9569a8"), + Description = "A debit card is a payment card that deducts funds directly from the cardholder's bank account when a purchase is made.", + IsActive = true, + Name = "Debit Card" + }, + new + { + Id = new Guid("f67beee6-6763-4108-922c-03bd86b9178d"), + Description = "When a bill is paid using the amount received in advance from a company.", + IsActive = true, + Name = "Advance Payment" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", 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("ServiceMasters"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Status") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("StatusMasters"); + + b.HasData( + new + { + Id = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + Status = "Active" + }, + new + { + Id = new Guid("cdad86aa-8a56-4ff4-b633-9c629057dfef"), + Status = "In Progress" + }, + new + { + Id = new Guid("603e994b-a27f-4e5d-a251-f3d69b0498ba"), + Status = "On Hold" + }, + new + { + Id = new Guid("ef1c356e-0fe0-42df-a5d3-8daee355492d"), + Status = "In Active" + }, + new + { + Id = new Guid("33deaef9-9af1-4f2a-b443-681ea0d04f81"), + Status = "Completed" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("EntityId") + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("StatusUpdateLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.SubscriptionStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionStatus"); + + b.HasData( + new + { + Id = new Guid("cd3a68ea-41fd-42f0-bd0c-c871c7337727"), + Name = "Active" + }, + new + { + Id = new Guid("4ed487b1-af22-4e25-aecd-b63fd850cf2d"), + Name = "InActive" + }, + new + { + Id = new Guid("1c0e422e-01b6-412f-b72a-1db004cc8a7f"), + Name = "Suspended" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TenantStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TenantStatus"); + + b.HasData( + new + { + Id = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + Name = "Active" + }, + new + { + Id = new Guid("35d7840a-164a-448b-95e6-efb2ec84a751"), + Name = "Suspended" + }, + new + { + Id = new Guid("c0b5def8-087e-4235-b3a4-8e2f0ed91b94"), + Name = "In Active" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketPriorityMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketPriorityMasters"); + + b.HasData( + new + { + Id = new Guid("188d29b3-10f3-42d0-9587-1a46ae7a0320"), + ColorCode = "008000", + IsDefault = true, + Level = 1, + Name = "Low", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("0919bc84-9f82-4ecf-98c7-962755dd9a97"), + ColorCode = "FFFF00", + IsDefault = true, + Level = 2, + Name = "Medium", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a13b7e59-16fd-4665-b5cf-a97399e8445a"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 3, + Name = "High", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("f340fbc3-c9fd-46aa-b063-0093418830e4"), + ColorCode = "#FFA500", + IsDefault = true, + Level = 4, + Name = "Critical", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("44a7b91d-a0dd-45d1-8616-4d2f71e16401"), + ColorCode = "#FF0000", + IsDefault = true, + Level = 5, + Name = "Urgent", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketStatusMasters"); + + b.HasData( + new + { + Id = new Guid("6b0c409b-3e80-4165-8b39-f3fcacb4c797"), + ColorCode = "#FFCC99", + Description = "This is a newly created issue.", + IsDefault = true, + Name = "New", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("6c5ac37d-5b7d-40f3-adec-2dabaa5cca86"), + ColorCode = "#E6FF99", + Description = "Assigned to employee or team of employees", + IsDefault = true, + Name = "Assigned", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7f96bcd5-0c66-411b-8a1d-9d1a4785194e"), + ColorCode = "#99E6FF", + Description = "These issues are currently in progress", + IsDefault = true, + Name = "In Progress", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5c72b630-6923-4215-bf2c-b1622afd76e7"), + ColorCode = "#8592a3", + Description = "These issues are currently under review", + IsDefault = true, + Name = "In Review", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8ff85685-a875-4f21-aa95-d99551315fcc"), + ColorCode = "#B399FF", + Description = "The following issues are resolved and closed", + IsDefault = true, + Name = "Done", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.TicketTagMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ColorCode") + .HasColumnType("longtext"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("TicketTagMasters"); + + b.HasData( + new + { + Id = new Guid("ef6c2a65-f61d-4537-9650-a7ab7f8d98db"), + ColorCode = "#e59866", + IsDefault = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5a168569-8ad7-4422-8db6-51ef25caddeb"), + ColorCode = "#85c1e9", + IsDefault = true, + Name = "Help Desk", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkCategoryMasters"); + + b.HasData( + new + { + Id = new Guid("86bb2cc8-f6b5-4fdd-bbee-c389c713a44b"), + Description = "Created new task in a professional or creative context", + IsSystem = true, + Name = "Fresh Work", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9ebfa19c-53b9-481b-b863-c25d2f843201"), + Description = "Revising, modifying, or correcting a task to improve its quality or fix issues", + IsSystem = true, + Name = "Rework", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("11a79929-1d07-42dc-9e98-82d0d2f4a240"), + Description = "Any defect, deviation, or non-conformance in a task that fails to meet established standards or customer expectations.", + IsSystem = true, + Name = "Quality Issue", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsSystem") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("WorkStatusMasters"); + + b.HasData( + new + { + Id = new Guid("030bb085-e230-4370-aec7-9a74d652864e"), + Description = "Confirm the tasks are actually finished as reported", + IsSystem = true, + Name = "Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2a1a5b96-cf93-4111-b4b1-76c19d6333b4"), + Description = "Not all tasks are actually finished as reported", + IsSystem = true, + Name = "Partially Approve", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("00a062e6-62e6-42c5-b6b1-024328651b72"), + Description = "Tasks are not finished as reported or have any issues in al the tasks", + IsSystem = true, + Name = "NCR", + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationHierarchyId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationHierarchyId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TenantId"); + + b.ToTable("OrgHierarchyLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("ServiceId"); + + b.ToTable("OrgServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("OrgTypeMasters"); + + b.HasData( + new + { + Id = new Guid("5ee49bcd-b6d3-482f-9aaf-484afe04abec"), + Name = "Service Provider" + }, + new + { + Id = new Guid("a283356a-9b02-4029-afb7-e65c703efdd4"), + Name = "Sub-Contractor" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPerson") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("GSTNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + + b.HasData( + new + { + Id = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + Address = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactNumber = "123456789", + ContactPerson = "Admin", + CreatedAt = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + Email = "admin@marcoaiot.com", + IsActive = true, + Name = "MarcoBMS", + SPRID = 5400L + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsPrimary") + .HasColumnType("tinyint(1)"); + + b.Property("ReportToId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ReportToId"); + + b.HasIndex("TenantId"); + + b.ToTable("OrganizationHierarchies"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("CompletionDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationTypeId") + .HasColumnType("char(36)"); + + b.Property("ParentOrganizationId") + .HasColumnType("char(36)"); + + b.Property("ProjectServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("OrganizationTypeId"); + + b.HasIndex("ParentOrganizationId"); + + b.HasIndex("ProjectServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActualEndDate") + .HasColumnType("datetime(6)"); + + b.Property("ActualStartDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime(6)"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime(6)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ProjectServiceMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("ReassignedDate") + .HasColumnType("datetime(6)"); + + b.Property("SPRID") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantId"); + + b.ToTable("TenantOrgMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PaymentGetway.PaymentDetail", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("EncryptedDetails") + .HasColumnType("longblob"); + + b.Property("Method") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Nonce") + .HasColumnType("longblob"); + + b.Property("OrderId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PaymentId") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Status") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Tag") + .HasColumnType("longblob"); + + b.HasKey("Id"); + + b.ToTable("PaymentDetails"); + }); + + 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") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PMCId") + .HasColumnType("char(36)"); + + b.Property("ProjectAddress") + .HasColumnType("longtext"); + + b.Property("ProjectStatusId") + .HasColumnType("char(36)"); + + b.Property("PromoterId") + .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("PMCId"); + + b.HasIndex("ProjectStatusId"); + + b.HasIndex("PromoterId"); + + 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", + PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + ProjectAddress = "Project 1 Address", + ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), + PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + 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("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + 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.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AttachmentId") + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("DeliveryChallanDate") + .HasColumnType("datetime(6)"); + + b.Property("DeliveryChallanNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AttachmentId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("DeliveryChallanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("InvoiceAttachmentTypes"); + + b.HasData( + new + { + Id = new Guid("ca294108-a586-4207-88c8-163b24305ddc"), + Description = "A delivery challan is a formal document accompanying a shipment of goods that lists the items included and serves as proof of delivery upon receipt.", + Name = "Delivery Challan" + }, + new + { + Id = new Guid("150ddd9b-4b8d-44ac-bae0-2e553c0f069a"), + Description = "An E-Way Bill (Electronic Way Bill) is a mandatory digital document generated on the GST portal to evidence and track the movement of goods valued over ₹50,000.", + Name = "E Way Bill" + }, + new + { + Id = new Guid("3ca08288-0a74-4850-9948-0783aa975b84"), + Description = "A Tax Invoice is a mandatory legal document issued by a GST-registered supplier for taxable goods or services, enabling the buyer to claim Input Tax Credit (ITC).", + Name = "Tax Invoice" + }, + new + { + Id = new Guid("1fa20cff-b0ee-468e-9ea6-72d5aa144a3f"), + Description = "An E-Invoice (Electronic Invoice) is a system where B2B invoices are electronically authenticated by the GST Network (GSTN) to generate a unique Invoice Reference Number (IRN) and QR code.", + Name = "E-Invoice" + }, + new + { + Id = new Guid("31cd7533-3ffc-4e84-a0b4-db3b94d016b2"), + Description = "Proforma Invoice", + Name = "Proforma Invoice" + }, + new + { + Id = new Guid("060c79a4-81c7-40a4-8cc3-56362ac9fad6"), + Description = "Sales Order", + Name = "Sales Order" + }, + new + { + Id = new Guid("12773c2c-64e7-478c-af17-8471f943a5ed"), + Description = "Other", + Name = "Other" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("InvoiceAttachmentTypeId") + .HasColumnType("char(36)"); + + b.Property("PurchaseInvoiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UploadedAt") + .HasColumnType("datetime(6)"); + + b.Property("UploadedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("InvoiceAttachmentTypeId"); + + b.HasIndex("PurchaseInvoiceId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UploadedById"); + + b.ToTable("PurchaseInvoiceAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AcknowledgmentDate") + .HasColumnType("datetime(6)"); + + b.Property("AcknowledgmentNumber") + .HasColumnType("longtext"); + + b.Property("BaseAmount") + .HasColumnType("double"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("EWayBillDate") + .HasColumnType("datetime(6)"); + + b.Property("EWayBillNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("InvoiceNumber") + .HasColumnType("longtext"); + + b.Property("InvoiceReferenceNumber") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("PaymentDueDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceAmount") + .HasColumnType("double"); + + b.Property("ProformaInvoiceDate") + .HasColumnType("datetime(6)"); + + b.Property("ProformaInvoiceNumber") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("PurchaseOrderDate") + .HasColumnType("datetime(6)"); + + b.Property("PurchaseOrderNumber") + .HasColumnType("longtext"); + + b.Property("ShippingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("SupplierId") + .HasColumnType("char(36)"); + + b.Property("TaxAmount") + .HasColumnType("double"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TotalAmount") + .HasColumnType("double"); + + b.Property("TransportCharges") + .HasColumnType("double"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("StatusId"); + + b.HasIndex("SupplierId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("PurchaseInvoiceDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Amount") + .HasColumnType("double"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("InvoiceId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PaymentAdjustmentHeadId") + .HasColumnType("char(36)"); + + b.Property("PaymentReceivedDate") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("InvoiceId"); + + b.HasIndex("PaymentAdjustmentHeadId"); + + b.HasIndex("TenantId"); + + b.ToTable("PurchaseInvoicePayments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Color") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("PurchaseInvoiceStatus"); + + b.HasData( + new + { + Id = new Guid("8a5ef25e-3c9e-45de-add9-6b1c1df54381"), + Color = "#8592a3", + Description = "Draft Status in a Purchase Invoice indicates a preliminary, unfinalized document that is saved for review but has not yet been posted to the general ledger or affected your accounts/inventory.", + DisplayName = "Draft", + Name = "Draft" + }, + new + { + Id = new Guid("16b10201-1651-465c-b2fd-236bdef86f95"), + Color = "#696cff", + Description = "Review Pending status in a Purchase Invoice indicates that the invoice has been submitted for validation but requires approval from an authorized person (like a manager or auditor) before it can be posted to the ledger or paid.", + DisplayName = "Submit for Review", + Name = "Review Pending" + }, + new + { + Id = new Guid("a05f5f4a-bd9d-4028-af42-48ee0caa3e40"), + Color = "#ff3e1d", + Description = "Rejected by Reviewer status indicates that the invoice failed the approval process due to errors, discrepancies, or policy violations and has been returned to the initiator or vendor for correction.", + DisplayName = "Reject", + Name = "Rejected by Reviewer" + }, + new + { + Id = new Guid("60027a54-3c23-4619-9f4e-6c20549b50a6"), + Color = "#03c3ec", + Description = "Approval Pending status in a Purchase Invoice indicates that the document has passed initial verification (matching and coding) and is now awaiting final financial authorization from a designated budget holder or signatory.", + DisplayName = "Mark as Reviewed", + Name = "Approval Pending" + }, + new + { + Id = new Guid("58de9cef-811f-46a4-814d-0069b64d98a9"), + Color = "#ff3e1d", + Description = "Rejected by Approver status in a Purchase Invoice indicates that the document successfully passed initial verification but was ultimately denied by the final authorizing signatory (such as a Manager or CFO) due to budget or validity concerns.", + DisplayName = "Reject", + Name = "Rejected by Approver" + }, + new + { + Id = new Guid("5b393371-dbcf-4a28-88a8-f406fa34e0d0"), + Color = "#71dd37", + Description = "Approved status indicates that the invoice has successfully cleared all necessary verification and authorization levels and is formally accepted by the company as a valid debt.", + DisplayName = "Mark as Approved", + Name = "Approved" + }); + }); + + 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.ServiceProject.JobAttachment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("JobCommentId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("JobCommentId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttachments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TaggedInAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedInTime") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutAt") + .HasColumnType("datetime(6)"); + + b.Property("TaggedOutTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendance"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasColumnType("int"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("DocumentId") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("JobAttendanceId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("Latitude") + .HasColumnType("longtext"); + + b.Property("Longitude") + .HasColumnType("longtext"); + + b.Property("MarkedAt") + .HasColumnType("datetime(6)"); + + b.Property("MarkedTIme") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("DocumentId"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("JobAttendanceId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobAttendanceLogs"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobComments"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssigneeId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssigneeId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobEmployeeMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("JobStatus"); + + b.HasData( + new + { + Id = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + DisplayName = "New", + Level = 1, + Name = "New" + }, + new + { + Id = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + DisplayName = "Assigned", + Level = 2, + Name = "Assigned" + }, + new + { + Id = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + DisplayName = "In Progress", + Level = 3, + Name = "In Progress" + }, + new + { + Id = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + DisplayName = "Work Done", + Level = 4, + Name = "Work Done" + }, + new + { + Id = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + DisplayName = "Review Done", + Level = 5, + Name = "Review Done" + }, + new + { + Id = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + DisplayName = "Closed", + Level = 6, + Name = "Closed" + }, + new + { + Id = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + DisplayName = "On Hold", + Level = 7, + Name = "On Hold" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("NextStatusId") + .HasColumnType("char(36)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("NextStatusId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobStatusMappings"); + + b.HasData( + new + { + Id = new Guid("024e1810-6a57-4a0d-8d2e-be88da79fcd4"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("32d76a02-8f44-4aa0-9b66-c3716c45a918"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("cb0db140-87fa-4a6f-812d-2834bd0f53a9"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("42f24930-387e-4f51-9c2d-3e29ffaaf02a"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("16c83c23-09be-40fd-9d05-f44795d8dee8"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("8c4ecdae-7435-4475-8389-15bc453561a1"), + NextStatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("a44b0a66-ee33-47e7-a01f-6b8d9b621543"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("7165ecee-10e3-4fc0-85d2-6d93d5b11776"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("87891499-e45d-406b-bf22-722db1beedc9"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("dc986ec4-858e-4c98-b330-4a5c98c91f07"), + NextStatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ca8b4358-3122-4aaa-bcf8-0b66e4ab313a"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("5602d32c-290e-48a3-83dd-91af6d12ed46"), + NextStatusId = new Guid("5a6873a5-fed7-4745-a52f-8f61bf3bd72d"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("9c2918be-b3c1-46fb-a03b-14dd613e1021"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("ab974bdb-2d8f-4ddc-9b71-bd6d198bae75"), + NextStatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + StatusId = new Guid("aab71020-2fb8-44d9-9430-c9a7e9bf33b0"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("2787c903-1b39-4e7d-a0f2-3bb2309bb341"), + NextStatusId = new Guid("cfa1886d-055f-4ded-84c6-42a2a8a14a66"), + StatusId = new Guid("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }, + new + { + Id = new Guid("76bc5551-8f80-469d-ba23-95d7e746c9a9"), + NextStatusId = new Guid("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"), + StatusId = new Guid("ed10ab57-dbaa-4ca5-8ecd-56745dcbdbd7"), + TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("JobTagId") + .HasColumnType("char(36)"); + + b.Property("JobTicketId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("JobTagId"); + + b.HasIndex("JobTicketId"); + + b.HasIndex("TenantId"); + + b.ToTable("JobTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", 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("DueDate") + .HasColumnType("datetime(6)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsArchive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectBranchId") + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UIDPostfix") + .HasColumnType("int"); + + b.Property("UIDPrefix") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectBranchId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("JobTickets"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BranchType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactInformation") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("ProjectId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ProjectBranches"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("AssignedDate") + .HasColumnType("datetime(6)"); + + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("ContactEmail") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactPhone") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("GoogleMapUrl") + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ShortName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("CreatedById"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("ServiceProjects"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("AssignedById") + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ReAssignedAt") + .HasColumnType("datetime(6)"); + + b.Property("ReAssignedById") + .HasColumnType("char(36)"); + + b.Property("TeamRoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssignedById"); + + b.HasIndex("EmployeeId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ReAssignedById"); + + b.HasIndex("TeamRoleId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectAllocations"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectServiceMapping"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("ServiceProjectTags"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ServiceProjectId") + .HasColumnType("char(36)"); + + b.Property("ServiceProjectTagId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ServiceProjectId"); + + b.HasIndex("ServiceProjectTagId"); + + b.ToTable("ServiceProjectTagMappings"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.TeamRoleMaster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("TeamRoleMasters"); + + b.HasData( + new + { + Id = new Guid("8cfbf16f-7d3b-4c29-af5b-18935f20aa7b"), + Description = "A Support role involves assisting users or customers by resolving technical or service-related issues, answering inquiries, and ensuring a positive experience with products or services.", + Name = "Support" + }, + new + { + Id = new Guid("145d7222-408b-4733-8a17-f417e070b8b8"), + Description = "A Service Engineer installs, maintains, repairs, and troubleshoots equipment to ensure optimal operation and customer satisfaction.", + Name = "Service Engineer" + }, + new + { + Id = new Guid("03bf5853-5e0b-4eb8-9f37-33bd999a05b3"), + Description = "A Manager oversees and coordinates a team or department to achieve organizational goals through planning, decision-making, and leadership.", + Name = "Manager" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("PlanName") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("SubscriptionPlans"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreateAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("FeaturesId") + .HasColumnType("char(36)"); + + b.Property("Frequency") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("MaxStorage") + .HasColumnType("double"); + + b.Property("MaxUser") + .HasColumnType("double"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("Price") + .HasColumnType("double"); + + b.Property("TrialDays") + .HasColumnType("int"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PlanId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("SubscriptionPlanDetails"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DomainName") + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsSuperTenant") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OfficeNumber") + .HasColumnType("longtext"); + + b.Property("OnBoardingDate") + .HasColumnType("datetime(6)"); + + b.Property("OrganizationId") + .HasColumnType("char(36)"); + + b.Property("OrganizationSize") + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TaxId") + .HasColumnType("longtext"); + + b.Property("TenantStatusId") + .HasColumnType("char(36)"); + + b.Property("logoImage") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("TenantStatusId"); + + b.ToTable("Tenants"); + + b.HasData( + new + { + Id = new Guid("b3466e83-7e11-464c-b93a-daf047838b26"), + BillingAddress = "2nd Floor, Fullora Building, Tejas CHS, behind Kothrud Stand, Tejas Society, Dahanukar Colony, Kothrud, Pune, Maharashtra 411038", + ContactName = "Admin", + ContactNumber = "123456789", + Description = "", + DomainName = "www.marcobms.org", + Email = "admin@marcoaiot.com", + IndustryId = new Guid("15436ee3-a650-469e-bfc2-59993f7514bb"), + IsActive = true, + IsSuperTenant = true, + Name = "MarcoBMS", + OnBoardingDate = new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), + OrganizationId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), + OrganizationSize = "100-200", + Reference = "Root Tenant", + TenantStatusId = new Guid("62b05792-5115-4f99-8ff5-e8374859b191"), + logoImage = "data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2Q==" + }); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BillingAddress") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ContactNumber") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Email") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("IndustryId") + .HasColumnType("char(36)"); + + b.Property("LastName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationSize") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Reference") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("IndustryId"); + + b.ToTable("TenantEnquires"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AutoRenew") + .HasColumnType("tinyint(1)"); + + b.Property("CancellationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedById") + .HasColumnType("char(36)"); + + b.Property("CurrencyId") + .HasColumnType("char(36)"); + + b.Property("EndDate") + .HasColumnType("datetime(6)"); + + b.Property("IsCancelled") + .HasColumnType("tinyint(1)"); + + b.Property("IsTrial") + .HasColumnType("tinyint(1)"); + + b.Property("MaxUsers") + .HasColumnType("double"); + + b.Property("NextBillingDate") + .HasColumnType("datetime(6)"); + + b.Property("PaymentDetailId") + .HasColumnType("char(36)"); + + b.Property("PlanId") + .HasColumnType("char(36)"); + + b.Property("StartDate") + .HasColumnType("datetime(6)"); + + b.Property("StatusId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("UpdateAt") + .HasColumnType("datetime(6)"); + + b.Property("UpdatedById") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("CurrencyId"); + + b.HasIndex("PaymentDetailId"); + + b.HasIndex("PlanId"); + + b.HasIndex("StatusId"); + + b.HasIndex("TenantId"); + + b.HasIndex("UpdatedById"); + + b.ToTable("TenantSubscriptions"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EmployeeId") + .HasColumnType("char(36)"); + + b.Property("ExpiredAt") + .HasColumnType("datetime(6)"); + + b.Property("FcmToken") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("FCMTokenMappings"); + }); + + 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.HasDiscriminator().HasValue("ApplicationUser"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("AssignedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportedBy") + .WithMany() + .HasForeignKey("ReportedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem") + .WithMany() + .HasForeignKey("WorkItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkStatusMaster", "WorkStatus") + .WithMany() + .HasForeignKey("WorkStatusId"); + + b.Navigation("ApprovedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportedBy"); + + b.Navigation("Tenant"); + + b.Navigation("WorkItem"); + + b.Navigation("WorkStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("CommentedBy") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Activities.TaskMembers", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Activities.TaskAllocation", "TaskAllocation") + .WithMany() + .HasForeignKey("TaskAllocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("TaskAllocation"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.Attendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Approver") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "RequestedBy") + .WithMany() + .HasForeignKey("RequestedById"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Approver"); + + b.Navigation("Employee"); + + b.Navigation("RequestedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.AttendanceModule.AttendanceLog", b => + { + b.HasOne("Marco.Pms.Model.AttendanceModule.Attendance", "Attendance") + .WithMany() + .HasForeignKey("AttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedByEmployee") + .WithMany() + .HasForeignKey("UpdatedBy"); + + b.Navigation("Attendance"); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedByEmployee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Authentication.RefreshToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.Invoice", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "BilledTo") + .WithMany() + .HasForeignKey("BilledToId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("BilledTo"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.InvoiceComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.PaymentAdjustmentHead", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Collection.ReceivedInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.Invoice", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Bucket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedByID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.Contact", b => + { + b.HasOne("Marco.Pms.Model.Directory.ContactCategoryMaster", "ContactCategory") + .WithMany() + .HasForeignKey("ContactCategoryId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("ContactCategory"); + + b.Navigation("CreatedBy"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactEmail", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactNote", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Createdby") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Contact"); + + b.Navigation("Createdby"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactPhone", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactProjectMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Contact", "Contact") + .WithMany() + .HasForeignKey("ContactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Directory.ContactTagMaster", "ContactTag") + .WithMany() + .HasForeignKey("ContactTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Contact"); + + b.Navigation("ContactTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.ContactTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.DirectoryUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Directory.EmployeeBucketMapping", b => + { + b.HasOne("Marco.Pms.Model.Directory.Bucket", "Bucket") + .WithMany() + .HasForeignKey("BucketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Bucket"); + + b.Navigation("Employee"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentTagMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTagMaster", "DocumentTag") + .WithMany() + .HasForeignKey("DocumentTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("DocumentTag"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.AttachmentVersionMapping", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ChildAttachment") + .WithMany() + .HasForeignKey("ChildAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentAttachment", "ParentAttachment") + .WithMany() + .HasForeignKey("ParentAttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChildAttachment"); + + b.Navigation("ParentAttachment"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.Document", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentDataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", "DocumentType") + .WithMany() + .HasForeignKey("DocumentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "VerifiedBy") + .WithMany() + .HasForeignKey("VerifiedById"); + + b.Navigation("Document"); + + b.Navigation("DocumentType"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + + b.Navigation("UploadedBy"); + + b.Navigation("VerifiedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.EntityTypeMaster", "EntityTypeMaster") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeMaster"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTagMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.DocumentManager.DocumentTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.DocumentCategoryMaster", "DocumentCategory") + .WithMany() + .HasForeignKey("DocumentCategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DocumentCategory"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.Employee", b => + { + b.HasOne("Marco.Pms.Model.Entitlements.ApplicationUser", "ApplicationUser") + .WithMany() + .HasForeignKey("ApplicationUserId"); + + b.HasOne("Marco.Pms.Model.Roles.JobRole", "JobRole") + .WithMany() + .HasForeignKey("JobRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + + b.Navigation("ApplicationUser"); + + b.Navigation("JobRole"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.EmployeeRoleMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", "Role") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Role"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Employees.WorkShift", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.FeaturePermission", b => + { + b.HasOne("Marco.Pms.Model.Master.Feature", "Feature") + .WithMany("FeaturePermissions") + .HasForeignKey("FeatureId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Feature"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.ProjectLevelPermissionMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", "Permission") + .WithMany() + .HasForeignKey("PermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Permission"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Entitlements.RolePermissionMappings", b => + { + b.HasOne("Marco.Pms.Model.Roles.ApplicationRole", null) + .WithMany() + .HasForeignKey("ApplicationRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Entitlements.FeaturePermission", null) + .WithMany() + .HasForeignKey("FeaturePermissionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.AdvancePaymentTransaction", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Employee"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.BillAttachments", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Expenses"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpenseLog", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expense") + .WithMany() + .HasForeignKey("ExpenseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expense"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Expenses", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ApprovedBy") + .WithMany() + .HasForeignKey("ApprovedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId") + .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.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ProcessedBy") + .WithMany() + .HasForeignKey("ProcessedById"); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReviewedBy") + .WithMany() + .HasForeignKey("ReviewedById"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApprovedBy"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("PaidBy"); + + b.Navigation("PaymentMode"); + + b.Navigation("PaymentRequest"); + + b.Navigation("ProcessedBy"); + + b.Navigation("ReviewedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburse", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReimburseBy") + .WithMany() + .HasForeignKey("ReimburseById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ReimburseBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.ExpensesReimburseMapping", b => + { + b.HasOne("Marco.Pms.Model.Expenses.Expenses", "Expenses") + .WithMany() + .HasForeignKey("ExpensesId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.ExpensesReimburse", "ExpensesReimburse") + .WithMany() + .HasForeignKey("ExpensesReimburseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Expenses"); + + b.Navigation("ExpensesReimburse"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.ExpensesStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.Masters.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.Expenses.PaymentRequest", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Master.ExpensesStatusMaster", "ExpenseStatus") + .WithMany() + .HasForeignKey("ExpenseStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "PaidBy") + .WithMany() + .HasForeignKey("PaidById"); + + b.HasOne("Marco.Pms.Model.Expenses.RecurringPayment", "RecurringPayment") + .WithMany() + .HasForeignKey("RecurringPaymentId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("ExpenseStatus"); + + b.Navigation("PaidBy"); + + b.Navigation("RecurringPayment"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.PaymentRequestAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.PaymentRequest", "PaymentRequest") + .WithMany() + .HasForeignKey("PaymentRequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("PaymentRequest"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Expenses.RecurringPayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.ExpenseCategoryMaster", "ExpenseCategory") + .WithMany() + .HasForeignKey("ExpenseCategoryId"); + + b.HasOne("Marco.Pms.Model.Expenses.Masters.RecurringPaymentStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("ExpenseCategory"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketAttachment", b => + { + b.HasOne("Marco.Pms.Model.Forum.TicketComment", "TicketComment") + .WithMany("Attachments") + .HasForeignKey("CommentId"); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ticket"); + + b.Navigation("TicketComment"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketComment", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketForum", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketPriorityMaster", "Priority") + .WithMany() + .HasForeignKey("PriorityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TicketStatusMaster", "TicketStatusMaster") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketTypeMaster", "TicketTypeMaster") + .WithMany() + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Priority"); + + b.Navigation("Tenant"); + + b.Navigation("TicketStatusMaster"); + + b.Navigation("TicketTypeMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Forum.TicketTag", b => + { + b.HasOne("Marco.Pms.Model.Master.TicketTagMaster", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Forum.TicketForum", "Ticket") + .WithMany() + .HasForeignKey("TicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tag"); + + b.Navigation("Ticket"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Mail.MailDetails", b => + { + b.HasOne("Marco.Pms.Model.Mail.MailingList", "MailBody") + .WithMany() + .HasForeignKey("MailListId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MailBody"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ExpensesTypeMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.Feature", b => + { + b.HasOne("Marco.Pms.Model.Master.Module", "Module") + .WithMany() + .HasForeignKey("ModuleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Module"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityGroupMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.GlobalActivityMaster", b => + { + b.HasOne("Marco.Pms.Model.Master.GlobalActivityGroupMaster", "ActivityGroup") + .WithMany() + .HasForeignKey("ActivityGroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityGroup"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.ServiceMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.StatusUpdateLog", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkCategoryMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Master.WorkStatusMaster", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgHierarchyLog", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", "OrganizationHierarchy") + .WithMany() + .HasForeignKey("OrganizationHierarchyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OrganizationHierarchy"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrgServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.GlobalServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Organization"); + + b.Navigation("Service"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.OrganizationHierarchy", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReportTo") + .WithMany() + .HasForeignKey("ReportToId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("ReportTo"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.OrgTypeMaster", "OrganizationType") + .WithMany() + .HasForeignKey("OrganizationTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "ParentOrganization") + .WithMany() + .HasForeignKey("ParentOrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", "ProjectService") + .WithMany() + .HasForeignKey("ProjectServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("OrganizationType"); + + b.Navigation("ParentOrganization"); + + b.Navigation("ProjectService"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.ProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.Projects.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.OrganizationModel.TenantOrgMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Organization"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Building", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Floor", b => + { + b.HasOne("Marco.Pms.Model.Projects.Building", "Building") + .WithMany() + .HasForeignKey("BuildingId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Building"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC") + .WithMany() + .HasForeignKey("PMCId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") + .WithMany() + .HasForeignKey("ProjectStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter") + .WithMany() + .HasForeignKey("PromoterId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PMC"); + + b.Navigation("ProjectStatus"); + + b.Navigation("Promoter"); + + 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.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkArea", b => + { + b.HasOne("Marco.Pms.Model.Projects.Floor", "Floor") + .WithMany() + .HasForeignKey("FloorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Floor"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItem", b => + { + b.HasOne("Marco.Pms.Model.Master.ActivityMaster", "ActivityMaster") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea") + .WithMany() + .HasForeignKey("WorkAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.WorkCategoryMaster", "WorkCategoryMaster") + .WithMany() + .HasForeignKey("WorkCategoryId"); + + b.Navigation("ActivityMaster"); + + b.Navigation("Tenant"); + + b.Navigation("WorkArea"); + + b.Navigation("WorkCategoryMaster"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.DeliveryChallanDetails", b => + { + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", "Attachment") + .WithMany() + .HasForeignKey("AttachmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Attachment"); + + b.Navigation("CreatedBy"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.InvoiceAttachmentType", "InvoiceAttachmentType") + .WithMany() + .HasForeignKey("InvoiceAttachmentTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "PurchaseInvoice") + .WithMany() + .HasForeignKey("PurchaseInvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UploadedBy") + .WithMany() + .HasForeignKey("UploadedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("InvoiceAttachmentType"); + + b.Navigation("PurchaseInvoice"); + + b.Navigation("Tenant"); + + b.Navigation("UploadedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Supplier") + .WithMany() + .HasForeignKey("SupplierId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Organization"); + + b.Navigation("Status"); + + b.Navigation("Supplier"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoicePayment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PurchaseInvoice.PurchaseInvoiceDetails", "Invoice") + .WithMany() + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Collection.PaymentAdjustmentHead", "PaymentAdjustmentHead") + .WithMany() + .HasForeignKey("PaymentAdjustmentHeadId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("Invoice"); + + b.Navigation("PaymentAdjustmentHead"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.ApplicationRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", null) + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Marco.Pms.Model.Roles.JobRole", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttachment", b => + { + b.HasOne("Marco.Pms.Model.DocumentManager.Document", "Document") + .WithMany() + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobComment", "JobComment") + .WithMany() + .HasForeignKey("JobCommentId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("JobComment"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendance", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Employee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobAttendanceLog", b => + { + 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.ServiceProject.JobAttendance", "JobAttendance") + .WithMany() + .HasForeignKey("JobAttendanceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Document"); + + b.Navigation("Employee"); + + b.Navigation("JobAttendance"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobComment", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobEmployeeMapping", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "Assignee") + .WithMany() + .HasForeignKey("AssigneeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assignee"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobStatusMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "NextStatus") + .WithMany() + .HasForeignKey("NextStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId"); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NextStatus"); + + b.Navigation("Status"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.JobTag", "JobTag") + .WithMany() + .HasForeignKey("JobTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobTicket", "JobTicket") + .WithMany() + .HasForeignKey("JobTicketId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("JobTag"); + + b.Navigation("JobTicket"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.JobTicket", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ProjectBranch", "ProjectBranch") + .WithMany() + .HasForeignKey("ProjectBranchId"); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.JobStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("ProjectBranch"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ProjectBranch", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Project"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProject", b => + { + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Client") + .WithMany() + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.StatusMaster", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("Client"); + + b.Navigation("CreatedBy"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectAllocation", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "AssignedBy") + .WithMany() + .HasForeignKey("AssignedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "Employee") + .WithMany() + .HasForeignKey("EmployeeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "ReAssignedBy") + .WithMany() + .HasForeignKey("ReAssignedById"); + + b.HasOne("Marco.Pms.Model.ServiceProject.TeamRoleMaster", "TeamRole") + .WithMany() + .HasForeignKey("TeamRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssignedBy"); + + b.Navigation("Employee"); + + b.Navigation("Project"); + + b.Navigation("ReAssignedBy"); + + b.Navigation("TeamRole"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectServiceMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.ServiceMaster", "Service") + .WithMany() + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("Service"); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTag", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Tenant"); + }); + + modelBuilder.Entity("Marco.Pms.Model.ServiceProject.ServiceProjectTagMapping", b => + { + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProject", "ServiceProject") + .WithMany() + .HasForeignKey("ServiceProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.ServiceProject.ServiceProjectTag", "ServiceProjectTag") + .WithMany() + .HasForeignKey("ServiceProjectTagId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceProject"); + + b.Navigation("ServiceProjectTag"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlan", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("Plan"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.Tenant", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId"); + + b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Organization") + .WithMany() + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.TenantStatus", "TenantStatus") + .WithMany() + .HasForeignKey("TenantStatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + + b.Navigation("Organization"); + + b.Navigation("TenantStatus"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantEnquire", b => + { + b.HasOne("Marco.Pms.Model.Master.Industry", "Industry") + .WithMany() + .HasForeignKey("IndustryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Industry"); + }); + + modelBuilder.Entity("Marco.Pms.Model.TenantModels.TenantSubscriptions", b => + { + b.HasOne("Marco.Pms.Model.Employees.Employee", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.CurrencyMaster", "Currency") + .WithMany() + .HasForeignKey("CurrencyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.PaymentGetway.PaymentDetail", "PaymentDetail") + .WithMany() + .HasForeignKey("PaymentDetailId"); + + b.HasOne("Marco.Pms.Model.TenantModels.SubscriptionPlanDetails", "Plan") + .WithMany() + .HasForeignKey("PlanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Master.SubscriptionStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Marco.Pms.Model.Employees.Employee", "UpdatedBy") + .WithMany() + .HasForeignKey("UpdatedById"); + + b.Navigation("CreatedBy"); + + b.Navigation("Currency"); + + b.Navigation("PaymentDetail"); + + b.Navigation("Plan"); + + b.Navigation("Status"); + + b.Navigation("Tenant"); + + b.Navigation("UpdatedBy"); + }); + + modelBuilder.Entity("Marco.Pms.Model.Utilities.FCMTokenMapping", b => + { + b.HasOne("Marco.Pms.Model.TenantModels.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/20251206102239_Removed_MaiLogs_Table.cs b/Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.cs new file mode 100644 index 0000000..ba08a7f --- /dev/null +++ b/Marco.Pms.DataAccess/Migrations/20251206102239_Removed_MaiLogs_Table.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Marco.Pms.DataAccess.Migrations +{ + /// + public partial class Removed_MaiLogs_Table : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "MailLogs"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "MailLogs", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Body = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + EmailId = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + EmployeeId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + ProjectId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + TimeStamp = table.Column(type: "datetime(6)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_MailLogs", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + } +} diff --git a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs index 83c923c..b8e7460 100644 --- a/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Marco.Pms.DataAccess/Migrations/ApplicationDbContextModelSnapshot.cs @@ -3171,37 +3171,6 @@ namespace Marco.Pms.DataAccess.Migrations 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") diff --git a/Marco.Pms.Helpers/Utility/MailLogHelper.cs b/Marco.Pms.Helpers/Utility/MailLogHelper.cs new file mode 100644 index 0000000..e674714 --- /dev/null +++ b/Marco.Pms.Helpers/Utility/MailLogHelper.cs @@ -0,0 +1,34 @@ +using Marco.Pms.Model.Mail; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using MongoDB.Driver; + +namespace Marco.Pms.Helpers.Utility +{ + public class MailLogHelper + { + private readonly IMongoCollection _collection; + private readonly ILogger _logger; + public MailLogHelper(IConfiguration configuration, ILogger logger) + { + _logger = logger; + var connectionString = configuration["MongoDB:MailConnectionString"]; + var mongoUrl = new MongoUrl(connectionString); + var client = new MongoClient(mongoUrl); // Your MongoDB connection string + var mongoDB = client.GetDatabase(mongoUrl.DatabaseName); // Your MongoDB Database name + _collection = mongoDB.GetCollection("MailLogs"); + } + + public async Task AddWebMenuItemAsync(List mailLogs) + { + try + { + await _collection.InsertManyAsync(mailLogs); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occurred while adding Mail Logs."); + } + } + } +} diff --git a/Marco.Pms.Services/Helpers/ReportHelper.cs b/Marco.Pms.Services/Helpers/ReportHelper.cs index cfcb474..25acda6 100644 --- a/Marco.Pms.Services/Helpers/ReportHelper.cs +++ b/Marco.Pms.Services/Helpers/ReportHelper.cs @@ -1,4 +1,5 @@ using Marco.Pms.DataAccess.Data; +using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Mail; @@ -17,12 +18,14 @@ namespace Marco.Pms.Services.Helpers private readonly IEmailSender _emailSender; private readonly ILoggingService _logger; private readonly CacheUpdateHelper _cache; - public ReportHelper(ApplicationDbContext context, IEmailSender emailSender, ILoggingService logger, CacheUpdateHelper cache) + private readonly MailLogHelper _mailLogger; + public ReportHelper(ApplicationDbContext context, IEmailSender emailSender, ILoggingService logger, CacheUpdateHelper cache, MailLogHelper mailLogger) { _context = context; _emailSender = emailSender; _logger = logger; _cache = cache; + _mailLogger = mailLogger; } public async Task GetDailyProjectReportWithOutTenant(Guid projectId, DateTime reportDate) @@ -599,7 +602,8 @@ namespace Marco.Pms.Services.Helpers TenantId = tenantId }).ToList(); - _context.MailLogs.AddRange(mailLogs); + //_context.MailLogs.AddRange(mailLogs); + await _mailLogger.AddWebMenuItemAsync(mailLogs); try { diff --git a/Marco.Pms.Services/Program.cs b/Marco.Pms.Services/Program.cs index bc54c3f..d6fc6db 100644 --- a/Marco.Pms.Services/Program.cs +++ b/Marco.Pms.Services/Program.cs @@ -212,6 +212,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); #endregion // Singleton services (one instance for the app's lifetime) diff --git a/Marco.Pms.Services/appsettings.Development.json b/Marco.Pms.Services/appsettings.Development.json index 8d88a0b..0851839 100644 --- a/Marco.Pms.Services/appsettings.Development.json +++ b/Marco.Pms.Services/appsettings.Development.json @@ -42,7 +42,8 @@ "MongoDB": { "SerilogDatabaseUrl": "mongodb://devuser:DevPass123@147.93.98.152:27017/DotNetLogsLocalDev?authSource=admin&eplicaSet=rs01&directConnection=true", "ConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalCache?authSource=admin&eplicaSet=rs01&directConnection=true&socketTimeoutMS=500&serverSelectionTimeoutMS=500&connectTimeoutMS=500", - "ModificationConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalDev?authSource=admin&eplicaSet=rs01&directConnection=true" + "ModificationConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MarcoBMSLocalDev?authSource=admin&eplicaSet=rs01&directConnection=true", + "MailConnectionString": "mongodb://devuser:DevPass123@147.93.98.152:27017/MailLogsLocalDev?authSource=admin&eplicaSet=rs01&directConnection=true" }, "Razorpay": { "Key": "rzp_test_RXCzgEcXucbuAi", -- 2.43.0 From 9fbaf03ce4cfea455cb896784c20847b20a979f0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 16:08:43 +0530 Subject: [PATCH 38/58] Updated the encription fuction --- .../Extensions/EncryptResponseAttribute.cs | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs index ad6a580..3b321fc 100644 --- a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs +++ b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc.Filters; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Security.Cryptography; +using System.Text; public class EncryptResponseAttribute : TypeFilterAttribute { @@ -71,29 +72,62 @@ public class EncryptResponseAttribute : TypeFilterAttribute aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; - // We do NOT use 'using' on the MemoryStream here yet, - // because we need to read from it after the CryptoStream finishes. + // 1. Convert string to bytes directly (Avoids StreamWriter encoding issues) + var plainBytes = Encoding.UTF8.GetBytes(plainText); + using var ms = new MemoryStream(); - // Write IV first (16 bytes) + // 2. Write IV (16 bytes) ms.Write(aes.IV, 0, aes.IV.Length); using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV)) using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) - using (var sw = new StreamWriter(cs)) { - // CRITICAL FIX: Use Async Write - await sw.WriteAsync(plainText); + // 3. Write Data + await cs.WriteAsync(plainBytes, 0, plainBytes.Length); - // Flush the writer, but do not close the underlying streams yet via 'using' exit - await sw.FlushAsync(); + // 4. CRITICAL: Flush the final block (Padding) to the MemoryStream + // Without this, Dart receives incomplete data and throws "Invalid Padding" + cs.FlushFinalBlock(); } - // At this point, CryptoStream is closed (disposed by using block), - // causing the final block to be flushed to MemoryStream. - // MemoryStream is technically closed, but .NET allows ToArray() on closed MemoryStreams. - + // 5. Convert full stream to Base64 return Convert.ToBase64String(ms.ToArray()); } + + //private async Task EncryptAsync(string plainText) + //{ + // if (string.IsNullOrEmpty(plainText)) return plainText; + + // using var aes = Aes.Create(); + // aes.Key = Convert.FromBase64String(_keyBase64); + // aes.GenerateIV(); + // aes.Mode = CipherMode.CBC; + // aes.Padding = PaddingMode.PKCS7; + + // // We do NOT use 'using' on the MemoryStream here yet, + // // because we need to read from it after the CryptoStream finishes. + // using var ms = new MemoryStream(); + + // // Write IV first (16 bytes) + // ms.Write(aes.IV, 0, aes.IV.Length); + + // using (var encryptor = aes.CreateEncryptor(aes.Key, aes.IV)) + // using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) + // using (var sw = new StreamWriter(cs)) + // { + // // CRITICAL FIX: Use Async Write + // await sw.WriteAsync(plainText); + + // // Flush the writer, but do not close the underlying streams yet via 'using' exit + // await sw.FlushAsync(); + // } + + // // At this point, CryptoStream is closed (disposed by using block), + // // causing the final block to be flushed to MemoryStream. + // // MemoryStream is technically closed, but .NET allows ToArray() on closed MemoryStreams. + + // return Convert.ToBase64String(ms.ToArray()); + //} } } \ No newline at end of file -- 2.43.0 From 4f427a58c4c19e90e3c313ae47a7177ec97148a0 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Sat, 6 Dec 2025 16:39:15 +0530 Subject: [PATCH 39/58] Changed the encription key for response --- Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs index 3b321fc..e861515 100644 --- a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs +++ b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs @@ -14,7 +14,8 @@ public class EncryptResponseAttribute : TypeFilterAttribute private class EncryptResponseFilter : IAsyncResultFilter { // 32-byte Key - private readonly string _keyBase64 = "h9J4kL2mN5pQ8rS1tV3wX6yZ0aB7cD9eF1gH3jK5mN6="; + //private readonly string _keyBase64 = "h9J4kL2mN5pQ8rS1tV3wX6yZ0aB7cD9eF1gH3jK5mN6="; + private readonly string _keyBase64 = "u4J7p9Qx2hF5vYtLz8Kq3mN1sG0bRwXyZcD6eH8jFQw="; public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { -- 2.43.0 From 82c9f249ef805a5507cdf4f127b2b7da22ec22c2 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Dec 2025 10:02:59 +0530 Subject: [PATCH 40/58] Added an new API to filter expense by advance filter --- Marco.Pms.Model/Filters/AdvanceItem.cs | 2 +- .../Controllers/ExpenseController.cs | 8 + .../Extensions/QueryableExtensions.cs | 59 +++- Marco.Pms.Services/Service/ExpensesService.cs | 277 +++++++++++++++++- .../ServiceInterfaces/IExpensesService.cs | 1 + 5 files changed, 335 insertions(+), 12 deletions(-) diff --git a/Marco.Pms.Model/Filters/AdvanceItem.cs b/Marco.Pms.Model/Filters/AdvanceItem.cs index 33d6532..2d8ef6b 100644 --- a/Marco.Pms.Model/Filters/AdvanceItem.cs +++ b/Marco.Pms.Model/Filters/AdvanceItem.cs @@ -3,7 +3,7 @@ public class AdvanceItem { public string Column { get; set; } = string.Empty; - public string Opration { get; set; } = string.Empty; // "greater than", "equal to", etc. + public string Operation { get; set; } = string.Empty; // "greater than", "equal to", etc. public string Value { get; set; } = string.Empty; } } diff --git a/Marco.Pms.Services/Controllers/ExpenseController.cs b/Marco.Pms.Services/Controllers/ExpenseController.cs index c3196a0..c5aa29a 100644 --- a/Marco.Pms.Services/Controllers/ExpenseController.cs +++ b/Marco.Pms.Services/Controllers/ExpenseController.cs @@ -46,6 +46,14 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpGet("list-dynamic")] + public async Task GetExpensesListDynamic([FromQuery] string? searchString, [FromQuery] string? filter, [FromQuery] int pageSize = 20, [FromQuery] int pageNumber = 1) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _expensesService.GetExpensesListDynamicAsync(loggedInEmployee, tenantId, searchString, filter, pageSize, pageNumber); + return StatusCode(response.StatusCode, response); + } + [HttpGet("details/{id?}")] public async Task GetExpenseDetails(Guid? id, [FromQuery] string? expenseUId) { diff --git a/Marco.Pms.Services/Extensions/QueryableExtensions.cs b/Marco.Pms.Services/Extensions/QueryableExtensions.cs index 865203a..633d87e 100644 --- a/Marco.Pms.Services/Extensions/QueryableExtensions.cs +++ b/Marco.Pms.Services/Extensions/QueryableExtensions.cs @@ -18,19 +18,62 @@ namespace Marco.Pms.Services.Extensions { if (string.IsNullOrWhiteSpace(advanceFilter.Column)) continue; - string op = advanceFilter.Opration.ToLower().Trim(); + string op = advanceFilter.Operation.ToLower().Trim(); string predicate = ""; // Map your custom strings to Dynamic LINQ operators switch (op) { - case "greater than": predicate = $"{advanceFilter.Column} > @0"; break; - case "less than": predicate = $"{advanceFilter.Column} < @0"; break; - case "equal to": predicate = $"{advanceFilter.Column} == @0"; break; - case "not equal": predicate = $"{advanceFilter.Column} != @0"; break; - case "greater or equal": predicate = $"{advanceFilter.Column} >= @0"; break; - case "smaller or equal": predicate = $"{advanceFilter.Column} <= @0"; break; - default: continue; + // --- Equality --- + case "eq": + case "equal to": + predicate = $"{advanceFilter.Column} == @0"; + break; + + case "neq": + case "not equal": + predicate = $"{advanceFilter.Column} != @0"; + break; + + // --- Numeric / Date Comparison --- + case "gt": + case "greater than": + case "after": // Date specific + predicate = $"{advanceFilter.Column} > @0"; + break; + + case "gte": + case "greater or equal": + predicate = $"{advanceFilter.Column} >= @0"; + break; + + case "lt": // Added for consistency + case "less than": + case "before": // Date specific + predicate = $"{advanceFilter.Column} < @0"; + break; + + case "lte": + case "less or equal": + case "smaller or equal": + predicate = $"{advanceFilter.Column} <= @0"; + break; + + // --- Text Specific --- + case "contains": + predicate = $"{advanceFilter.Column}.Contains(@0)"; + break; + + case "starts": + predicate = $"{advanceFilter.Column}.StartsWith(@0)"; + break; + + case "ends": + predicate = $"{advanceFilter.Column}.EndsWith(@0)"; + break; + + default: + continue; } if (!string.IsNullOrEmpty(predicate)) diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index d3309b9..5b7d5ce 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -21,6 +21,7 @@ using Marco.Pms.Model.ViewModels.Expenses; using Marco.Pms.Model.ViewModels.Expenses.Masters; using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Projects; +using Marco.Pms.Services.Extensions; using Marco.Pms.Services.Helpers; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Service; @@ -38,7 +39,6 @@ namespace Marco.Pms.Services.Service private readonly ILoggingService _logger; private readonly S3UploadService _s3Service; private readonly IServiceScopeFactory _serviceScopeFactory; - private readonly UtilityMongoDBHelper _updateLogHelper; private readonly CacheUpdateHelper _cache; private readonly IMapper _mapper; @@ -65,7 +65,6 @@ namespace Marco.Pms.Services.Service IDbContextFactory dbContextFactory, ApplicationDbContext context, IServiceScopeFactory serviceScopeFactory, - UtilityMongoDBHelper updateLogHelper, CacheUpdateHelper cache, ILoggingService logger, S3UploadService s3Service, @@ -76,7 +75,6 @@ namespace Marco.Pms.Services.Service _logger = logger; _cache = cache; _serviceScopeFactory = serviceScopeFactory; - _updateLogHelper = updateLogHelper; _s3Service = s3Service; _mapper = mapper; } @@ -321,6 +319,219 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } + + public async Task> GetExpensesListDynamicAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, 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; + List expenseVM = new List(); + var totalEntites = 0; + + var hasViewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ExpenseViewSelf, loggedInEmployee.Id); + var hasViewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ExpenseViewAll, loggedInEmployee.Id); + + await Task.WhenAll(hasViewSelfPermissionTask, hasViewAllPermissionTask); + + var hasViewAllPermission = hasViewAllPermissionTask.Result; + var hasViewSelfPermission = hasViewSelfPermissionTask.Result; + + if (!hasViewAllPermission && !hasViewSelfPermission) + { + // 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); + } + + + // 2. --- Deserialize Filter and Apply --- + AdvanceFilter? advanceFilter = TryDeserializeAdvanceFilter(filter); + + //var (totalPages, totalCount, cacheList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, + // pageNumber, pageSize, expenseFilter, searchString); + + List? cacheList = null; + var totalPages = 0; + var totalCount = 0; + + // 3. --- Build Base Query and Apply Permissions --- + // Start with a base IQueryable. Filters will be chained onto this. + var expensesQuery = _context.Expenses + .Include(e => e.PaidBy) + .Include(e => e.CreatedBy) + .Include(e => e.ProcessedBy) + .Include(e => e.ApprovedBy) + .Include(e => e.ReviewedBy) + .Include(e => e.PaymentMode) + .Include(e => e.PaymentMode) + .Include(e => e.ExpenseCategory) + .Include(e => e.PaymentRequest) + .Include(e => e.Status) + .Include(e => e.Currency) + .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + + if (cacheList == null) + { + //await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); + + // Apply permission-based filtering BEFORE any other filters or pagination. + if (hasViewAllPermission) + { + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId || e.StatusId != Draft); + } + else if (hasViewSelfPermission) + { + // User only has 'View Self' permission, so restrict the query to their own expenses. + _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); + } + expensesQuery = expensesQuery.ApplyCustomFilters(advanceFilter, "CreatedAt"); + if (advanceFilter != null) + { + if (advanceFilter.Filters != null) + { + expensesQuery = expensesQuery.ApplyListFilters(advanceFilter.Filters); + } + if (advanceFilter.DateFilter != null) + { + expensesQuery = expensesQuery.ApplyDateFilter(advanceFilter.DateFilter); + } + if (advanceFilter.SearchFilters != null) + { + var invoiceSearchFilter = advanceFilter.SearchFilters.Where(f => f.Column != "ProjectName").ToList(); + if (invoiceSearchFilter.Any()) + { + expensesQuery = expensesQuery.ApplySearchFilters(invoiceSearchFilter); + } + } + if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) + { + expensesQuery = expensesQuery.ApplyGroupByFilters(advanceFilter.GroupByColumn); + } + } + + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchStringLower = searchString.ToLower(); + expensesQuery = expensesQuery.Include(e => e.PaidBy).Include(e => e.CreatedBy) + .Where(e => e.Description.ToLower().Contains(searchStringLower) || + (e.TransactionId != null && e.TransactionId.ToLower().Contains(searchStringLower)) || + (e.PaidBy != null && (e.PaidBy.FirstName + " " + e.PaidBy.LastName).ToLower().Contains(searchStringLower)) || + (e.CreatedBy != null && (e.CreatedBy.FirstName + " " + e.CreatedBy.LastName).ToLower().Contains(searchStringLower)) || + (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')).Contains(searchString)); + } + + // 4. --- Apply Ordering and Pagination --- + // This should be the last step before executing the query. + + totalEntites = await expensesQuery.CountAsync(); + + // 5. --- Execute Query and Map Results --- + var expensesList = await expensesQuery + //.OrderByDescending(e => e.CreatedAt) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize).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 projectIds = expensesList.Select(e => e.ProjectId).ToList(); + + var infraProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).Select(p => _mapper.Map(p)).ToListAsync(); + }); + + var serviceProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ServiceProjects.Where(sp => projectIds.Contains(sp.Id) && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).ToListAsync(); + }); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result; + projects.AddRange(serviceProjectTask.Result); + + //expenseVM = await GetAllExpnesRelatedTables(expensesList, tenantId); + expenseVM = expensesList.Select(e => + { + var result = _mapper.Map(e); + result.ExpenseUId = $"{e.UIDPrefix}/{e.UIDPostfix:D5}"; + if (e.PaymentRequest != null) + result.PaymentRequestUID = $"{e.PaymentRequest.UIDPrefix}/{e.PaymentRequest.UIDPostfix:D5}"; + result.Project = projects.FirstOrDefault(p => p.Id == e.ProjectId); + return result; + }).ToList(); + totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); + + } + else + { + var permissionStatusMapping = await _context.StatusPermissionMapping + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + + expenseVM = cacheList.Select(m => + { + var response = _mapper.Map(m); + if (response.Status != null && (response.NextStatus?.Any() ?? false)) + { + response.Status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == Guid.Parse(m.Status.Id)).Select(ps => ps.PermissionIds).FirstOrDefault(); + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } + return response; + }).ToList(); + totalEntites = (int)totalCount; + } + // 7. --- Return Final Success Response --- + var message = $"{expenseVM.Count} expense records fetched successfully."; + _logger.LogInfo(message); + + + var response = new + { + CurrentPage = pageNumber, + TotalPages = totalPages, + TotalEntites = totalEntites, + Data = expenseVM, + }; + return ApiResponse.SuccessResponse(response, message, 200); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Databsae Exception occured while fetching list expenses"); + return ApiResponse.ErrorResponse("Databsae Exception", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error occured while fetching list expenses"); + return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); + } + } + public async Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId) { try @@ -733,6 +944,7 @@ namespace Marco.Pms.Services.Service { using var scope = _serviceScopeFactory.CreateScope(); var _firebase = scope.ServiceProvider.GetRequiredService(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); // 1. Fetch Existing Expense with Related Entities (Single Query) var expense = await _context.Expenses @@ -1061,6 +1273,8 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("The employee Id in the path does not match the Id in the request body.", "The employee Id in the path does not match the Id in the request body.", 400); } + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); // Check if the employee has the required permission var hasManagePermission = await HasPermissionAsync(PermissionsMaster.ExpenseManage, loggedInEmployee.Id); @@ -1294,6 +1508,9 @@ namespace Marco.Pms.Services.Service .Select(ba => ba.DocumentId) .ToListAsync(); + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(existingExpense); _context.Expenses.Remove(existingExpense); @@ -2130,6 +2347,8 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("You do not have permission for this action.", "Access Denied", 403); } + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + // 5. Prepare for update (Audit snapshot) var paymentRequestStateBeforeChange = _updateLogHelper.EntityToBsonDocument(paymentRequest); @@ -2599,6 +2818,9 @@ namespace Marco.Pms.Services.Service bool isVariableRecurring = paymentRequest.RecurringPayment?.IsVariable ?? false; + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + // Capture existing state for auditing var existingEntityBson = _updateLogHelper.EntityToBsonDocument(paymentRequest); @@ -2778,6 +3000,9 @@ namespace Marco.Pms.Services.Service .Select(ba => ba.DocumentId) .ToListAsync(); + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var existingEntityBson = _updateLogHelper.EntityToBsonDocument(paymentRequest); paymentRequest.IsActive = false; @@ -3765,6 +3990,46 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Helper Functions =================================================================== + + private AdvanceFilter? TryDeserializeAdvanceFilter(string? filter) + { + if (string.IsNullOrWhiteSpace(filter)) + { + return null; + } + + var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + AdvanceFilter? advanceFilter = null; + + try + { + // First, try to deserialize directly. This is the expected case (e.g., from a web client). + advanceFilter = 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)) + { + advanceFilter = 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 advanceFilter; + } + private async Task HasPermissionAsync(Guid permission, Guid employeeId) { using var scope = _serviceScopeFactory.CreateScope(); @@ -4135,6 +4400,9 @@ namespace Marco.Pms.Services.Service private async Task DeleteAttachemnts(List documentIds) { + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var attachmentTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); @@ -4176,6 +4444,9 @@ namespace Marco.Pms.Services.Service } private async Task DeletePaymentRequestAttachemnts(List documentIds) { + using var scope = _serviceScopeFactory.CreateScope(); + var _updateLogHelper = scope.ServiceProvider.GetRequiredService(); + var attachmentTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 547862b..57ef55a 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -8,6 +8,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { #region =================================================================== Expenses Functions =================================================================== Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); + Task> GetExpensesListDynamicAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId); Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId); Task> GetFilterObjectAsync(Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From f7e707557adab25717e90884e9449c19ec31a7f1 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Dec 2025 11:26:51 +0530 Subject: [PATCH 41/58] Optimized the get employee list API --- .../Controllers/DashboardController.cs | 65 +++----------- .../Controllers/EmployeeController.cs | 90 +++++++++---------- 2 files changed, 59 insertions(+), 96 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index a68945b..d7294c6 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -4,7 +4,6 @@ using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Expenses; using Marco.Pms.Model.OrganizationModel; -using Marco.Pms.Model.ServiceProject; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; using Marco.Pms.Model.ViewModels.AttendanceVM; @@ -1679,61 +1678,25 @@ namespace Marco.Pms.Services.Controllers query = query.Where(jt => jt.ProjectId == projectId.Value); } var jobs = await query + .Select(jt => new + { + Id = jt.Id, + StatusId = jt.StatusId, + Project = jt.Project!.Name, + AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, + Title = jt.Title, + AssignedAt = jt.CreatedAt, + + }) + .OrderByDescending(jt => jt.AssignedAt) .ToListAsync(); - var inProgressJobIds = jobs.Where(jt => jt.StatusId == InProgressStatus).Select(jt => jt.Id).ToList(); - var latestTagIns = await _context.JobAttendance - .Include(ja => ja.Employee) - .Where(ja => inProgressJobIds.Contains(ja.JobTicketId) - && ja.Action == TAGGING_MARK_TYPE.TAG_IN - && ja.TaggedOutAt == null - && ja.TenantId == tenantId) - .GroupBy(ja => ja.JobTicketId) - .Select(g => new - { - JobTicketId = g.Key, - Employee = g.Select(ja => ja.Employee).FirstOrDefault(), - TagInAt = g.Max(ja => ja.TaggedInAt) - }) - .ToListAsync(); + var assignedJobs = jobs.Where(jt => jt.StatusId == AssignedStatus).Take(5).OrderBy(jt => jt.Title).ToList(); - var assignedJobs = jobs - .Where(jt => jt.StatusId == AssignedStatus) - .Take(5) - .Select(jt => new - { - Project = jt.Project!.Name, - AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, - Title = jt.Title, - AssignedAt = jt.CreatedAt, + var inProgressJobs = jobs.Where(jt => jt.StatusId == InProgressStatus).Take(5).OrderBy(jt => jt.Title).ToList(); - }) - .ToList(); - var inProgressJobs = jobs - .Where(jt => jt.StatusId == InProgressStatus) - .Take(5) - .Select(jt => new - { - Project = jt.Project!.Name, - AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, - Title = jt.Title, - AssignedAt = jt.CreatedAt, - - }) - .ToList(); - var selfAssignedJobs = jobs - .Where(jt => jobIds.Contains(jt.Id)) - .Take(5) - .Select(jt => new - { - Project = jt.Project!.Name, - AssignedBy = jt.CreatedBy!.FirstName + " " + jt.CreatedBy.LastName, - Title = jt.Title, - AssignedAt = jt.CreatedAt, - - }) - .ToList(); + var selfAssignedJobs = jobs.Where(jt => jobIds.Contains(jt.Id)).Take(5).OrderBy(jt => jt.Title).ToList(); var response = new { diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 15da5d4..0555529 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -249,67 +249,67 @@ namespace MarcoBMS.Services.Controllers var hasViewAllEmployeesPermission = viewAllTask.Result; var hasViewTeamMembersPermission = viewTeamTask.Result; + if (!hasViewAllEmployeesPermission && !hasViewTeamMembersPermission) + { + _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have permission to view employees", loggedInEmployee.Id); + return StatusCode(403, ApiResponse.ErrorResponse("Access denied", "User does not have permission to view employees", 403)); + } + + var projectIds = await _projectServices.GetMyProjectIdsAsync(loggedInEmployee, tenantId); + + var projectAllocationQuery = _context.ProjectAllocations + .AsNoTracking() + .Where(pa => + projectIds.Contains(pa.ProjectId) + && pa.IsActive + && pa.TenantId == tenantId); + + if (projectId.HasValue) + projectAllocationQuery = projectAllocationQuery.Where(pa => pa.ProjectId == projectId); + + var employeeIds = await projectAllocationQuery + .Select(pa => pa.EmployeeId) + .Distinct() + .ToListAsync(); + List employees = new List(); - // Step 4: Query based on permission - if (hasViewAllEmployeesPermission && !projectId.HasValue) - { - // OrganizationId needs to be retrieved from loggedInEmployee or context based on your app's structure - var employeeQuery = _context.Employees + var employeeQuery = _context.Employees .AsNoTracking() // Optimize EF query for read-only operation[web:1][web:13][web:18] .Include(e => e.JobRole) - .Where(e => e.OrganizationId == organizationId); + .Where(e => e.IsActive != showInactive); - employeeQuery = showInactive - ? employeeQuery.Where(e => !e.IsActive) - : employeeQuery.Where(e => e.IsActive); - - employees = await employeeQuery.ToListAsync(); + // Step 4: Query based on permission + if (hasViewAllEmployeesPermission) + { + // OrganizationId needs to be retrieved from loggedInEmployee or context based on your app's structure + if (projectId.HasValue) + { + employeeQuery = employeeQuery + .Where(e => employeeIds.Contains(e.Id)); + } + else + { + employeeQuery = employeeQuery + .Where(e => e.OrganizationId == organizationId || employeeIds.Contains(e.Id)); + } + employees = await employeeQuery + .Distinct() + .ToListAsync(); _logger.LogInfo("Employee list fetched with full access. Count: {Count}", employees.Count); } - else if (hasViewTeamMembersPermission && !showInactive && !projectId.HasValue) + else if (hasViewTeamMembersPermission && !showInactive) { // Only active team members with limited permission - var projectIds = await _projectServices.GetMyProjectIdsAsync(loggedInEmployee, tenantId); - employees = await _context.ProjectAllocations - .AsNoTracking() - .Include(pa => pa.Employee) - .ThenInclude(e => e!.JobRole) - .Where(pa => - projectIds.Contains(pa.ProjectId) - && pa.IsActive - && pa.Employee != null - && pa.Employee.IsActive - && pa.TenantId == tenantId) - .Select(pa => pa.Employee!) + employees = await employeeQuery + .Where(e => employeeIds.Contains(e.Id)) .Distinct() .ToListAsync(); _logger.LogInfo("Employee list fetched with limited access (active only). Count: {Count}", employees.Count); } - // If a specific projectId is provided, override employee fetching to ensure strict project context - if (projectId.HasValue) - { - employees = await _context.ProjectAllocations - .AsNoTracking() - .Include(pa => pa.Employee) - .ThenInclude(e => e!.JobRole) - .Where(pa => - pa.ProjectId == projectId - && pa.IsActive - && pa.Employee != null - && pa.Employee.IsActive - && pa.TenantId == tenantId) - .Select(pa => pa.Employee!) - .Distinct() - .ToListAsync(); - - _logger.LogInfo("Employee list fetched for specific project. ProjectId: {ProjectId}. Count: {Count}", - projectId, employees.Count); - } - // Step 5: Map to view model result = employees.Select(e => _mapper.Map(e)).Distinct().ToList(); -- 2.43.0 From 93c4803634241db441f606167422a5036eec599b Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Dec 2025 12:24:14 +0530 Subject: [PATCH 42/58] Valided the organization by it name --- .../Service/OrganizationService.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index e116a4a..8c49917 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -425,24 +425,31 @@ namespace Marco.Pms.Services.Service return await permissionService.HasPermission(PermissionsMaster.AddOrganization, loggedInEmployee.Id); }); - var isPrimaryOrganizationTask = Task.Run(async () => + var isOrganizationExistTask = Task.Run(async () => { await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Tenants.AnyAsync(t => t.OrganizationId == loggedInEmployee.OrganizationId); + return await context.Organizations.AnyAsync(t => t.Name == model.Name); }); - await Task.WhenAll(hasPermissionTask, isPrimaryOrganizationTask); + await Task.WhenAll(hasPermissionTask, isOrganizationExistTask); bool hasPermission = hasPermissionTask.Result; - bool isPrimaryOrganization = isPrimaryOrganizationTask.Result; + bool isOrganizationExist = isOrganizationExistTask.Result; // Check user access permission - if (!hasPermission && !isPrimaryOrganization) + if (!hasPermission) { _logger.LogWarning("User {EmployeeId} attempted to create a new organization without permission", loggedInEmployee.Id); return ApiResponse.ErrorResponse("Access Denied", "You do not have permission to create new organization.", 403); } + // check if organization name already exists + if (isOrganizationExist) + { + _logger.LogWarning("Organization with name {OrganizationName} already exists", model.Name); + return ApiResponse.ErrorResponse("Organization already exists", "Organization with name already exists", 409); + } + // Get last SPRID and increment for new organization var lastOrganization = await _context.Organizations.OrderByDescending(sp => sp.SPRID).FirstOrDefaultAsync(); long lastSPRID = lastOrganization?.SPRID ?? 5400; -- 2.43.0 From d00ddb8e8bcf42168b2d1c0225938b53a7d25f47 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Dec 2025 15:02:50 +0530 Subject: [PATCH 43/58] Sloved the project not found in expense deatils --- Marco.Pms.Services/MappingProfiles/MappingProfile.cs | 4 ++-- Marco.Pms.Services/Service/ExpensesService.cs | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index bd6b2dc..9988457 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -169,13 +169,13 @@ namespace Marco.Pms.Services.MappingProfiles CreateMap() .ForMember( dest => dest.Id, - opt => opt.MapFrom(src => new Guid(src.Id))); + opt => opt.MapFrom(src => string.IsNullOrWhiteSpace(src.Id) ? Guid.Empty : new Guid(src.Id))); CreateMap() .ForMember( dest => dest.Id, // Explicitly and safely convert string Id to Guid Id - opt => opt.MapFrom(src => new Guid(src.Id)) + opt => opt.MapFrom(src => string.IsNullOrWhiteSpace(src.Id) ? Guid.Empty : new Guid(src.Id)) ).ForMember( dest => dest.ProjectStatusId, // Explicitly and safely convert string ProjectStatusId to Guid ProjectStatusId diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 5b7d5ce..9d57eb7 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -319,7 +319,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } - public async Task> GetExpensesListDynamicAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber) { try @@ -531,7 +530,6 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } - public async Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId) { try -- 2.43.0 From dac1e1368571e473ed5b00b78f131f23c23516cb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 8 Dec 2025 17:25:20 +0530 Subject: [PATCH 44/58] Update the advance filter in collection controller --- .../Data/ApplicationDbContext.cs | 1 + Marco.Pms.Model/Collection/Invoice.cs | 3 ++ .../ViewModels/Collection/InvoiceListVM.cs | 4 +- .../Controllers/CollectionController.cs | 50 ++++++------------- .../MappingProfiles/MappingProfile.cs | 8 ++- 5 files changed, 28 insertions(+), 38 deletions(-) diff --git a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs index d2dc283..c15c297 100644 --- a/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs +++ b/Marco.Pms.DataAccess/Data/ApplicationDbContext.cs @@ -659,6 +659,7 @@ namespace Marco.Pms.DataAccess.Data } ); } + private static void ManageApplicationStructure(ModelBuilder modelBuilder) { // Configure ApplicationRole to Tenant relationship (if Tenant exists) diff --git a/Marco.Pms.Model/Collection/Invoice.cs b/Marco.Pms.Model/Collection/Invoice.cs index cd3bbdf..b581386 100644 --- a/Marco.Pms.Model/Collection/Invoice.cs +++ b/Marco.Pms.Model/Collection/Invoice.cs @@ -38,5 +38,8 @@ namespace Marco.Pms.Model.Collection [ValidateNever] [ForeignKey("UpdatedById")] public Employee? UpdatedBy { get; set; } + + public ICollection ReceivedInvoicePayments { get; set; } + = new List(); } } diff --git a/Marco.Pms.Model/ViewModels/Collection/InvoiceListVM.cs b/Marco.Pms.Model/ViewModels/Collection/InvoiceListVM.cs index 2b1796e..ab70c76 100644 --- a/Marco.Pms.Model/ViewModels/Collection/InvoiceListVM.cs +++ b/Marco.Pms.Model/ViewModels/Collection/InvoiceListVM.cs @@ -12,12 +12,14 @@ namespace Marco.Pms.Model.ViewModels.Collection public string InvoiceNumber { get; set; } = default!; public string? EInvoiceNumber { get; set; } public BasicOrganizationVm? BilledTo { get; set; } - public BasicProjectVM? Project { get; set; } + public Guid ProjectId { get; set; } + public BasicProjectVM Project { get; set; } = new BasicProjectVM(); public DateTime InvoiceDate { get; set; } public DateTime ClientSubmitedDate { get; set; } public DateTime ExceptedPaymentDate { get; set; } public double BasicAmount { get; set; } public double TaxAmount { get; set; } + public double TotalAmount { get; set; } public double BalanceAmount { get; set; } public bool IsActive { get; set; } public bool MarkAsCompleted { get; set; } diff --git a/Marco.Pms.Services/Controllers/CollectionController.cs b/Marco.Pms.Services/Controllers/CollectionController.cs index 61b18b4..e9b24d5 100644 --- a/Marco.Pms.Services/Controllers/CollectionController.cs +++ b/Marco.Pms.Services/Controllers/CollectionController.cs @@ -1,4 +1,5 @@ using AutoMapper; +using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Collection; @@ -143,7 +144,9 @@ namespace Marco.Pms.Services.Controllers .Include(i => i.BilledTo) .Include(i => i.CreatedBy).ThenInclude(e => e!.JobRole) .Include(i => i.UpdatedBy).ThenInclude(e => e!.JobRole) - .Where(i => projIds.Contains(i.ProjectId) && i.IsActive == isActive && i.TenantId == tenantId); + .Include(i => i.ReceivedInvoicePayments) + .Where(i => projIds.Contains(i.ProjectId) && i.IsActive == isActive && i.TenantId == tenantId) + .ProjectTo(_mapper.ConfigurationProvider); // Filter by date, ensuring date boundaries are correct if (fromDate.HasValue && toDate.HasValue) @@ -177,6 +180,12 @@ namespace Marco.Pms.Services.Controllers } } + if (isPending) + { + query = query.Where(i => i.BalanceAmount > 0 && !i.MarkAsCompleted); + _logger.LogDebug("Pending filter applied."); + } + var totalItems = await query.CountAsync(); var totalPages = (int)Math.Ceiling((double)totalItems / pageSize); _logger.LogInfo("Total invoices found: {TotalItems}", totalItems); @@ -195,45 +204,14 @@ namespace Marco.Pms.Services.Controllers )); } - // Fetch related payments in a single query to minimize DB calls - var invoiceIds = pagedInvoices.Select(i => i.Id).ToList(); - var paymentGroups = await _context.ReceivedInvoicePayments - .AsNoTracking() - .Where(p => invoiceIds.Contains(p.InvoiceId) && p.TenantId == tenantId) - .GroupBy(p => p.InvoiceId) - .Select(g => new { InvoiceId = g.Key, PaidAmount = g.Sum(p => p.Amount) }) - .ToDictionaryAsync(g => g.InvoiceId, g => g.PaidAmount); - _logger.LogDebug("Received payment data for {Count} invoices.", paymentGroups.Count); + pagedInvoices.ForEach(i => i.Project = projects.Where(sp => sp.Id == i.ProjectId).FirstOrDefault()!); - // Build results and compute balances in memory for tight control - var results = new List(); - - foreach (var invoice in pagedInvoices) - { - var total = invoice.BasicAmount + invoice.TaxAmount; - var paid = paymentGroups.GetValueOrDefault(invoice.Id, 0); - var balance = total - paid; - - // Filter pending - if (isPending && (balance <= 0 || invoice.MarkAsCompleted)) - continue; - - var vm = _mapper.Map(invoice); - - // Project mapping logic - minimize nested object allocations - vm.Project = projects.Where(sp => sp.Id == invoice.ProjectId).FirstOrDefault(); - - - vm.BalanceAmount = balance; - results.Add(vm); - } - - _logger.LogInfo("Returning {Count} invoices (page {PageNumber} of {TotalPages}).", results.Count, pageNumber, totalPages); + _logger.LogInfo("Returning {Count} invoices (page {PageNumber} of {TotalPages}).", pagedInvoices.Count, pageNumber, totalPages); return Ok(ApiResponse.SuccessResponse( - new { CurrentPage = pageNumber, TotalPages = totalPages, TotalEntities = totalItems, Data = results }, - $"{results.Count} invoices fetched successfully." + new { CurrentPage = pageNumber, TotalPages = totalPages, TotalEntities = totalItems, Data = pagedInvoices }, + $"{pagedInvoices.Count} invoices fetched successfully." )); } catch (Exception ex) diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 9988457..fc02782 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -370,7 +370,13 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Collection ======================================================= CreateMap(); - CreateMap(); + CreateMap() + .ForMember( + dest => dest.TotalAmount, + opt => opt.MapFrom(src => src.BasicAmount + src.TaxAmount)) + .ForMember( + dest => dest.BalanceAmount, + opt => opt.MapFrom(src => (src.BasicAmount + src.TaxAmount) - src.ReceivedInvoicePayments.Sum(rip => rip.Amount))); CreateMap(); CreateMap(); -- 2.43.0 From 6a300db97cb92f2991b0e15f0debe68a3ed5415e Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 13:12:14 +0530 Subject: [PATCH 45/58] Optimized the expense list and expense details APIs --- Marco.Pms.Model/Collection/Invoice.cs | 3 +- Marco.Pms.Model/Expenses/Expenses.cs | 6 +- .../Master/ExpensesStatusMaster.cs | 6 +- .../ViewModels/Expenses/ExpenseList.cs | 1 + .../Master/ExpensesStatusMasterVM.cs | 2 +- .../MappingProfiles/MappingProfile.cs | 25 +- Marco.Pms.Services/Service/ExpensesService.cs | 492 ++++++++++-------- Marco.Pms.Services/Service/MasterService.cs | 2 +- .../Service/OrganizationService.cs | 9 +- .../ServiceInterfaces/IExpensesService.cs | 3 +- 10 files changed, 306 insertions(+), 243 deletions(-) diff --git a/Marco.Pms.Model/Collection/Invoice.cs b/Marco.Pms.Model/Collection/Invoice.cs index b581386..c8c5a4b 100644 --- a/Marco.Pms.Model/Collection/Invoice.cs +++ b/Marco.Pms.Model/Collection/Invoice.cs @@ -39,7 +39,6 @@ namespace Marco.Pms.Model.Collection [ForeignKey("UpdatedById")] public Employee? UpdatedBy { get; set; } - public ICollection ReceivedInvoicePayments { get; set; } - = new List(); + public ICollection ReceivedInvoicePayments { get; set; } = new List(); } } diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs index 10335fe..7a48485 100644 --- a/Marco.Pms.Model/Expenses/Expenses.cs +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -15,9 +15,9 @@ namespace Marco.Pms.Model.Expenses public Guid ProjectId { get; set; } public Guid ExpensesTypeId { get; set; } - //[ValidateNever] - //[ForeignKey("ExpensesTypeId")] - //public ExpensesTypeMaster? ExpensesType { get; set; } + public ICollection Attachments { get; set; } = new List(); + public ICollection ExpensesReimburseMappings { get; set; } = new List(); + public ICollection ExpenseLogs { get; set; } = new List(); public Guid ExpenseCategoryId { get; set; } diff --git a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs index 35358c3..339b93c 100644 --- a/Marco.Pms.Model/Master/ExpensesStatusMaster.cs +++ b/Marco.Pms.Model/Master/ExpensesStatusMaster.cs @@ -1,4 +1,6 @@ -namespace Marco.Pms.Model.Master +using Marco.Pms.Model.Expenses.Masters; + +namespace Marco.Pms.Model.Master { public class ExpensesStatusMaster { @@ -9,5 +11,7 @@ public string Color { get; set; } = string.Empty; public bool IsSystem { get; set; } = false; public bool IsActive { get; set; } = true; + + public ICollection StatusPermissionMappings { get; set; } = new List(); } } diff --git a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs index d112f1a..5b8bd36 100644 --- a/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs +++ b/Marco.Pms.Model/ViewModels/Expenses/ExpenseList.cs @@ -9,6 +9,7 @@ namespace Marco.Pms.Model.ViewModels.Expanses public class ExpenseList { public Guid Id { get; set; } + public Guid ProjectId { get; set; } public BasicProjectVM? Project { get; set; } public ExpenseCategoryMasterVM? ExpenseCategory { get; set; } public PaymentModeMatserVM? PaymentMode { get; set; } diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs index 8f6f02a..8c5d174 100644 --- a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs @@ -6,7 +6,7 @@ public string Name { get; set; } = string.Empty; public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; - public List? PermissionIds { get; set; } + public List PermissionIds { get; set; } = new List(); public string? Color { get; set; } public bool IsSystem { get; set; } = false; } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index fc02782..5188464 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -293,7 +293,13 @@ namespace Marco.Pms.Services.MappingProfiles #region ======================================================= Expenses ======================================================= - CreateMap(); + CreateMap() + .ForMember( + dest => dest.ExpenseUId, + opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")) + .ForMember( + dest => dest.PaymentRequestUID, + opt => opt.MapFrom(src => src.PaymentRequest != null ? $"{src.PaymentRequest.UIDPrefix}/{src.PaymentRequest.UIDPostfix:D5}" : null)); CreateMap(); CreateMap(); CreateMap(); @@ -320,7 +326,17 @@ namespace Marco.Pms.Services.MappingProfiles dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); - CreateMap(); + CreateMap() + .ForMember( + dest => dest.ExpenseUId, + opt => opt.MapFrom(src => $"{src.UIDPrefix}/{src.UIDPostfix:D5}")) + .ForMember( + dest => dest.PaymentRequestUID, + opt => opt.MapFrom(src => src.PaymentRequest != null ? $"{src.PaymentRequest.UIDPrefix}/{src.PaymentRequest.UIDPostfix:D5}" : null)) + .ForMember( + dest => dest.ExpensesReimburse, + opt => opt.MapFrom(src => src.ExpensesReimburseMappings.Select(erm => erm.ExpensesReimburse).FirstOrDefault())); + CreateMap() .ForMember( dest => dest.Id, @@ -477,7 +493,10 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.DisplayName, opt => opt.MapFrom(src => string.IsNullOrWhiteSpace(src.DisplayName) ? src.Name : src.DisplayName)); - CreateMap(); + CreateMap() + .ForMember( + dest => dest.PermissionIds, + opt => opt.MapFrom(src => src.StatusPermissionMappings.Select(spm => spm.PermissionId))); CreateMap() .ForMember( diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 9d57eb7..6f76f07 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -1,4 +1,5 @@ using AutoMapper; +using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Dtos.Expenses; @@ -16,6 +17,7 @@ using Marco.Pms.Model.MongoDBModels.Utility; using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.Activities; +using Marco.Pms.Model.ViewModels.DocumentManager; using Marco.Pms.Model.ViewModels.Expanses; using Marco.Pms.Model.ViewModels.Expenses; using Marco.Pms.Model.ViewModels.Expenses.Masters; @@ -283,10 +285,10 @@ namespace Marco.Pms.Services.Service var response = _mapper.Map(m); if (response.Status != null && (response.NextStatus?.Any() ?? false)) { - response.Status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == Guid.Parse(m.Status.Id)).Select(ps => ps.PermissionIds).FirstOrDefault(); + response.Status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == Guid.Parse(m.Status.Id)).Select(ps => ps.PermissionIds).FirstOrDefault() ?? new List(); foreach (var status in response.NextStatus) { - status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault() ?? new List(); } } return response; @@ -323,8 +325,7 @@ namespace Marco.Pms.Services.Service { try { - _logger.LogInfo( - "Attempting to fetch expenses list for PageNumber: {PageNumber}, PageSize: {PageSize} with Filter: {Filter}", + _logger.LogInfo("Attempting to fetch expenses list for PageNumber: {PageNumber}, PageSize: {PageSize} with Filter: {Filter}", pageNumber, pageSize, filter ?? ""); // 1. --- Get User Permissions --- @@ -334,9 +335,6 @@ namespace Marco.Pms.Services.Service _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; - List expenseVM = new List(); - var totalEntites = 0; var hasViewSelfPermissionTask = HasPermissionAsync(PermissionsMaster.ExpenseViewSelf, loggedInEmployee.Id); var hasViewAllPermissionTask = HasPermissionAsync(PermissionsMaster.ExpenseViewAll, loggedInEmployee.Id); @@ -349,7 +347,7 @@ namespace Marco.Pms.Services.Service if (!hasViewAllPermission && !hasViewSelfPermission) { // User has neither required permission. Deny access. - _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployeeId); + _logger.LogWarning("Access DENIED for employee {EmployeeId} attempting to get expenses list.", loggedInEmployee.Id); return ApiResponse.SuccessResponse(new List(), "You do not have permission to view any expenses.", 200); } @@ -357,13 +355,6 @@ namespace Marco.Pms.Services.Service // 2. --- Deserialize Filter and Apply --- AdvanceFilter? advanceFilter = TryDeserializeAdvanceFilter(filter); - //var (totalPages, totalCount, cacheList) = await _cache.GetExpenseListAsync(tenantId, loggedInEmployeeId, hasViewAllPermissionTask.Result, hasViewSelfPermissionTask.Result, - // pageNumber, pageSize, expenseFilter, searchString); - - List? cacheList = null; - var totalPages = 0; - var totalCount = 0; - // 3. --- Build Base Query and Apply Permissions --- // Start with a base IQueryable. Filters will be chained onto this. var expensesQuery = _context.Expenses @@ -380,133 +371,96 @@ namespace Marco.Pms.Services.Service .Include(e => e.Currency) .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. - if (cacheList == null) + // Apply permission-based filtering BEFORE any other filters or pagination. + if (hasViewAllPermission) { - //await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); - - // Apply permission-based filtering BEFORE any other filters or pagination. - if (hasViewAllPermission) - { - expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId || e.StatusId != Draft); - } - else if (hasViewSelfPermission) - { - // User only has 'View Self' permission, so restrict the query to their own expenses. - _logger.LogInfo("User {EmployeeId} has 'View Self' permission. Restricting query to their expenses.", loggedInEmployeeId); - expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployeeId); - } - expensesQuery = expensesQuery.ApplyCustomFilters(advanceFilter, "CreatedAt"); - if (advanceFilter != null) - { - if (advanceFilter.Filters != null) - { - expensesQuery = expensesQuery.ApplyListFilters(advanceFilter.Filters); - } - if (advanceFilter.DateFilter != null) - { - expensesQuery = expensesQuery.ApplyDateFilter(advanceFilter.DateFilter); - } - if (advanceFilter.SearchFilters != null) - { - var invoiceSearchFilter = advanceFilter.SearchFilters.Where(f => f.Column != "ProjectName").ToList(); - if (invoiceSearchFilter.Any()) - { - expensesQuery = expensesQuery.ApplySearchFilters(invoiceSearchFilter); - } - } - if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) - { - expensesQuery = expensesQuery.ApplyGroupByFilters(advanceFilter.GroupByColumn); - } - } - - if (!string.IsNullOrWhiteSpace(searchString)) - { - var searchStringLower = searchString.ToLower(); - expensesQuery = expensesQuery.Include(e => e.PaidBy).Include(e => e.CreatedBy) - .Where(e => e.Description.ToLower().Contains(searchStringLower) || - (e.TransactionId != null && e.TransactionId.ToLower().Contains(searchStringLower)) || - (e.PaidBy != null && (e.PaidBy.FirstName + " " + e.PaidBy.LastName).ToLower().Contains(searchStringLower)) || - (e.CreatedBy != null && (e.CreatedBy.FirstName + " " + e.CreatedBy.LastName).ToLower().Contains(searchStringLower)) || - (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')).Contains(searchString)); - } - - // 4. --- Apply Ordering and Pagination --- - // This should be the last step before executing the query. - - totalEntites = await expensesQuery.CountAsync(); - - // 5. --- Execute Query and Map Results --- - var expensesList = await expensesQuery - //.OrderByDescending(e => e.CreatedAt) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize).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 projectIds = expensesList.Select(e => e.ProjectId).ToList(); - - var infraProjectTask = Task.Run(async () => - { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).Select(p => _mapper.Map(p)).ToListAsync(); - }); - - var serviceProjectTask = Task.Run(async () => - { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.ServiceProjects.Where(sp => projectIds.Contains(sp.Id) && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).ToListAsync(); - }); - - await Task.WhenAll(infraProjectTask, serviceProjectTask); - - var projects = infraProjectTask.Result; - projects.AddRange(serviceProjectTask.Result); - - //expenseVM = await GetAllExpnesRelatedTables(expensesList, tenantId); - expenseVM = expensesList.Select(e => - { - var result = _mapper.Map(e); - result.ExpenseUId = $"{e.UIDPrefix}/{e.UIDPostfix:D5}"; - if (e.PaymentRequest != null) - result.PaymentRequestUID = $"{e.PaymentRequest.UIDPrefix}/{e.PaymentRequest.UIDPostfix:D5}"; - result.Project = projects.FirstOrDefault(p => p.Id == e.ProjectId); - return result; - }).ToList(); - totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); - + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployee.Id || e.StatusId != Draft); } - else + else if (hasViewSelfPermission) { - var permissionStatusMapping = await _context.StatusPermissionMapping - .GroupBy(ps => ps.StatusId) - .Select(g => new - { - StatusId = g.Key, - PermissionIds = g.Select(ps => ps.PermissionId).ToList() - }).ToListAsync(); - - expenseVM = cacheList.Select(m => - { - var response = _mapper.Map(m); - if (response.Status != null && (response.NextStatus?.Any() ?? false)) - { - response.Status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == Guid.Parse(m.Status.Id)).Select(ps => ps.PermissionIds).FirstOrDefault(); - foreach (var status in response.NextStatus) - { - status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); - } - } - return response; - }).ToList(); - totalEntites = (int)totalCount; + // 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.", loggedInEmployee.Id); + expensesQuery = expensesQuery.Where(e => e.CreatedById == loggedInEmployee.Id); } + expensesQuery = expensesQuery.ApplyCustomFilters(advanceFilter, "CreatedAt"); + if (advanceFilter != null) + { + if (advanceFilter.Filters != null) + { + expensesQuery = expensesQuery.ApplyListFilters(advanceFilter.Filters); + } + if (advanceFilter.DateFilter != null) + { + expensesQuery = expensesQuery.ApplyDateFilter(advanceFilter.DateFilter); + } + if (advanceFilter.SearchFilters != null) + { + var invoiceSearchFilter = advanceFilter.SearchFilters.Where(f => f.Column != "ProjectName").ToList(); + if (invoiceSearchFilter.Any()) + { + expensesQuery = expensesQuery.ApplySearchFilters(invoiceSearchFilter); + } + } + if (!string.IsNullOrWhiteSpace(advanceFilter.GroupByColumn)) + { + expensesQuery = expensesQuery.ApplyGroupByFilters(advanceFilter.GroupByColumn); + } + } + + if (!string.IsNullOrWhiteSpace(searchString)) + { + var searchStringLower = searchString.ToLower(); + expensesQuery = expensesQuery.Include(e => e.PaidBy).Include(e => e.CreatedBy) + .Where(e => e.Description.ToLower().Contains(searchStringLower) || + (e.TransactionId != null && e.TransactionId.ToLower().Contains(searchStringLower)) || + (e.PaidBy != null && (e.PaidBy.FirstName + " " + e.PaidBy.LastName).ToLower().Contains(searchStringLower)) || + (e.CreatedBy != null && (e.CreatedBy.FirstName + " " + e.CreatedBy.LastName).ToLower().Contains(searchStringLower)) || + (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')).Contains(searchString)); + } + + // 4. --- Apply Ordering and Pagination --- + // This should be the last step before executing the query. + + var totalEntites = await expensesQuery.CountAsync(); + + var totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); + + // 5. --- Execute Query and Map Results --- + var expensesList = await expensesQuery + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(); + + if (!expensesList.Any()) + { + _logger.LogInfo("No expenses found matching the criteria for employee {EmployeeId}.", loggedInEmployee.Id); + return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); + } + + var projectIds = expensesList.Select(e => e.ProjectId).ToList(); + + var infraProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).Select(p => _mapper.Map(p)).ToListAsync(); + }); + + var serviceProjectTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ServiceProjects.Where(sp => projectIds.Contains(sp.Id) && sp.TenantId == tenantId).Select(sp => _mapper.Map(sp)).ToListAsync(); + }); + + await Task.WhenAll(infraProjectTask, serviceProjectTask); + + var projects = infraProjectTask.Result; + projects.AddRange(serviceProjectTask.Result); + + expensesList.ForEach(e => e.Project = projects.FirstOrDefault(p => p.Id == e.ProjectId)); + // 7. --- Return Final Success Response --- - var message = $"{expenseVM.Count} expense records fetched successfully."; + var message = $"{expensesList.Count} expense records fetched successfully."; _logger.LogInfo(message); @@ -515,7 +469,7 @@ namespace Marco.Pms.Services.Service CurrentPage = pageNumber, TotalPages = totalPages, TotalEntites = totalEntites, - Data = expenseVM, + Data = expensesList, }; return ApiResponse.SuccessResponse(response, message, 200); } @@ -530,112 +484,194 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Error Occured", ExceptionMapper(ex), 500); } } - public async Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId) + + /// + /// Retrieves detailed information for a specific expense, including its status workflow, project details, and attachments. + /// Applies permission filtering and S3 URL generation. + /// + /// The GUID of the expense (optional if expenseUId is provided). + /// The formatted Unique ID of the expense (optional if id is provided). + /// The currently authenticated employee requesting the data. + /// The tenant identifier for data isolation. + /// A standardized API response containing the Expense Detail View Model. + public async Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId) { + // Log entry with structured data for traceability + _logger.LogInfo("Starting execution of GetExpenseDetailsAsync. EmployeeId: {EmployeeId}, TenantId: {TenantId}", loggedInEmployee.Id, tenantId); + try { + // 1. Validation: Ensure at least one identifier is present if (!id.HasValue && string.IsNullOrWhiteSpace(expenseUId)) { - _logger.LogWarning("Invalid parameters: Both Id and PaymentRequestUID are null or empty."); - return ApiResponse.ErrorResponse("At least one parameter (Id or expenseUId) must be provided.", "Invalid argument.", 400); + _logger.LogWarning("Validation failed: Both ExpenseId and ExpenseUId are null or empty."); + return ApiResponse.ErrorResponse("At least one parameter (Id or expenseUId) must be provided.", "Invalid Argument", 400); } - ExpenseDetailsMongoDB? expenseDetails = null; - if (expenseDetails == null) - { - var expense = await _context.Expenses - .Include(e => e.PaidBy) - .Include(e => e.CreatedBy) - .Include(e => e.ProcessedBy) - .Include(e => e.ApprovedBy) - .Include(e => e.ReviewedBy) - .Include(e => e.PaymentMode) - .Include(e => e.PaymentMode) - .Include(e => e.ExpenseCategory) - .Include(e => e.Status) - .Include(e => e.Currency) - .Include(e => e.PaymentRequest) - .AsNoTracking().FirstOrDefaultAsync(e => (e.Id == id || (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')) == expenseUId) && e.TenantId == tenantId); - if (expense == null) + // 2. Main Data Fetch: Using AsSplitQuery to prevent Cartesian explosion with multiple Includes + // Note: Ensure _context is injected as Scoped. + var expense = await _context.Expenses + .AsNoTracking() // Read-only query optimization + .AsSplitQuery() // CRITICAL: Splits query into multiple SQL statements to improve performance with many JOINs + .Include(e => e.PaidBy).ThenInclude(e => e!.JobRole) + .Include(e => e.CreatedBy).ThenInclude(e => e!.JobRole) + .Include(e => e.ProcessedBy).ThenInclude(e => e!.JobRole) + .Include(e => e.ApprovedBy).ThenInclude(e => e!.JobRole) + .Include(e => e.ReviewedBy).ThenInclude(e => e!.JobRole) + .Include(e => e.PaymentMode) + .Include(e => e.ExpenseCategory) + .Include(e => e.Status).ThenInclude(s => s!.StatusPermissionMappings) + .Include(e => e.Currency) + .Include(e => e.PaymentRequest) + .Include(e => e.Attachments).ThenInclude(ba => ba.Document) + .Include(e => e.ExpensesReimburseMappings) + .ThenInclude(erm => erm.ExpensesReimburse) + .ThenInclude(er => er!.ReimburseBy) + .ThenInclude(e => e!.JobRole) + .Include(e => e.ExpenseLogs) + .ThenInclude(el => el.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .FirstOrDefaultAsync(e => + (e.Id == id || (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')) == expenseUId) + && e.TenantId == tenantId); + + // 3. Not Found Handling + if (expense == null) + { + _logger.LogWarning("Expense not found. Id: {Id}, UId: {UId}, TenantId: {TenantId}", id ?? Guid.Empty, expenseUId ?? "", tenantId); + return ApiResponse.ErrorResponse("Expense not found.", "Resource Not Found", 404); + } + + // 4. Map Entity to ViewModel + var response = _mapper.Map(expense); + + // 5. Fetch Permissions + using var scope = _serviceScopeFactory.CreateScope(); + var _permissionServices = scope.ServiceProvider.GetRequiredService(); + var permissionIds = await _permissionServices.GetPermissionIdsByEmployeeId(loggedInEmployee.Id); + + // 6. Fetch Next Valid Statuses + // Logic extracted to private helper method for cleaner code + var nextStatusList = await GetNextStatusesAsync(expense.StatusId, tenantId); + + // 7. Filter and Sort Statuses based on permissions and business logic ("Reject" priority) + response.NextStatus = ProcessNextStatuses(nextStatusList, expense.CreatedById, loggedInEmployee.Id, permissionIds); + + // 8. Fetch Project Details + // We run these sequentially to avoid DbContext threading issues. + // Given indexed columns, the performance hit is negligible compared to the overhead of creating new threads/contexts. + var projectVm = await GetProjectDetailsAsync(expense.ProjectId, tenantId); + response.Project = projectVm; + + // 9. Generate S3 Pre-signed URLs for attachments + response.Documents = expense.Attachments + .Where(ba => ba.Document != null) + .Select(ba => { - if (id.HasValue) - { - _logger.LogWarning("User attempted to fetch expense details with ID {ExpenseId}, but not found in both database and cache", id); - } - else if (!string.IsNullOrWhiteSpace(expenseUId)) - { - _logger.LogWarning("User attempted to fetch expense details with expenseUId {ExpenseUId}, but not found in both database and cache", expenseUId); - } - return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); - } + var document = ba.Document!; + var result = _mapper.Map(document); - expenseDetails = await GetAllExpnesRelatedTablesForSingle(expense, loggedInEmployee.Id, expense.TenantId); - } - var vm = _mapper.Map(expenseDetails); + result!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); + result!.ThumbPreSignedUrl = string.IsNullOrWhiteSpace(document.ThumbS3Key) ? result!.PreSignedUrl : _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); + return result; + }).ToList(); - var permissionStatusMappingTask = Task.Run(async () => - { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.StatusPermissionMapping - .GroupBy(ps => ps.StatusId) - .Select(g => new - { - StatusId = g.Key, - PermissionIds = g.Select(ps => ps.PermissionId).ToList() - }).ToListAsync(); - }); - var expenseReimburseTask = Task.Run(async () => - { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - return await context.ExpensesReimburseMapping - .Include(er => er.ExpensesReimburse) - .ThenInclude(er => er!.ReimburseBy) - .ThenInclude(e => e!.JobRole) - .Where(er => er.TenantId == tenantId && er.ExpensesId == vm.Id) - .Select(er => er.ExpensesReimburse).FirstOrDefaultAsync(); - }); - var permissionStatusMappings = permissionStatusMappingTask.Result; - var expensesReimburse = expenseReimburseTask.Result; - - if (vm.Status != null && (vm.NextStatus?.Any() ?? false)) - { - vm.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == vm.Status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); - foreach (var status in vm.NextStatus) - { - status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); - } - int index = vm.NextStatus.FindIndex(ns => ns.DisplayName == "Reject"); - if (index > -1) - { - var item = vm.NextStatus[index]; - vm.NextStatus.RemoveAt(index); - vm.NextStatus.Insert(0, item); - } - } - vm.ExpensesReimburse = _mapper.Map(expensesReimburse); - - foreach (var document in expenseDetails.Documents) - { - var response = vm.Documents.FirstOrDefault(d => d.DocumentId == Guid.Parse(document.DocumentId)); - - response!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key); - response!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key); - } - - var expenselogs = await _context.ExpenseLogs.Include(el => el.UpdatedBy).Where(el => el.ExpenseId == vm.Id).Select(el => _mapper.Map(el)).ToListAsync(); - - vm.ExpenseLogs = expenselogs; - - _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); - return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); + _logger.LogInfo("Successfully fetched expense details. ExpenseId: {ExpenseId}", response.Id); + return ApiResponse.SuccessResponse(response, "Successfully fetched the details of expense", 200); } catch (Exception ex) { - _logger.LogError(ex, "An unhandled exception occurred while fetching an expense details {ExpenseId} or {ExpenseUId}.", id ?? Guid.Empty, expenseUId ?? "EX_00000"); - return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); + // Capture specific context in the error log + _logger.LogError(ex, "Unhandled exception in GetExpenseDetailsAsync. Id: {Id}, UId: {UId}", id ?? Guid.Empty, expenseUId ?? ""); + return ApiResponse.ErrorResponse("An internal server error occurred.", ExceptionMapper(ex), 500); } } + + #region Helper Methods (Private) + + /// + /// Fetches the list of possible next statuses based on current status. + /// + private async Task> GetNextStatusesAsync(Guid? currentStatusId, Guid tenantId) + { + if (!currentStatusId.HasValue) return new List(); + + return await _context.ExpensesStatusMapping + .AsNoTracking() + .Include(esm => esm.NextStatus).ThenInclude(s => s!.StatusPermissionMappings) + .Where(esm => esm.StatusId == currentStatusId && esm.Status != null) + .Select(esm => esm.NextStatus!) // Select only the NextStatus entity + .ToListAsync(); + } + + /// + /// Filters statuses by permission and reorders specific actions (e.g., Reject). + /// + private List ProcessNextStatuses(List nextStatuses, Guid createdById, Guid loggedInEmployeeId, List userPermissionIds) + { + if (nextStatuses == null || !nextStatuses.Any()) return new List(); + + // Business Logic: Move "Reject" to the top + var rejectStatus = nextStatuses.FirstOrDefault(ns => ns.DisplayName == "Reject"); + if (rejectStatus != null) + { + nextStatuses.Remove(rejectStatus); + nextStatuses.Insert(0, rejectStatus); + } + + var resultVMs = new List(); + + foreach (var item in nextStatuses) + { + var vm = _mapper.Map(item); + + // Case 1: If Creator is viewing and status is Review (Assuming Review is a constant GUID or Enum) + if (item.Id == Review && createdById == loggedInEmployeeId) + { + resultVMs.Add(vm); + continue; + } + + // Case 2: Standard Permission Check + bool hasPermission = vm.PermissionIds.Any(pid => userPermissionIds.Contains(pid)); + + // Exclude "Done" status (Assuming Done is a constant GUID) + if (hasPermission && item.Id != Done) + { + resultVMs.Add(vm); + } + } + + return resultVMs.Distinct().ToList(); + } + + /// + /// Attempts to fetch project details from Projects table, falling back to ServiceProjects. + /// + private async Task GetProjectDetailsAsync(Guid? projectId, Guid tenantId) + { + if (!projectId.HasValue) return null; + + // Check Infrastructure Projects + var infraProject = await _context.Projects + .AsNoTracking() + .Where(p => p.Id == projectId && p.TenantId == tenantId) + .ProjectTo(_mapper.ConfigurationProvider) // Optimized: Project directly to VM inside SQL + .FirstOrDefaultAsync(); + + if (infraProject != null) return infraProject; + + // Fallback to Service Projects + return await _context.ServiceProjects + .AsNoTracking() + .Where(sp => sp.Id == projectId && sp.TenantId == tenantId) + .ProjectTo(_mapper.ConfigurationProvider) + .FirstOrDefaultAsync(); + } + + #endregion + public async Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId) { try diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index e55adf8..baac924 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -2510,7 +2510,7 @@ namespace Marco.Pms.Services.Service foreach (var status in response) { - status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + status.PermissionIds = permissionStatusMapping.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault() ?? new List(); } _logger.LogInfo("{Count} records of expense status have been fetched successfully by employee {EmployeeId}", response.Count, loggedInEmployee.Id); diff --git a/Marco.Pms.Services/Service/OrganizationService.cs b/Marco.Pms.Services/Service/OrganizationService.cs index e116a4a..2cd135d 100644 --- a/Marco.Pms.Services/Service/OrganizationService.cs +++ b/Marco.Pms.Services/Service/OrganizationService.cs @@ -129,14 +129,17 @@ namespace Marco.Pms.Services.Service // Fetch corresponding employee details in one query var employeeIds = createdByIds.Union(updatedByIds).ToList(); - var employees = await _context.Employees.Where(e => employeeIds.Contains(e.Id)).ToListAsync(); + var employees = await _context.Employees + .Where(e => employeeIds.Contains(e.Id)) + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(); // Map data to view models including created and updated by employees var vm = organizations.Select(o => { var orgVm = _mapper.Map(o); - orgVm.CreatedBy = employees.Where(e => e.Id == o.CreatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); - orgVm.UpdatedBy = employees.Where(e => e.Id == o.UpdatedById).Select(e => _mapper.Map(e)).FirstOrDefault(); + orgVm.CreatedBy = employees.Where(e => e.Id == o.CreatedById).FirstOrDefault(); + orgVm.UpdatedBy = employees.Where(e => e.Id == o.UpdatedById).FirstOrDefault(); return orgVm; }).ToList(); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs index 57ef55a..383c98e 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IExpensesService.cs @@ -1,6 +1,7 @@ using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Employees; using Marco.Pms.Model.Utilities; +using Marco.Pms.Model.ViewModels.Expenses; namespace Marco.Pms.Services.Service.ServiceInterfaces { @@ -9,7 +10,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #region =================================================================== Expenses Functions =================================================================== Task> GetExpensesListAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); Task> GetExpensesListDynamicAsync(Employee loggedInEmployee, Guid tenantId, string? searchString, string? filter, int pageSize, int pageNumber); - Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId); + Task> GetExpenseDetailsAsync(Guid? id, string? expenseUId, Employee loggedInEmployee, Guid tenantId); Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId); Task> GetFilterObjectAsync(Employee loggedInEmployee, Guid tenantId); Task> CreateExpenseAsync(CreateExpensesDto dto, Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From 0395b46610758997b56a5214e233b5838b40e62f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 14:44:39 +0530 Subject: [PATCH 46/58] Updated the expense details API --- Marco.Pms.Model/Expenses/Expenses.cs | 1 - Marco.Pms.Services/Service/ExpensesService.cs | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs index 7a48485..23d3fc9 100644 --- a/Marco.Pms.Model/Expenses/Expenses.cs +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -17,7 +17,6 @@ namespace Marco.Pms.Model.Expenses public ICollection Attachments { get; set; } = new List(); public ICollection ExpensesReimburseMappings { get; set; } = new List(); - public ICollection ExpenseLogs { get; set; } = new List(); public Guid ExpenseCategoryId { get; set; } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 6f76f07..6b72397 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -528,9 +528,6 @@ namespace Marco.Pms.Services.Service .ThenInclude(erm => erm.ExpensesReimburse) .ThenInclude(er => er!.ReimburseBy) .ThenInclude(e => e!.JobRole) - .Include(e => e.ExpenseLogs) - .ThenInclude(el => el.UpdatedBy) - .ThenInclude(e => e!.JobRole) .FirstOrDefaultAsync(e => (e.Id == id || (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')) == expenseUId) && e.TenantId == tenantId); @@ -563,6 +560,15 @@ namespace Marco.Pms.Services.Service var projectVm = await GetProjectDetailsAsync(expense.ProjectId, tenantId); response.Project = projectVm; + response.ExpenseLogs = await _context.ExpenseLogs + .AsNoTracking() // Read-only query optimization + .Include(el => el.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Where(el => el.ExpenseId == expense.Id) + .OrderByDescending(el => el.UpdateAt) + .ProjectTo(_mapper.ConfigurationProvider) // Projection + .ToListAsync(); + // 9. Generate S3 Pre-signed URLs for attachments response.Documents = expense.Attachments .Where(ba => ba.Document != null) -- 2.43.0 From c820b973a852753e3c577d505d5a2a197233c61d Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 16:31:11 +0530 Subject: [PATCH 47/58] Optimize the get list of basic project for both infra and service --- .../Controllers/AttendanceController.cs | 6 +- .../Controllers/DashboardController.cs | 6 +- .../Controllers/DocumentController.cs | 4 +- .../Controllers/EmployeeController.cs | 6 +- .../Controllers/ImageController.cs | 2 +- Marco.Pms.Services/Service/ExpensesService.cs | 163 ++++++++------- .../Service/PermissionServices.cs | 14 +- Marco.Pms.Services/Service/ProjectServices.cs | 187 +++++++++++------- .../ServiceInterfaces/IProjectServices.cs | 2 +- 9 files changed, 219 insertions(+), 171 deletions(-) diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 403dccf..0e9bb66 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -174,7 +174,7 @@ namespace MarcoBMS.Services.Controllers var hasTeamAttendancePermission = await _permission.HasPermission(PermissionsMaster.TeamAttendance, loggedInEmployee.Id); var hasSelfAttendancePermission = await _permission.HasPermission(PermissionsMaster.SelfAttendance, loggedInEmployee.Id); - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasProjectPermission) { @@ -353,7 +353,7 @@ namespace MarcoBMS.Services.Controllers return NotFound(ApiResponse.ErrorResponse("Project not found.")); } - if (!await _permission.HasProjectPermission(loggedInEmployee, projectId)) + if (!await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId)) { _logger.LogWarning("Unauthorized access attempt by EmployeeId: {EmployeeId} for ProjectId: {ProjectId}", loggedInEmployee.Id, projectId); return Unauthorized(ApiResponse.ErrorResponse("You do not have permission to access this project.")); @@ -399,7 +399,7 @@ namespace MarcoBMS.Services.Controllers Employee LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var result = new List(); - var hasProjectPermission = await _permission.HasProjectPermission(LoggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(LoggedInEmployee.Id, projectId); if (!hasProjectPermission) { diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index d7294c6..905059d 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -269,7 +269,7 @@ namespace Marco.Pms.Services.Controllers using var scope = _serviceScopeFactory.CreateScope(); var _permission = scope.ServiceProvider.GetRequiredService(); // Security Check: Ensure the requested project is in the user's accessible list. - var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId.Value); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} on project {ProjectId} (not active or not accessible).", loggedInEmployee.Id, projectId.Value); @@ -358,7 +358,7 @@ namespace Marco.Pms.Services.Controllers var _permission = scope.ServiceProvider.GetRequiredService(); // 2a. Security Check: Verify permission for the specific project. - var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId.Value); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} on project {ProjectId}.", loggedInEmployee.Id, projectId.Value); @@ -689,7 +689,7 @@ namespace Marco.Pms.Services.Controllers using var scope = _serviceScopeFactory.CreateScope(); var _permission = scope.ServiceProvider.GetRequiredService(); - bool hasPermission = await _permission.HasProjectPermission(loggedInEmployee!, projectId); + bool hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("Unauthorized access by EmployeeId: {EmployeeId} to ProjectId: {ProjectId}", loggedInEmployee.Id, projectId); diff --git a/Marco.Pms.Services/Controllers/DocumentController.cs b/Marco.Pms.Services/Controllers/DocumentController.cs index 4fdb588..7ecbc22 100644 --- a/Marco.Pms.Services/Controllers/DocumentController.cs +++ b/Marco.Pms.Services/Controllers/DocumentController.cs @@ -96,7 +96,7 @@ namespace Marco.Pms.Services.Controllers // Project permission check if (ProjectEntity == entityTypeId) { - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, entityId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, entityId); if (!hasProjectPermission) { _logger.LogWarning("Employee {EmployeeId} does not have project access for ProjectId {ProjectId}", loggedInEmployee.Id, entityId); @@ -1085,7 +1085,7 @@ namespace Marco.Pms.Services.Controllers entityExists = await _context.Projects.AnyAsync(p => p.Id == oldAttachment.EntityId && p.TenantId == tenantId); if (entityExists) { - entityExists = await _permission.HasProjectPermission(loggedInEmployee, oldAttachment.EntityId); + entityExists = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, oldAttachment.EntityId); } } else diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 0555529..2496fe7 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -153,7 +153,7 @@ namespace MarcoBMS.Services.Controllers return NotFound(ApiResponse.ErrorResponse("Project not found", "Project not found", 404)); } // Check if the logged-in employee has permission for the requested project - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasProjectPermission) { _logger.LogWarning("User {EmployeeId} attempts to get employees for project {ProjectId} without permission", loggedInEmployee.Id, projectId); @@ -333,7 +333,7 @@ namespace MarcoBMS.Services.Controllers var employeeQuery = _context.Employees.Where(e => e.IsActive); if (projectId != null && projectId != Guid.Empty) { - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId.Value); if (!hasProjectPermission) { _logger.LogWarning("User {EmployeeId} attempts to get employee for project {ProjectId}, but not have access to the project", loggedInEmployee.Id, projectId); @@ -401,7 +401,7 @@ namespace MarcoBMS.Services.Controllers loggedInEmployee.Id, projectId); // Validate project access permission - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId.Value); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId.Value); if (!hasProjectPermission) { _logger.LogWarning("Access denied. EmployeeId: {EmployeeId} does not have permission for ProjectId: {ProjectId}", diff --git a/Marco.Pms.Services/Controllers/ImageController.cs b/Marco.Pms.Services/Controllers/ImageController.cs index 0cb1c95..ec6f5f8 100644 --- a/Marco.Pms.Services/Controllers/ImageController.cs +++ b/Marco.Pms.Services/Controllers/ImageController.cs @@ -63,7 +63,7 @@ namespace Marco.Pms.Services.Controllers } // Step 2: Check project access permission - var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("[GetImageList] Access denied for EmployeeId: {EmployeeId} on ProjectId: {ProjectId}", loggedInEmployee.Id, projectId); diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 6b72397..3f988f8 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -594,90 +594,6 @@ namespace Marco.Pms.Services.Service } } - #region Helper Methods (Private) - - /// - /// Fetches the list of possible next statuses based on current status. - /// - private async Task> GetNextStatusesAsync(Guid? currentStatusId, Guid tenantId) - { - if (!currentStatusId.HasValue) return new List(); - - return await _context.ExpensesStatusMapping - .AsNoTracking() - .Include(esm => esm.NextStatus).ThenInclude(s => s!.StatusPermissionMappings) - .Where(esm => esm.StatusId == currentStatusId && esm.Status != null) - .Select(esm => esm.NextStatus!) // Select only the NextStatus entity - .ToListAsync(); - } - - /// - /// Filters statuses by permission and reorders specific actions (e.g., Reject). - /// - private List ProcessNextStatuses(List nextStatuses, Guid createdById, Guid loggedInEmployeeId, List userPermissionIds) - { - if (nextStatuses == null || !nextStatuses.Any()) return new List(); - - // Business Logic: Move "Reject" to the top - var rejectStatus = nextStatuses.FirstOrDefault(ns => ns.DisplayName == "Reject"); - if (rejectStatus != null) - { - nextStatuses.Remove(rejectStatus); - nextStatuses.Insert(0, rejectStatus); - } - - var resultVMs = new List(); - - foreach (var item in nextStatuses) - { - var vm = _mapper.Map(item); - - // Case 1: If Creator is viewing and status is Review (Assuming Review is a constant GUID or Enum) - if (item.Id == Review && createdById == loggedInEmployeeId) - { - resultVMs.Add(vm); - continue; - } - - // Case 2: Standard Permission Check - bool hasPermission = vm.PermissionIds.Any(pid => userPermissionIds.Contains(pid)); - - // Exclude "Done" status (Assuming Done is a constant GUID) - if (hasPermission && item.Id != Done) - { - resultVMs.Add(vm); - } - } - - return resultVMs.Distinct().ToList(); - } - - /// - /// Attempts to fetch project details from Projects table, falling back to ServiceProjects. - /// - private async Task GetProjectDetailsAsync(Guid? projectId, Guid tenantId) - { - if (!projectId.HasValue) return null; - - // Check Infrastructure Projects - var infraProject = await _context.Projects - .AsNoTracking() - .Where(p => p.Id == projectId && p.TenantId == tenantId) - .ProjectTo(_mapper.ConfigurationProvider) // Optimized: Project directly to VM inside SQL - .FirstOrDefaultAsync(); - - if (infraProject != null) return infraProject; - - // Fallback to Service Projects - return await _context.ServiceProjects - .AsNoTracking() - .Where(sp => sp.Id == projectId && sp.TenantId == tenantId) - .ProjectTo(_mapper.ConfigurationProvider) - .FirstOrDefaultAsync(); - } - - #endregion - public async Task> GetSupplerNameListAsync(Employee loggedInEmployee, Guid tenantId) { try @@ -4367,6 +4283,85 @@ namespace Marco.Pms.Services.Service return CreateExpenseAttachmentEntities(batchId, expense.Id, employeeId, tenantId, objectKey, attachment); } + /// + /// Fetches the list of possible next statuses based on current status. + /// + private async Task> GetNextStatusesAsync(Guid? currentStatusId, Guid tenantId) + { + if (!currentStatusId.HasValue) return new List(); + + return await _context.ExpensesStatusMapping + .AsNoTracking() + .Include(esm => esm.NextStatus).ThenInclude(s => s!.StatusPermissionMappings) + .Where(esm => esm.StatusId == currentStatusId && esm.Status != null) + .Select(esm => esm.NextStatus!) // Select only the NextStatus entity + .ToListAsync(); + } + + /// + /// Filters statuses by permission and reorders specific actions (e.g., Reject). + /// + private List ProcessNextStatuses(List nextStatuses, Guid createdById, Guid loggedInEmployeeId, List userPermissionIds) + { + if (nextStatuses == null || !nextStatuses.Any()) return new List(); + + // Business Logic: Move "Reject" to the top + var rejectStatus = nextStatuses.FirstOrDefault(ns => ns.DisplayName == "Reject"); + if (rejectStatus != null) + { + nextStatuses.Remove(rejectStatus); + nextStatuses.Insert(0, rejectStatus); + } + + var resultVMs = new List(); + + foreach (var item in nextStatuses) + { + var vm = _mapper.Map(item); + + // Case 1: If Creator is viewing and status is Review (Assuming Review is a constant GUID or Enum) + if (item.Id == Review && createdById == loggedInEmployeeId) + { + resultVMs.Add(vm); + continue; + } + + // Case 2: Standard Permission Check + bool hasPermission = vm.PermissionIds.Any(pid => userPermissionIds.Contains(pid)); + + // Exclude "Done" status (Assuming Done is a constant GUID) + if (hasPermission && item.Id != Done) + { + resultVMs.Add(vm); + } + } + + return resultVMs.Distinct().ToList(); + } + + /// + /// Attempts to fetch project details from Projects table, falling back to ServiceProjects. + /// + private async Task GetProjectDetailsAsync(Guid? projectId, Guid tenantId) + { + if (!projectId.HasValue) return null; + + // Check Infrastructure Projects + var infraProject = await _context.Projects + .AsNoTracking() + .Where(p => p.Id == projectId && p.TenantId == tenantId) + .ProjectTo(_mapper.ConfigurationProvider) // Optimized: Project directly to VM inside SQL + .FirstOrDefaultAsync(); + + if (infraProject != null) return infraProject; + + // Fallback to Service Projects + return await _context.ServiceProjects + .AsNoTracking() + .Where(sp => sp.Id == projectId && sp.TenantId == tenantId) + .ProjectTo(_mapper.ConfigurationProvider) + .FirstOrDefaultAsync(); + } /// /// A private static helper method to create Document and BillAttachment entities. diff --git a/Marco.Pms.Services/Service/PermissionServices.cs b/Marco.Pms.Services/Service/PermissionServices.cs index cbe5dd2..ca58119 100644 --- a/Marco.Pms.Services/Service/PermissionServices.cs +++ b/Marco.Pms.Services/Service/PermissionServices.cs @@ -1,5 +1,4 @@ using Marco.Pms.DataAccess.Data; -using Marco.Pms.Model.Employees; using Marco.Pms.Model.Entitlements; using Marco.Pms.Services.Helpers; using MarcoBMS.Services.Helpers; @@ -50,29 +49,28 @@ namespace Marco.Pms.Services.Service var hasPermission = toCheckPermissionIds.Any(f => realPermissionIds.Contains(f)); return hasPermission; } - public async Task HasProjectPermission(Employee LoggedInEmployee, Guid projectId) + public async Task HasInfraProjectPermission(Guid loggedInEmployeeId, Guid projectId) { - var employeeId = LoggedInEmployee.Id; - var projectIds = await _cache.GetProjects(employeeId, tenantId); + var projectIds = await _cache.GetProjects(loggedInEmployeeId, tenantId); if (projectIds == null) { - var hasPermission = await HasPermission(PermissionsMaster.ManageProject, employeeId); + var hasPermission = await HasPermission(PermissionsMaster.ManageProject, loggedInEmployeeId); if (hasPermission) { - var projects = await _context.Projects.AsNoTracking().Where(c => c.TenantId == LoggedInEmployee.TenantId).ToListAsync(); + var projects = await _context.Projects.AsNoTracking().Where(c => c.TenantId == tenantId).ToListAsync(); projectIds = projects.Select(p => p.Id).ToList(); } else { - var allocation = await _context.ProjectAllocations.AsNoTracking().Where(c => c.EmployeeId == employeeId && c.IsActive).ToListAsync(); + var allocation = await _context.ProjectAllocations.AsNoTracking().Where(c => c.EmployeeId == loggedInEmployeeId && c.IsActive).ToListAsync(); if (!allocation.Any()) { return false; } projectIds = allocation.Select(c => c.ProjectId).Distinct().ToList(); } - await _cache.AddProjects(LoggedInEmployee.Id, projectIds, tenantId); + await _cache.AddProjects(loggedInEmployeeId, projectIds, tenantId); } return projectIds.Contains(projectId); } diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index e9cb9d7..c2bd405 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -54,89 +54,144 @@ namespace Marco.Pms.Services.Service #region =================================================================== Project Get APIs ===================================================================\ - /// - /// Retrieves a combined list of basic infrastructure and active service projects accessible by the logged-in employee within a tenant. - /// - /// Optional search term to filter projects by name (if implemented). - /// Authenticated employee requesting the data. - /// Tenant identifier to ensure multi-tenant data isolation. - /// Returns an ApiResponse containing the distinct combined list of basic project view models or an error response. - public async Task> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId) + public async Task>> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId) { + // 1. Validation and Context Checks if (tenantId == Guid.Empty) { - _logger.LogWarning("GetBothProjectBasicListAsync called with invalid tenant context by EmployeeId {EmployeeId}", loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Access Denied", "Invalid tenant context.", 403); + _logger.LogWarning("Security Alert: GetBothProjectBasicListAsync called with empty TenantId by Employee: {EmployeeId}", loggedInEmployee.Id); + return ApiResponse>.ErrorResponse("Access Denied", "Invalid tenant context provided.", 403); } try { - // Retrieve list of project IDs accessible by the employee for tenant isolation and security - var accessibleProjectIds = await GetMyProjects(loggedInEmployee, tenantId); + _logger.LogInfo("Initiating project fetch for Tenant: {TenantId}, User: {UserId}. Search: {Search}", tenantId, loggedInEmployee.Id, searchString ?? "None"); - // Fetch infrastructure projects concurrently filtered by accessible IDs and tenant - var infraProjectTask = Task.Run(async () => + // 2. Check Permissions (Global check, do not block parallel tasks if possible, but needed for logic) + // usage of scoped service for permission check + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + bool hasManagePermission = await permissionService.HasPermission(PermissionsMaster.ManageProject, loggedInEmployee.Id); + + // 3. Define Parallel Tasks + // We use DbContextFactory to create short-lived contexts for safe parallel execution. + + // --- TASK A: Infrastructure Projects --- + var infraTask = Task.Run(async () => { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - var infraProjectsQuery = context.Projects - .Where(p => accessibleProjectIds.Contains(p.Id) && p.TenantId == tenantId); + using var context = await _dbContextFactory.CreateDbContextAsync(); + + // Base Query + var query = context.Projects.AsNoTracking() + .Where(p => p.TenantId == tenantId); + + // Apply Filters + if (id.HasValue) + { + query = query.Where(p => p.Id == id.Value); + } if (!string.IsNullOrWhiteSpace(searchString)) { - var normalized = searchString.Trim().ToLowerInvariant(); - infraProjectsQuery = infraProjectsQuery - .Where(p => p.Name.ToLower().Contains(normalized) || - (!string.IsNullOrWhiteSpace(p.ShortName) && p.ShortName.ToLower().Contains(normalized))); - } - if (id.HasValue) - { - infraProjectsQuery = infraProjectsQuery.Where(p => p.Id == id.Value); + // Normalize search term. NOTE: Check if your DB Collation is already Case Insensitive (CI). + // If DB is CI, you don't need ToLower(). Assuming standard needed: + string normalized = searchString.Trim(); + query = query.Where(p => p.Name.Contains(normalized) || + (p.ShortName != null && p.ShortName.Contains(normalized))); } - var infraProjects = await infraProjectsQuery.ToListAsync(); - return infraProjects.Select(p => _mapper.Map(p)).ToList(); + // Apply Security (Row Level Access) + if (!hasManagePermission) + { + // Optimization: Use Any() to create an EXISTS clause in SQL rather than fetching IDs to memory + query = query.Where(p => context.ProjectAllocations.Any(pa => + pa.ProjectId == p.Id && + pa.EmployeeId == loggedInEmployee.Id && + pa.IsActive && + pa.TenantId == tenantId)); + } + + // Projection: Select only what is needed before hitting DB + return await query + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(); }); - // Fetch active service projects concurrently with tenant isolation - var serviceProjectTask = Task.Run(async () => + + // --- TASK B: Service Projects --- + var serviceTask = Task.Run(async () => { - await using var context = await _dbContextFactory.CreateDbContextAsync(); - var serviceProjectsQuery = context.ServiceProjects + using var context = await _dbContextFactory.CreateDbContextAsync(); + + var query = context.ServiceProjects.AsNoTracking() .Where(sp => sp.TenantId == tenantId && sp.IsActive); - if (!string.IsNullOrWhiteSpace(searchString)) - { - var normalized = searchString.Trim().ToLowerInvariant(); - serviceProjectsQuery = serviceProjectsQuery - .Where(sp => sp.Name.ToLower().Contains(normalized) || - (!string.IsNullOrWhiteSpace(sp.ShortName) && sp.ShortName.ToLower().Contains(normalized))); - } - if (id.HasValue) { - serviceProjectsQuery = serviceProjectsQuery.Where(sp => sp.Id == id.Value); + query = query.Where(sp => sp.Id == id.Value); } - var serviceProjects = await serviceProjectsQuery.ToListAsync(); - return serviceProjects.Select(sp => _mapper.Map(sp)).ToList(); + if (!string.IsNullOrWhiteSpace(searchString)) + { + string normalized = searchString.Trim(); + query = query.Where(sp => sp.Name.Contains(normalized) || + (sp.ShortName != null && sp.ShortName.Contains(normalized))); + } + + if (!hasManagePermission) + { + // Optimization: Complex security filter pushed to DB + // User has access if: Allocated directly OR Mapped via JobTicket + query = query.Where(sp => + // Condition 1: Direct Allocation + context.ServiceProjectAllocations.Any(spa => + spa.ProjectId == sp.Id && + spa.EmployeeId == loggedInEmployee.Id && + spa.TenantId == tenantId && + spa.IsActive) + || + // Condition 2: Job Ticket Mapping + context.JobEmployeeMappings.Any(jem => + jem.JobTicket != null && + jem.JobTicket.ProjectId == sp.Id && + jem.AssigneeId == loggedInEmployee.Id && + jem.TenantId == tenantId) + ); + } + + return await query + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(); }); - // Wait for both concurrent tasks to complete - await Task.WhenAll(infraProjectTask, serviceProjectTask); + // 4. Await Completion + await Task.WhenAll(infraTask, serviceTask); - // Combine, remove duplicates, and prepare response list - var combinedProjects = infraProjectTask.Result.Concat(serviceProjectTask.Result).OrderBy(p => p.Name).Distinct().ToList(); + // 5. Aggregate Results + // DistinctBy is available in .NET 6+. If older, use GroupBy or distinct comparer. + var infraResults = await infraTask; + var serviceResults = await serviceTask; - _logger.LogInfo("GetBothProjectBasicListAsync returning {Count} projects for tenant {TenantId} by EmployeeId {EmployeeId}", - combinedProjects.Count, tenantId, loggedInEmployee.Id); + var combinedProjects = infraResults + .Concat(serviceResults) + .DistinctBy(p => p.Id) // Ensure no duplicate IDs if cross-contamination exists + .OrderBy(p => p.Name) + .ToList(); - return ApiResponse.SuccessResponse(combinedProjects, "Service and infrastructure projects fetched successfully.", 200); + _logger.LogInfo("Successfully fetched {Count} projects ({InfraCount} Infra, {ServiceCount} Service) for User {UserId}.", + combinedProjects.Count, infraResults.Count, serviceResults.Count, loggedInEmployee.Id); + + return ApiResponse>.SuccessResponse(combinedProjects, "Projects retrieved successfully.", 200); + } + catch (OperationCanceledException) + { + _logger.LogWarning("Project fetch operation was canceled by the client."); + return ApiResponse>.ErrorResponse("Request Canceled", "The operation was canceled.", 499); } catch (Exception ex) { - _logger.LogError(ex, "Unexpected error in GetBothProjectBasicListAsync for tenant {TenantId} by EmployeeId {EmployeeId}", - tenantId, loggedInEmployee.Id); - return ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while fetching projects.", 500); + _logger.LogError(ex, "CRITICAL: Failed to fetch projects for Tenant {TenantId}. Error: {Message}", tenantId, ex.Message); + return ApiResponse>.ErrorResponse("Internal Server Error", "An unexpected error occurred while processing your request.", 500); } } public async Task> GetAllProjectsBasicAsync(bool provideAll, Employee loggedInEmployee, Guid tenantId) @@ -278,7 +333,7 @@ namespace Marco.Pms.Services.Service var _permission = scope.ServiceProvider.GetRequiredService(); // --- Step 1: Run independent operations in PARALLEL --- // We can check permissions and fetch data at the same time to reduce latency. - var permissionTask = _permission.HasProjectPermission(loggedInEmployee, id); + var permissionTask = _permission.HasInfraProjectPermission(loggedInEmployee.Id, id); // This helper method encapsulates the "cache-first, then database" logic. var projectDataTask = GetProjectDataAsync(id, tenantId); @@ -333,7 +388,7 @@ namespace Marco.Pms.Services.Service } // Step 2: Check permission for this specific project - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, id); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, id); if (!hasProjectPermission) { _logger.LogWarning("Project-specific access denied. EmployeeId: {EmployeeId}, ProjectId: {ProjectId}", loggedInEmployee.Id, id); @@ -649,7 +704,7 @@ namespace Marco.Pms.Services.Service } // 1c. Security Check - var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, id); + var hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, id); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} attempting to update project {ProjectId}.", loggedInEmployee.Id, id); @@ -743,7 +798,7 @@ namespace Marco.Pms.Services.Service // --- CRITICAL: Security Check --- // Before fetching data, you MUST verify the user has permission to see it. // This is a placeholder for your actual permission logic. - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); var hasAllEmployeePermission = await _permission.HasPermission(PermissionsMaster.ViewAllEmployees, loggedInEmployee.Id); var hasviewTeamPermission = await _permission.HasPermission(PermissionsMaster.ViewTeamMembers, loggedInEmployee.Id, projectId); @@ -824,7 +879,7 @@ namespace Marco.Pms.Services.Service // --- Step 2: Security and Existence Checks --- // Before fetching data, you MUST verify the user has permission to see it. // This is a placeholder for your actual permission logic. - var hasPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} on project {ProjectId}.", loggedInEmployee.Id, projectId); @@ -1333,7 +1388,7 @@ namespace Marco.Pms.Services.Service } // Check if the logged-in employee has permission for the requested project - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasProjectPermission) { _logger.LogWarning("User {EmployeeId} attempts to get employees for project {ProjectId} without permission", loggedInEmployee.Id, projectId); @@ -1416,7 +1471,7 @@ namespace Marco.Pms.Services.Service } // Check permission to view project team - var hasProjectPermission = await _permission.HasProjectPermission(loggedInEmployee, projectId); + var hasProjectPermission = await _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasProjectPermission) { _logger.LogWarning("Access denied: User {EmployeeId} tried to get team for Project {ProjectId}", loggedInEmployee.Id, projectId); @@ -1507,7 +1562,7 @@ namespace Marco.Pms.Services.Service { var _permission = scope.ServiceProvider.GetRequiredService(); // --- Step 1: Run independent permission checks in PARALLEL --- - var projectPermissionTask = _permission.HasProjectPermission(loggedInEmployee, projectId); + var projectPermissionTask = _permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); var viewInfraPermissionTask = Task.Run(async () => { using var newScope = _serviceScopeFactory.CreateScope(); @@ -1658,7 +1713,7 @@ namespace Marco.Pms.Services.Service { using var taskScope = _serviceScopeFactory.CreateScope(); var permission = taskScope.ServiceProvider.GetRequiredService(); - return await permission.HasProjectPermission(loggedInEmployee, projectId); + return await permission.HasInfraProjectPermission(loggedInEmployee.Id, projectId); }); var hasGenericViewInfraPermissionTask = Task.Run(async () => { @@ -2511,7 +2566,7 @@ namespace Marco.Pms.Services.Service } // Verify logged-in employee has permission on the project - var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, projectId); + var hasPermission = await permissionService.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} attempting to access project {ProjectId}.", loggedInEmployee.Id, projectId); @@ -2601,7 +2656,7 @@ namespace Marco.Pms.Services.Service } // Validate permission for logged-in employee to assign services to project - var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, model.ProjectId); + var hasPermission = await permissionService.HasInfraProjectPermission(loggedInEmployee.Id, model.ProjectId); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} attempting to assign services to project {ProjectId}.", loggedInEmployee.Id, model.ProjectId); @@ -2703,7 +2758,7 @@ namespace Marco.Pms.Services.Service } // Verify permission to update project - var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, model.ProjectId); + var hasPermission = await permissionService.HasInfraProjectPermission(loggedInEmployee.Id, model.ProjectId); if (!hasPermission) { _logger.LogWarning("Access DENIED for user {UserId} trying to deassign services from project {ProjectId}.", loggedInEmployee.Id, model.ProjectId); @@ -2801,7 +2856,7 @@ namespace Marco.Pms.Services.Service } // Check if the logged in employee has permission to access the project - var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, projectId); + var hasPermission = await permissionService.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("Access denied for user {UserId} on project {ProjectId}", loggedInEmployee.Id, projectId); @@ -2970,7 +3025,7 @@ namespace Marco.Pms.Services.Service } // Check if the logged in employee has permission to access the project - var hasPermission = await permissionService.HasProjectPermission(loggedInEmployee, projectId); + var hasPermission = await permissionService.HasInfraProjectPermission(loggedInEmployee.Id, projectId); if (!hasPermission) { _logger.LogWarning("Access denied for user {UserId} on project {ProjectId}", loggedInEmployee.Id, projectId); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs index 2042987..8520d66 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs @@ -10,7 +10,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces { public interface IProjectServices { - Task> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId); + Task>> GetBothProjectBasicListAsync(Guid? id, string? searchString, Employee loggedInEmployee, Guid tenantId); Task> GetAllProjectsBasicAsync(bool provideAll, Employee loggedInEmployee, Guid tenantId); Task> GetAllProjectsAsync(string? searchString, int pageNumber, int pageSize, Employee loggedInEmployee, Guid tenantId); Task> GetProjectAsync(Guid id, Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From 7459876a20d42e64a923d1a957a8f5f75d4f1cde Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 17:17:59 +0530 Subject: [PATCH 48/58] Added an Helper Function to get list all project Ids --- Marco.Pms.Services/Service/ProjectServices.cs | 202 ++++++++++++++++++ .../ServiceInterfaces/IProjectServices.cs | 1 + 2 files changed, 203 insertions(+) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index c2bd405..a9cca93 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -3630,6 +3630,208 @@ namespace Marco.Pms.Services.Service return featurePermissionIds; } + public async Task> GetBothProjectIds(Guid loggedInEmployeeId, Guid tenantId) + { + if (tenantId == Guid.Empty) + { + _logger.LogWarning("Security Alert: GetBothProjectBasicListAsync called with empty TenantId by Employee: {EmployeeId}", loggedInEmployeeId); + return new List(); + } + + try + { + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + bool hasManagePermission = await permissionService.HasPermission(PermissionsMaster.ManageProject, loggedInEmployeeId); + + var infraTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + + if (hasManagePermission) + { + return await context.Projects.AsNoTracking() + .Where(p => p.TenantId == tenantId) + .Select(p => p.Id) + .ToListAsync(); + } + else + { + return await context.ProjectAllocations.AsNoTracking() + .Where(pa => pa.TenantId == tenantId && pa.EmployeeId == loggedInEmployeeId && pa.IsActive) + .Select(pa => pa.ProjectId) + .ToListAsync(); + } + + + }); + + var serviceTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + + if (hasManagePermission) + { + return await context.ServiceProjects.AsNoTracking() + .Where(sp => sp.TenantId == tenantId && sp.IsActive) + .Select(sp => sp.Id) + .ToListAsync(); + } + else + { + var serviceProjectIds = await context.ServiceProjectAllocations.AsNoTracking() + .Where(spa => spa.TenantId == tenantId && spa.EmployeeId == loggedInEmployeeId && spa.IsActive) + .Select(spa => spa.ProjectId) + .ToListAsync(); + + var jobServiceProjectIds = await context.JobEmployeeMappings.AsNoTracking() + .Include(jem => jem.JobTicket) + .Where(jem => jem.TenantId == tenantId && jem.JobTicket != null && jem.JobTicket.IsActive && !jem.JobTicket.IsArchive && jem.AssigneeId == loggedInEmployeeId) + .Select(jem => jem.JobTicket!.ProjectId) + .ToListAsync(); + serviceProjectIds.Concat(jobServiceProjectIds).Distinct().ToList(); + return serviceProjectIds; + } + }); + + + await Task.WhenAll(infraTask, serviceTask); + + + var infraResults = await infraTask; + var serviceResults = await serviceTask; + + var combinedProjects = infraResults + .Concat(serviceResults) + .Distinct() + .ToList(); + + _logger.LogInfo("Successfully fetched {Count} projects ({InfraCount} Infra, {ServiceCount} Service) for User {UserId}.", + combinedProjects.Count, infraResults.Count, serviceResults.Count, loggedInEmployeeId); + + return combinedProjects; + } + catch (OperationCanceledException) + { + _logger.LogWarning("Project fetch operation was canceled by the client."); + return new List(); + } + catch (Exception ex) + { + _logger.LogError(ex, "CRITICAL: Failed to fetch projects for Tenant {TenantId}. Error: {Message}", tenantId, ex.Message); + return new List(); + } + } + + public async Task> GetBothProjectIdsAsync(Guid loggedInEmployeeId, Guid tenantId) + { + // 1. Guard Clause: Fast exit for invalid inputs + if (tenantId == Guid.Empty) + { + _logger.LogWarning("Security Alert: GetBothProjectIdsAsync invoked with empty TenantId. User: {EmployeeId}", loggedInEmployeeId); + return new List(); + } + + try + { + _logger.LogInfo("Starting parallel fetch of Project IDs for Tenant: {TenantId}, User: {UserId}", tenantId, loggedInEmployeeId); + + // 2. Permission Check (Scoped) + using var scope = _serviceScopeFactory.CreateScope(); + var permissionService = scope.ServiceProvider.GetRequiredService(); + bool hasManagePermission = await permissionService.HasPermission(PermissionsMaster.ManageProject, loggedInEmployeeId); + + // 3. Parallel Execution: Infrastructure Projects + var infraTask = Task.Run(async () => + { + // Create isolated context for thread safety + using var context = await _dbContextFactory.CreateDbContextAsync(); + + if (hasManagePermission) + { + // Admin: Fetch all IDs for tenant + return await context.Projects.AsNoTracking() + .Where(p => p.TenantId == tenantId) + .Select(p => p.Id) + .ToListAsync(); + } + else + { + // User: Fetch only allocated IDs + return await context.ProjectAllocations.AsNoTracking() + .Where(pa => pa.TenantId == tenantId && pa.EmployeeId == loggedInEmployeeId && pa.IsActive) + .Select(pa => pa.ProjectId) + .ToListAsync(); + } + }); + + // 4. Parallel Execution: Service Projects + var serviceTask = Task.Run(async () => + { + using var context = await _dbContextFactory.CreateDbContextAsync(); + + if (hasManagePermission) + { + // Admin: Fetch all active Service Projects + return await context.ServiceProjects.AsNoTracking() + .Where(sp => sp.TenantId == tenantId && sp.IsActive) + .Select(sp => sp.Id) + .ToListAsync(); + } + else + { + // User: Complex Logic (Direct Allocation OR Job Ticket Mapping) + + // Query A: Direct Allocations + var directAllocationsQuery = context.ServiceProjectAllocations.AsNoTracking() + .Where(spa => spa.TenantId == tenantId && spa.EmployeeId == loggedInEmployeeId && spa.IsActive) + .Select(spa => spa.ProjectId); + + // Query B: Via Job Tickets + // Note: Removed .Include(); EF Core automatically joins when we access jem.JobTicket.ProjectId + var jobMappingsQuery = context.JobEmployeeMappings.AsNoTracking() + .Where(jem => jem.TenantId == tenantId + && jem.AssigneeId == loggedInEmployeeId + && jem.JobTicket != null + && jem.JobTicket.IsActive + && !jem.JobTicket.IsArchive) + .Select(jem => jem.JobTicket!.ProjectId); + + // OPTIMIZATION: Use LINQ Union to combine queries into ONE SQL statement. + // This performs the DISTINCT operation in the database, not in memory. + return await directAllocationsQuery + .Union(jobMappingsQuery) + .ToListAsync(); + } + }); + + // 5. Await both tasks + await Task.WhenAll(infraTask, serviceTask); + + // 6. Merge Results + // Distinct() ensures that if a Project ID exists in both Infra and Service (rare, but possible by ID collision or bad data), we don't duplicate. + var combinedIds = (await infraTask) + .Concat(await serviceTask) + .Distinct() + .ToList(); + + _logger.LogInfo("Completed Project ID fetch. Total: {Count} (Infra: {InfraCount}, Service: {ServiceCount}) for User {UserId}", + combinedIds.Count, infraTask.Result.Count, serviceTask.Result.Count, loggedInEmployeeId); + + return combinedIds; + } + catch (OperationCanceledException) + { + _logger.LogWarning("GetBothProjectIdsAsync operation canceled by client request."); + return new List(); + } + catch (Exception ex) + { + _logger.LogError(ex, "CRITICAL failure in GetBothProjectIdsAsync for Tenant {TenantId}. Message: {Message}", tenantId, ex.Message); + return new List(); + } + } + #endregion } } diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs index 8520d66..244d95f 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IProjectServices.cs @@ -51,6 +51,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetAssignedOrganizationsToProjectAsync(Guid projectId, Employee loggedInEmployee, Guid tenantId); Task> GetAssignedOrganizationsToProjectForDropdownAsync(Guid projectId, Employee loggedInEmployee, Guid tenantId); + Task> GetBothProjectIdsAsync(Guid loggedInEmployeeId, Guid tenantId); } } -- 2.43.0 From 4853613efd598ae150acba0bc189628373f8d2d9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 18:59:07 +0530 Subject: [PATCH 49/58] Checking the if employee is actively assigned to the project when getting list of emplyees when assigning task --- Marco.Pms.Services/Service/ProjectServices.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index a9cca93..48e2cc1 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -1434,8 +1434,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(result, "Employee list fetched successfully", 200); } - public async Task> GetProjectTeamByServiceAndOrganizationAsync( - Guid projectId, Guid? serviceId, Guid? organizationId, Employee loggedInEmployee, Guid tenantId) + public async Task> GetProjectTeamByServiceAndOrganizationAsync(Guid projectId, Guid? serviceId, Guid? organizationId, Employee loggedInEmployee, Guid tenantId) { _logger.LogDebug("Started fetching project team. ProjectId: {ProjectId}, ServiceId: {ServiceId}, OrganizationId: {OrganizationId}, TenantId: {TenantId}, EmployeeId: {EmployeeId}", projectId, serviceId ?? Guid.Empty, organizationId ?? Guid.Empty, tenantId, loggedInEmployee.Id); @@ -1513,7 +1512,8 @@ namespace Marco.Pms.Services.Service .ThenInclude(e => e!.JobRole) .Where(pa => pa.ProjectId == projectId && pa.Employee != null - && organizationIds.Contains(pa.Employee.OrganizationId)); + && organizationIds.Contains(pa.Employee.OrganizationId) + && pa.IsActive); if (serviceId.HasValue) { @@ -1530,6 +1530,8 @@ namespace Marco.Pms.Services.Service var employeeList = projectAllocations .Select(pa => _mapper.Map(pa.Employee)) .Distinct() + .OrderBy(e => e.FirstName) + .ThenBy(e => e.LastName) .ToList(); _logger.LogInfo("Fetched {EmployeeCount} employees for Project {ProjectId}.", employeeList.Count, projectId); -- 2.43.0 From 5387e009cbd373aad12fd2e1c068d3805406babe Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 9 Dec 2025 19:13:08 +0530 Subject: [PATCH 50/58] sorted the service , activity group and activity by names --- .../Controllers/MasterController.cs | 4 ++-- Marco.Pms.Services/Service/MasterService.cs | 17 ++++++++++++----- .../Service/ServiceInterfaces/IMasterService.cs | 4 +++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 4a7b142..0169651 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -257,10 +257,10 @@ namespace Marco.Pms.Services.Controllers [HttpGet] [Route("activities")] - public async Task GetActivitiesMaster([FromQuery] Guid? activityGroupId) + public async Task GetActivitiesMaster([FromQuery] Guid? activityGroupId, [FromQuery] string? searchString) { var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); - var response = await _masterService.GetActivitiesMasterAsync(activityGroupId, loggedInEmployee, tenantId); + var response = await _masterService.GetActivitiesMasterAsync(activityGroupId, searchString, loggedInEmployee, tenantId); return StatusCode(response.StatusCode, response); } diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index baac924..763c282 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -521,6 +521,7 @@ namespace Marco.Pms.Services.Service var services = await _context.ServiceMasters .Where(s => s.TenantId == tenantId && s.IsActive) .Select(s => _mapper.Map(s)) + .OrderBy(s => s.Name) .ToListAsync(); _logger.LogInfo("Fetched {Count} service records for tenantId: {TenantId}", services.Count, tenantId); @@ -628,11 +629,11 @@ namespace Marco.Pms.Services.Service IsSystem = a.IsSystem, CheckLists = _mapper.Map>(checklistForActivity) }; - }).ToList() - }).ToList() + }).OrderBy(a => a.ActivityName).ToList() + }).OrderBy(ag => ag.Name).ToList() }; return response; - }).ToList(); + }).OrderBy(s => s.Name).ToList(); _logger.LogInfo("Successfully processed and mapped {ServiceCount} services for TenantId: {TenantId}", Vm.Count, tenantId); @@ -836,6 +837,7 @@ namespace Marco.Pms.Services.Service var activityGroups = await activityGroupQuery .Select(ag => _mapper.Map(ag)) + .OrderBy(ag => ag.Name) .ToListAsync(); _logger.LogInfo("{Count} activity group(s) fetched for tenantId: {TenantId}", activityGroups.Count, tenantId); @@ -1032,7 +1034,7 @@ namespace Marco.Pms.Services.Service #endregion #region =================================================================== Activity APIs =================================================================== - public async Task> GetActivitiesMasterAsync(Guid? activityGroupId, Employee loggedInEmployee, Guid tenantId) + public async Task> GetActivitiesMasterAsync(Guid? activityGroupId, string? searchString, Employee loggedInEmployee, Guid tenantId) { _logger.LogInfo("GetActivitiesMaster called"); @@ -1050,6 +1052,11 @@ namespace Marco.Pms.Services.Service activityQuery = activityQuery.Where(a => a.ActivityGroupId == activityGroupId); } + if (!string.IsNullOrWhiteSpace(searchString)) + { + activityQuery = activityQuery.Where(a => a.ActivityName.Contains(searchString)); + } + var activities = await activityQuery .ToListAsync(); @@ -1081,7 +1088,7 @@ namespace Marco.Pms.Services.Service response.CheckLists = _mapper.Map>(checklistForActivity); return response; - }).ToList(); + }).OrderBy(a => a.ActivityName).ToList(); _logger.LogInfo("{Count} activity records fetched successfully for tenantId: {TenantId}", activityVMs.Count, tenantId); diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 889c8fb..30e4b9e 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -26,10 +26,12 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces Task> GetPurchaseInvoiceStatusAsync(Employee loggedInEmployee, CancellationToken cancellationToken); #endregion + #region =================================================================== Invoice Attachment Type APIs =================================================================== Task> GetInvoiceAttachmentTypeAsync(Employee loggedInEmployee, CancellationToken cancellationToken); #endregion + #region =================================================================== Currency APIs =================================================================== Task> GetCurrencyAsync(Employee loggedInEmployee, Guid tenantId); @@ -58,7 +60,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Activity APIs =================================================================== - Task> GetActivitiesMasterAsync(Guid? activityGroupId, Employee loggedInEmployee, Guid tenantId); + Task> GetActivitiesMasterAsync(Guid? activityGroupId, string? searchString, Employee loggedInEmployee, Guid tenantId); Task> CreateActivityAsync(CreateActivityMasterDto createActivity, Employee loggedInEmployee, Guid tenantId); Task> UpdateActivityAsync(Guid id, CreateActivityMasterDto createActivity, Employee loggedInEmployee, Guid tenantId); Task> DeleteActivityAsync(Guid id, bool isActive, Employee loggedInEmployee, Guid tenantId); -- 2.43.0 From 9c5df63134fad44bebd951a5a4b15a5935ffd8eb Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 10 Dec 2025 10:42:05 +0530 Subject: [PATCH 51/58] Added an API to get the attendance overview project-wise --- .../DashBoard/ProjectAttendanceOverviewVM.cs | 10 ++ .../Controllers/DashboardController.cs | 117 ++++++++++++++++++ Marco.Pms.Services/Service/ExpensesService.cs | 5 + Marco.Pms.Services/Service/ProjectServices.cs | 6 +- 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceOverviewVM.cs diff --git a/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceOverviewVM.cs b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceOverviewVM.cs new file mode 100644 index 0000000..3a9d65a --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceOverviewVM.cs @@ -0,0 +1,10 @@ +namespace Marco.Pms.Model.ViewModels.DashBoard +{ + public class ProjectAttendanceOverviewVM + { + public Guid ProjectId { get; set; } + public string? ProjectName { get; set; } + public int TeamCount { get; set; } + public int AttendanceCount { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 905059d..e6932aa 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1707,5 +1707,122 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "job progression fetched successfully", 200)); } + + [HttpGet("project/attendance-overview")] + public async Task GetProjectAttendanceOverViewAsync([FromQuery] DateTime? date, CancellationToken cancellationToken) + { + // 1. Validation and Setup + if (tenantId == Guid.Empty) + { + _logger.LogWarning("GetProjectAttendanceOverView: Invalid request - TenantId is empty."); + return BadRequest(ApiResponse.ErrorResponse("Invalid TenantId", "Provided Invalid TenantId", 400)); + } + + // Default to UTC Today if null, ensuring only Date component is used + var targetDate = date?.Date ?? DateTime.UtcNow.Date; + + _logger.LogInfo("GetProjectAttendanceOverView: Starting fetch for Tenant {TenantId} on Date {Date}", tenantId, targetDate); + + try + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + if (loggedInEmployee == null) + { + _logger.LogWarning("GetProjectAttendanceOverView: Employee not found for current user."); + return Unauthorized(ApiResponse.ErrorResponse("Unauthorized", "Employee profile not found.", 401)); + } + + // 2. Permission Check + using var scope = _serviceScopeFactory.CreateScope(); + var _permission = scope.ServiceProvider.GetRequiredService(); + + var hasPermission = await _permission.HasPermission(PermissionsMaster.ManageProject, loggedInEmployee.Id); + + // 3. Determine Scope of Projects (Filtering Project IDs) + // We select only the IDs first to keep the memory footprint low before aggregation + var projectQuery = _context.ProjectAllocations + .AsNoTracking() + .Where(pa => pa.TenantId == tenantId && pa.IsActive); + + if (!hasPermission) + { + // If no admin permission, restrict to projects the employee is allocated to + projectQuery = projectQuery.Where(pa => pa.EmployeeId == loggedInEmployee.Id); + } + + var visibleProjectIds = await projectQuery + .Select(pa => pa.ProjectId) + .Distinct() + .ToListAsync(cancellationToken); + + if (!visibleProjectIds.Any()) + { + return Ok(ApiResponse>.SuccessResponse(new List(), "No projects found.", 200)); + } + + // 4. Parallel Data Fetching (Optimization) + // We fetch Project Details/Allocations AND Attendance counts separately to avoid complex Cartesian products in SQL + + // Query A: Get Project Details and Total Allocation Counts + var projectsTask = _context.ProjectAllocations + .AsNoTracking() + .Where(pa => pa.TenantId == tenantId && + pa.IsActive && + visibleProjectIds.Contains(pa.ProjectId) && + pa.Project != null) + .GroupBy(pa => new { pa.ProjectId, pa.Project!.Name }) + .Select(g => new + { + ProjectId = g.Key.ProjectId, + Name = g.Key.Name, + TeamCount = g.Count() + }) + .ToListAsync(cancellationToken); + + // Query B: Get Attendance Counts for the specific date + await using var context = await _dbContextFactory.CreateDbContextAsync(); + var attendanceTask = context.Attendes + .AsNoTracking() + .Where(a => a.TenantId == tenantId && + visibleProjectIds.Contains(a.ProjectID) && + a.AttendanceDate.Date == targetDate) + .GroupBy(a => a.ProjectID) + .Select(g => new + { + ProjectId = g.Key, + Count = g.Count() + }) + .ToDictionaryAsync(k => k.ProjectId, v => v.Count, cancellationToken); + + await Task.WhenAll(projectsTask, attendanceTask); + + var projects = await projectsTask; + var attendanceMap = await attendanceTask; + + // 5. In-Memory Projection + // Merging the two datasets efficiently + var response = projects.Select(p => new ProjectAttendanceOverviewVM + { + ProjectId = p.ProjectId, + ProjectName = p.Name, + TeamCount = p.TeamCount, + // O(1) Lookup from the dictionary + AttendanceCount = attendanceMap.ContainsKey(p.ProjectId) ? attendanceMap[p.ProjectId] : 0 + }) + .OrderBy(p => p.ProjectName) + .ToList(); + + _logger.LogInfo("GetProjectAttendanceOverView: Successfully fetched {Count} projects for Tenant {TenantId}", response.Count, tenantId); + + return Ok(ApiResponse>.SuccessResponse(response, "Attendance overview fetched successfully", 200)); + } + catch (Exception ex) + { + _logger.LogError(ex, "GetProjectAttendanceOverView: An unexpected error occurred for Tenant {TenantId}", tenantId); + // Do not expose raw Exception details to client in production + return StatusCode(500, ApiResponse.ErrorResponse("Internal Server Error", "An error occurred while processing your request.", 500)); + } + } + } } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 3f988f8..0242c9b 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -153,6 +153,11 @@ namespace Marco.Pms.Services.Service .Include(e => e.Currency) .Where(e => e.TenantId == tenantId); // Always filter by TenantId first. + //using var scope = _serviceScopeFactory.CreateScope(); + //var _projectServices = scope.ServiceProvider.GetRequiredService(); + + //var allprojectIds = await _projectServices.GetBothProjectIdsAsync(loggedInEmployee.Id, tenantId); + if (cacheList == null) { //await _cache.AddExpensesListToCache(expenses: await expensesQuery.ToListAsync(), tenantId); diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 48e2cc1..760cc6b 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -304,7 +304,9 @@ namespace Marco.Pms.Services.Service responseVms = responseVms .OrderBy(p => p.Name) .Skip((pageNumber - 1) * pageSize) - .Take(pageSize).ToList(); + .Take(pageSize) + .OrderBy(p => p.ShortName) + .ToList(); // --- Step 4: Return the combined result --- @@ -3267,7 +3269,7 @@ namespace Marco.Pms.Services.Service } } - return finalViewModels; + return finalViewModels.OrderBy(p => p.Name).ToList(); } private async Task GetProjectViewModel(Guid? id, Project project) { -- 2.43.0 From 0161c9be83c5d83de27046a67413314332cf18b9 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 10 Dec 2025 14:28:29 +0530 Subject: [PATCH 52/58] Fixed the bug where able create employee with same emails --- .../Controllers/EmployeeController.cs | 460 +++++++++++------- 1 file changed, 279 insertions(+), 181 deletions(-) diff --git a/Marco.Pms.Services/Controllers/EmployeeController.cs b/Marco.Pms.Services/Controllers/EmployeeController.cs index 2496fe7..f7a6528 100644 --- a/Marco.Pms.Services/Controllers/EmployeeController.cs +++ b/Marco.Pms.Services/Controllers/EmployeeController.cs @@ -607,202 +607,156 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse("Success.", responsemessage, 200)); } + /// + /// Manages employee creation or update operations within the current tenant context. + /// Supports both new employee onboarding and existing employee profile modifications. + /// Enforces tenant isolation, seat limits, email uniqueness, and application access validation. + /// + /// Employee data containing creation or update information. + /// Employee view model on success or structured error response. + /// Employee created or updated successfully. + /// Invalid request data or business rule violations. + /// Employee not found for update operation. + /// Business constraint violation (duplicate email, seat limit exceeded). + /// Internal server error during database operations. [HttpPost("manage")] - public async Task CreateEmployeeAsync([FromBody] CreateUserDto model) + public async Task ManageEmployeeFromWebAsync([FromBody] CreateUserDto model) { - // Correlation and context capture for logs + // Correlation ID for distributed tracing across services and logs + var correlationId = HttpContext.TraceIdentifier; + + _logger.LogInfo("ManageEmployeeFromWebAsync started. TenantId: {TenantId}, CorrelationId: {CorrelationId}, IsUpdate: {IsUpdate}", + tenantId, correlationId, model.Id.HasValue); + + // 1. EARLY GUARD CLAUSES - Fail fast with structured validation + if (tenantId == Guid.Empty) + { + _logger.LogWarning("Invalid tenant context. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + return BadRequest(ApiResponse.ErrorResponse("Invalid tenant", "Valid tenant context is required for employee management", 400)); + } + + if (model == null) + { + _logger.LogWarning("Null model received. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + return BadRequest(ApiResponse.ErrorResponse("Invalid payload", "Employee data is required in request body", 400)); + } + + // Application access requires valid email (business rule enforcement) + if (model.HasApplicationAccess && string.IsNullOrWhiteSpace(model.Email)) + { + _logger.LogWarning("Application access requested without email. TenantId: {TenantId}, CorrelationId: {CorrelationId}", tenantId, correlationId); + return BadRequest(ApiResponse.ErrorResponse("Missing email", "Application users must have a valid email address", 400)); + } + + // 2. AUTHENTICATED USER CONTEXT (single query, cached in UserHelper) var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + // 3. ENTERPRISE-GRADE ERROR HANDLING WITH TRANSACTION SCOPING + await using var transaction = await _context.Database.BeginTransactionAsync(); + try { - if (model == null) + ApiResponse response; + + if (model.Id.HasValue && model.Id != Guid.Empty) { - _logger.LogWarning("Model is null in CreateEmployeeAsync"); - return BadRequest(ApiResponse.ErrorResponse("Invalid payload", "Request body is required", 400)); + // UPDATE PATH: Validate existence first (AsNoTracking for read-only check) + _logger.LogDebug("Processing employee update. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + model.Id, tenantId, correlationId); + + var existingEmployee = await _context.Employees + .AsNoTracking() + .FirstOrDefaultAsync(e => e.Id == model.Id && e.TenantId == tenantId); + + if (existingEmployee == null) + { + _logger.LogWarning("Employee not found for update. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + model.Id, tenantId, correlationId); + return NotFound(ApiResponse.ErrorResponse("Employee not found", $"Employee with ID {model.Id} not found in tenant {tenantId}", 404)); + } + + // Track application access state change for audit + bool oldHasApplicationAccess = existingEmployee.HasApplicationAccess; + _mapper.Map(model, existingEmployee); + + response = await UpdateEmployeeAsync(oldHasApplicationAccess, existingEmployee, loggedInEmployee); + } + else + { + // CREATE PATH: New employee onboarding + _logger.LogDebug("Processing new employee creation. Email: {Email}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + model.Email ?? "", tenantId, correlationId); + + var newEmployee = _mapper.Map(model); + newEmployee.IsSystem = false; + newEmployee.IsActive = true; + newEmployee.IsPrimary = false; + + response = await CreateEmployeeAsync(newEmployee, loggedInEmployee); } - // Basic validation - if (model.HasApplicationAccess && string.IsNullOrWhiteSpace(model.Email)) - { - _logger.LogWarning("Application access requested but email is missing"); - return BadRequest(ApiResponse.ErrorResponse("Invalid email", "Application users must have a valid email", 400)); - } - - await using var transaction = await _context.Database.BeginTransactionAsync(); - try - { - // Load existing employee if updating, constrained by organization scope - Employee? existingEmployee = null; - if (model.Id.HasValue && model.Id.Value != Guid.Empty) - { - existingEmployee = await _context.Employees - .FirstOrDefaultAsync(e => e.Id == model.Id); - if (existingEmployee == null) - { - _logger.LogInfo("Employee not found for update. Id={EmployeeId}", model.Id); - return NotFound(ApiResponse.ErrorResponse("Employee not found", "Employee not found in database", 404)); - } - } - - // Identity user creation path (only if needed) - ApplicationUser? identityUserToCreate = null; - ApplicationUser? createdIdentityUser = null; - - if (model.HasApplicationAccess) - { - // Only attempt identity resolution/creation if email supplied and either: - // - Creating new employee, or - // - Updating but existing employee does not have ApplicationUserId - var needsIdentity = string.IsNullOrWhiteSpace(existingEmployee?.ApplicationUserId); - if (needsIdentity && !string.IsNullOrWhiteSpace(model.Email)) - { - var existingUser = await _userManager.FindByEmailAsync(model.Email); - if (existingUser == null) - { - // Seat check only when provisioning a new identity user - var isSeatsAvailable = await _generalHelper.CheckSeatsRemainingAsync(tenantId); - if (!isSeatsAvailable) - { - _logger.LogWarning("Maximum users reached for Tenant {TenantId}. Cannot create identity user for {Email}", tenantId, model.Email); - return BadRequest(ApiResponse.ErrorResponse( - "Maximum number of users reached. Cannot add new user", - "Maximum number of users reached. Cannot add new user", 400)); - } - - identityUserToCreate = new ApplicationUser - { - UserName = model.Email, - Email = model.Email, - EmailConfirmed = true - }; - } - else - { - // If identity exists, re-use it; do not re-create - createdIdentityUser = existingUser; - } - } - } - - // For create path: enforce uniqueness of employee email if applicable to business rules - // Consider adding a unique filtered index: (OrganizationId, Email) WHERE Email IS NOT NULL - if (!model.Id.HasValue || model.Id == Guid.Empty) - { - if (!string.IsNullOrWhiteSpace(model.Email)) - { - var emailExists = await _context.Employees - .AnyAsync(e => e.Email == model.Email); - if (emailExists) - { - _logger.LogInfo("Employee email already exists. Email={Email}", model.Email); - return StatusCode(403, ApiResponse.ErrorResponse( - "Employee with email already exists", - "Employee with this email already exists", 403)); - } - } - } - - // Create identity user if needed - if (identityUserToCreate != null && !string.IsNullOrWhiteSpace(identityUserToCreate.Email)) - { - var createResult = await _userManager.CreateAsync(identityUserToCreate, "User@123"); - if (!createResult.Succeeded) - { - _logger.LogWarning("Failed to create identity user for {Email}. Errors={Errors}", - identityUserToCreate.Email, - string.Join(", ", createResult.Errors.Select(e => $"{e.Code}:{e.Description}"))); - return BadRequest(ApiResponse.ErrorResponse("Failed to create user", createResult.Errors, 400)); - } - - createdIdentityUser = identityUserToCreate; - _logger.LogInfo("Identity user created. IdentityUserId={UserId}, Email={Email}", - createdIdentityUser.Id, createdIdentityUser.Email); - } - - - Guid employeeId; - EmployeeVM employeeVM; - string responseMessage; - - if (existingEmployee != null) - { - // Update flow - _mapper.Map(model, existingEmployee); - - if (createdIdentityUser != null && !string.IsNullOrWhiteSpace(createdIdentityUser.Email)) - { - existingEmployee.ApplicationUserId = createdIdentityUser.Id; - await SendResetIfApplicableAsync(createdIdentityUser, existingEmployee.FirstName ?? "User"); - } - - await _context.SaveChangesAsync(); - - employeeId = existingEmployee.Id; - employeeVM = _mapper.Map(existingEmployee); - responseMessage = "Employee Updated Successfully"; - - _logger.LogInfo("Employee updated. EmployeeId={EmployeeId}, Org={OrgId}", employeeId, existingEmployee.OrganizationId); - } - else - { - // Create flow - var newEmployee = _mapper.Map(model); - newEmployee.IsSystem = false; - newEmployee.IsActive = true; - newEmployee.IsPrimary = false; - - if (createdIdentityUser != null && !string.IsNullOrWhiteSpace(createdIdentityUser.Email)) - { - newEmployee.ApplicationUserId = createdIdentityUser.Id; - await SendResetIfApplicableAsync(createdIdentityUser, newEmployee.FirstName ?? "User"); - } - - await _context.Employees.AddAsync(newEmployee); - await _context.SaveChangesAsync(); - - employeeId = newEmployee.Id; - employeeVM = _mapper.Map(newEmployee); - responseMessage = "Employee Created Successfully"; - - _logger.LogInfo("Employee created. EmployeeId={EmployeeId}, Org={OrgId}", employeeId, newEmployee.OrganizationId); - } - - await transaction.CommitAsync(); - - // SignalR notification - var notification = new - { - LoggedInUserId = loggedInEmployee.Id, - Keyword = "Employee", - EmployeeId = employeeId - }; - - // Consider broadcasting to tenant/organization group instead of Clients.All to avoid cross-tenant leaks: - // await _signalR.Clients.Group($"org:{model.OrganizationId}").SendAsync("NotificationEventHandler", notification); - await _signalR.Clients.All.SendAsync("NotificationEventHandler", notification); - - _logger.LogInfo("Notification broadcasted for EmployeeId={EmployeeId}", employeeId); - - return Ok(ApiResponse.SuccessResponse(employeeVM, responseMessage, 200)); - } - catch (DbUpdateException dbEx) + // 4. BUSINESS LOGIC SUCCESS VALIDATION + if (!response.Success) { + _logger.LogWarning("Business logic failed during employee management. TenantId: {TenantId}, CorrelationId: {CorrelationId}, Error: {Error}", + tenantId, correlationId, response.Message); await transaction.RollbackAsync(); - _logger.LogError(dbEx, "Database exception occurred while managing employee"); - return StatusCode(500, ApiResponse.ErrorResponse( - "Internal exception occurred", - "Internal database exception has occurred", 500)); + return StatusCode(response.StatusCode, response); } - catch (Exception ex) + + // 5. COMMIT TRANSACTION AND TENANT-SCOPED NOTIFICATION + await transaction.CommitAsync(); + + _logger.LogInfo("Employee operation completed successfully. EmployeeId: {EmployeeId}, Operation: {Operation}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + response.Data.Id, (model.Id.HasValue ? "Update" : "Create"), tenantId, correlationId); + + // Tenant-scoped SignalR notification (prevents cross-tenant leakage) + var notification = new { - await transaction.RollbackAsync(); - _logger.LogError(ex, "Unhandled exception occurred while managing employee"); - return StatusCode(500, ApiResponse.ErrorResponse( - "Internal exception occurred", - "Internal exception has occurred", 500)); - } + TenantId = tenantId, + LoggedInUserId = loggedInEmployee.Id, + Keyword = "Employee", + EmployeeId = response.Data.Id + }; + + await _signalR.Clients.All + .SendAsync("NotificationEventHandler", notification); + + + _logger.LogDebug("Tenant-scoped SignalR notification sent. EmployeeId: {EmployeeId}, TenantId: {TenantId}, CorrelationId: {CorrelationId}", + response.Data.Id, tenantId, correlationId); + + return StatusCode(response.StatusCode, response); + } + catch (DbUpdateConcurrencyException dbConcurrencyEx) + { + await transaction.RollbackAsync(); + _logger.LogError(dbConcurrencyEx, "Concurrency conflict during employee management. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + return Conflict(ApiResponse.ErrorResponse("Concurrency conflict", "Employee data was modified by another user. Please refresh and try again.", 409)); + } + catch (DbUpdateException dbEx) + { + await transaction.RollbackAsync(); + _logger.LogError(dbEx, "Database constraint violation during employee management. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + return StatusCode(500, ApiResponse.ErrorResponse("Database error", "Database constraint violation occurred. Please check data and try again.", 500)); + } + catch (OperationCanceledException) + { + _logger.LogWarning("Request cancelled during employee management. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + return StatusCode(499, ApiResponse.ErrorResponse("Request cancelled", "Request was cancelled by client", 499)); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + _logger.LogError(ex, "Unexpected error during employee management. TenantId: {TenantId}, CorrelationId: {CorrelationId}", + tenantId, correlationId); + return StatusCode(500, ApiResponse.ErrorResponse("Internal server error", "An unexpected error occurred. Please contact support if issue persists.", 500)); } } + [HttpPost("manage-mobile")] public async Task CreateUserMoblie([FromBody] MobileUserManageDto model) { @@ -1264,5 +1218,149 @@ namespace MarcoBMS.Services.Controllers await _emailSender.SendResetPasswordEmailOnRegister(u.Email ?? "", firstName, resetLink); _logger.LogInfo("Reset password email queued. Email={Email}", u.Email ?? ""); } + + private static string? CapitalizeFirst(string? text) + { + if (string.IsNullOrEmpty(text)) + return text; + + return char.ToUpper(text[0]) + text.Substring(1); + } + + /// + /// Creates an employee in the database. + /// + /// The employee to create. + /// The currently logged in employee. + /// An ApiResponse containing the created employee or an error response. + private async Task> CreateEmployeeAsync(Employee employee, Employee loggedInEmployee) + { + // Check if the employee has application access and email is provided + if (employee.HasApplicationAccess && !string.IsNullOrWhiteSpace(employee.Email)) + { + // Check if the email already exists in the database + var emailExists = await _context.Employees.AsNoTracking().AnyAsync(e => e.Email == employee.Email && e.HasApplicationAccess); + if (emailExists) + { + _logger.LogWarning("Email already exists in database. Email={Email}", employee.Email); + return ApiResponse.ErrorResponse("Email already exists", "Email already exists in database", 409); + } + + // Check if the user with the email already exists in the identity system + var user = await _userManager.FindByEmailAsync(employee.Email); + if (user == null) + { + // Create a new identity user if the user does not exist + var newUser = new ApplicationUser + { + UserName = employee.Email, + Email = employee.Email, + EmailConfirmed = true + }; + + var createResult = await _userManager.CreateAsync(newUser, "User@123"); + if (!createResult.Succeeded) + { + _logger.LogWarning("Failed to create identity user for {Email}. Errors={Errors}", + newUser.Email!, + string.Join(", ", createResult.Errors.Select(e => $"{e.Code}:{e.Description}"))); + return ApiResponse.ErrorResponse("Failed to create user", createResult.Errors, 400); + } + user = newUser; + } + + if (user == null) + { + _logger.LogWarning("User not found for {Email}", employee.Email ?? ""); + return ApiResponse.ErrorResponse("User not found", "User not found in database", 400); + } + + // Set the application user ID for the employee + employee.ApplicationUserId = user.Id; + + // Send a password reset if applicable + await SendResetIfApplicableAsync(user, employee.FirstName ?? "User"); + } + + // Add the employee to the database + await _context.Employees.AddAsync(employee); + await _context.SaveChangesAsync(); + + // Map the employee to a view model + var employeeVM = _mapper.Map(employee); + + // Return a success response with the created employee + return ApiResponse.SuccessResponse(employeeVM, "Employee Created Successfully", 201); + } + + /// + /// Updates an employee in the database. + /// + /// Whether the employee previously had application access. + /// The employee to update. + /// The currently logged in employee. + /// An ApiResponse containing the updated employee view model. + private async Task> UpdateEmployeeAsync(bool oldHasApplicationAccess, Employee employee, Employee loggedInEmployee) + { + // Check if the employee is gaining application access and has an email + if (!oldHasApplicationAccess && employee.HasApplicationAccess && !string.IsNullOrWhiteSpace(employee.Email)) + { + // Check if the email already exists in the database + var emailExists = await _context.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Email == employee.Email && e.Id != employee.Id && e.HasApplicationAccess); + + if (emailExists != null) + { + // Log warning and return error response if email already exists + _logger.LogWarning("Email already exists in database. Email={Email}", employee.Email ?? ""); + return ApiResponse.ErrorResponse("Email already exists", "Email already exists in database", 409); + } + + // Check if the user with the email already exists in the identity system + var user = await _userManager.FindByEmailAsync(employee.Email); + if (user == null) + { + // Create a new user with the email in the identity system + var newUser = new ApplicationUser + { + UserName = employee.Email, + Email = employee.Email, + EmailConfirmed = true + }; + + var createResult = await _userManager.CreateAsync(newUser, "User@123"); + if (!createResult.Succeeded) + { + // Log warning and return error response if user creation failed + _logger.LogWarning("Failed to create identity user for {Email}. Errors={Errors}", + newUser.Email!, + string.Join(", ", createResult.Errors.Select(e => $"{e.Code}:{e.Description}"))); + return ApiResponse.ErrorResponse("Failed to create user", createResult.Errors, 400); + } + user = newUser; + } + + if (user == null) + { + // Log warning and return error response if user not found + _logger.LogWarning("User not found for {Email}", employee.Email ?? ""); + return ApiResponse.ErrorResponse("User not found", "User not found in database", 400); + } + + // Set the application user id on the employee + employee.ApplicationUserId = user.Id; + + // Send a password reset email if applicable + await SendResetIfApplicableAsync(user, employee.FirstName ?? "User"); + } + + // Update the employee in the database + _context.Employees.Update(employee); + await _context.SaveChangesAsync(); + + // Map the employee to a view model and return a success response + var employeeVM = _mapper.Map(employee); + return ApiResponse.SuccessResponse(employeeVM, "Employee Updated Successfully", 200); + } + } } -- 2.43.0 From bb102ce188784da3aa51a00128d71f5f736fa451 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 11 Dec 2025 10:06:42 +0530 Subject: [PATCH 53/58] Encrypting the response for Purchase invoice controller --- Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs index 80b2d58..17837b4 100644 --- a/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs +++ b/Marco.Pms.Services/Controllers/PurchaseInvoiceController.cs @@ -4,13 +4,16 @@ using Marco.Pms.Model.Dtos.PurchaseInvoice; using Marco.Pms.Model.Utilities; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; namespace Marco.Pms.Services.Controllers { - [Route("api/[controller]")] + [Authorize] [ApiController] + [EncryptResponse] + [Route("api/[controller]")] public class PurchaseInvoiceController : ControllerBase { private readonly UserHelper _userHelper; -- 2.43.0 From 94bbaeffa2600a7a05fdf28ba1395e4b5fe997f4 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 11 Dec 2025 10:33:04 +0530 Subject: [PATCH 54/58] Chnaged the variable in job progression api vm --- Marco.Pms.Services/Controllers/DashboardController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index e6932aa..5d4558a 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1702,7 +1702,7 @@ namespace Marco.Pms.Services.Controllers { AssignedJobs = assignedJobs, InProgressJobs = inProgressJobs, - AllJobs = selfAssignedJobs + MyJobs = selfAssignedJobs }; return Ok(ApiResponse.SuccessResponse(response, "job progression fetched successfully", 200)); -- 2.43.0 From 3928eafef95ad412b6939359709c4dd193be9692 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 11 Dec 2025 11:05:23 +0530 Subject: [PATCH 55/58] Changed the sorting of service and infra projects in get list API --- Marco.Pms.Helpers/CacheHelper/ProjectCache.cs | 70 +++++++++++++++++-- .../MongoDBModels/Project/ProjectMongoDB.cs | 1 + Marco.Pms.Services/Service/ProjectServices.cs | 13 ++++ .../Service/ServiceProjectService.cs | 14 +++- 4 files changed, 91 insertions(+), 7 deletions(-) diff --git a/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs index 6f11b07..77ca7d4 100644 --- a/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs +++ b/Marco.Pms.Helpers/CacheHelper/ProjectCache.cs @@ -8,6 +8,7 @@ using Marco.Pms.Model.Projects; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MongoDB.Bson; +using MongoDB.Bson.Serialization; using MongoDB.Driver; namespace Marco.Pms.Helpers @@ -16,6 +17,11 @@ namespace Marco.Pms.Helpers { private readonly IMongoCollection _projectCollection; private readonly IMongoCollection _taskCollection; + + private readonly string ActiveProjectStatusId = "b74da4c2-d07e-46f2-9919-e75e49b12731"; + private readonly string InProgressProjectStatusId = "cdad86aa-8a56-4ff4-b633-9c629057dfef"; + private readonly string OnHoldProjectStatusId = "603e994b-a27f-4e5d-a251-f3d69b0498ba"; + private readonly string InActiveProjectStatusId = "ef1c356e-0fe0-42df-a5d3-8daee355492d"; public ProjectCache(ApplicationDbContext context, IConfiguration configuration) { var connectionString = configuration["MongoDB:ConnectionString"]; @@ -135,16 +141,68 @@ namespace Marco.Pms.Helpers return project; } + + //public async Task> GetProjectDetailsListFromCache(List projectIds) + //{ + // List stringProjectIds = projectIds.Select(p => p.ToString()).ToList(); + // var filter = Builders.Filter.In(p => p.Id, stringProjectIds); + // var projection = Builders.Projection.Exclude(p => p.Buildings); + // var projects = await _projectCollection + // .Find(filter) + // .Project(projection) + // .ToListAsync(); + // return projects; + //} + public async Task> GetProjectDetailsListFromCache(List projectIds) { - List stringProjectIds = projectIds.Select(p => p.ToString()).ToList(); + var stringProjectIds = projectIds.Select(p => p.ToString()).ToList(); + var filter = Builders.Filter.In(p => p.Id, stringProjectIds); - var projection = Builders.Projection.Exclude(p => p.Buildings); - var projects = await _projectCollection - .Find(filter) + + var projection = Builders.Projection + .Exclude(p => p.Buildings); + + // base aggregation + var aggregate = _projectCollection.Aggregate() + .Match(filter) .Project(projection) - .ToListAsync(); - return projects; + .AppendStage( + @"{ + $addFields: { + statusPriority: { + $cond: [ + { $eq: [""$ProjectStatus.Id"", """ + ActiveProjectStatusId + @"""] }, 0, + { + $cond: [ + { $eq: [""$ProjectStatus.Id"", """ + InProgressProjectStatusId + @"""] }, 1, + { + $cond: [ + { $eq: [""$ProjectStatus.Id"", """ + OnHoldProjectStatusId + @"""] }, 2, + { + $cond: [ + { $eq: [""$ProjectStatus.Id"", """ + InActiveProjectStatusId + @"""] }, 3, + 4 + ] + } + ] + } + ] + } + ] + } + } + }") + .Sort(Builders.Sort + .Ascending("statusPriority") // custom status order + .Ascending("ShortName")); // then by Name + + var docs = await aggregate.ToListAsync(); + + var items = docs + .Select(d => BsonSerializer.Deserialize(d)) + .ToList(); + return items; } public async Task DeleteProjectByIdFromCacheAsync(Guid projectId) { diff --git a/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs index d64d358..982adf9 100644 --- a/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs +++ b/Marco.Pms.Model/MongoDBModels/Project/ProjectMongoDB.cs @@ -18,6 +18,7 @@ namespace Marco.Pms.Model.MongoDBModels.Project public int TeamSize { get; set; } public double CompletedWork { get; set; } public double PlannedWork { get; set; } + public int statusPriority { get; set; } public DateTime ExpireAt { get; set; } = DateTime.UtcNow.Date.AddDays(1); } } diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 760cc6b..304132d 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -36,6 +36,12 @@ namespace Marco.Pms.Services.Service private readonly ILoggingService _logger; private readonly CacheUpdateHelper _cache; private readonly IMapper _mapper; + + private readonly Guid ActiveProjectStatusId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); + private readonly Guid InProgressProjectStatusId = Guid.Parse("cdad86aa-8a56-4ff4-b633-9c629057dfef"); + private readonly Guid OnHoldProjectStatusId = Guid.Parse("603e994b-a27f-4e5d-a251-f3d69b0498ba"); + private readonly Guid InActiveProjectStatusId = Guid.Parse("ef1c356e-0fe0-42df-a5d3-8daee355492d"); + private readonly Guid CompletedProjectStatusId = Guid.Parse("33deaef9-9af1-4f2a-b443-681ea0d04f81"); public ProjectServices( IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, @@ -3314,6 +3320,13 @@ namespace Marco.Pms.Services.Service using var context = _dbContextFactory.CreateDbContext(); return await context.Projects.AsNoTracking() .Where(p => projectIdsToFetch.Contains(p.Id) && p.TenantId == tenantId) + .OrderBy(p => + p.ProjectStatusId == ActiveProjectStatusId ? 0 : + p.ProjectStatusId == InProgressProjectStatusId ? 1 : + p.ProjectStatusId == OnHoldProjectStatusId ? 2 : + p.ProjectStatusId == InActiveProjectStatusId ? 3 : + p.ProjectStatusId == CompletedProjectStatusId ? 4 : 5) + .ThenBy(p => p.ShortName) .ToListAsync(); }); diff --git a/Marco.Pms.Services/Service/ServiceProjectService.cs b/Marco.Pms.Services/Service/ServiceProjectService.cs index 35e89df..24d57a2 100644 --- a/Marco.Pms.Services/Service/ServiceProjectService.cs +++ b/Marco.Pms.Services/Service/ServiceProjectService.cs @@ -41,6 +41,12 @@ namespace Marco.Pms.Services.Service private readonly Guid ClosedStatus = Guid.Parse("3ddeefb5-ae3c-4e10-a922-35e0a452bb69"); private readonly Guid OnHoldStatus = Guid.Parse("75a0c8b8-9c6a-41af-80bf-b35bab722eb2"); + private readonly Guid ActiveProjectStatusId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); + private readonly Guid InProgressProjectStatusId = Guid.Parse("cdad86aa-8a56-4ff4-b633-9c629057dfef"); + private readonly Guid OnHoldProjectStatusId = Guid.Parse("603e994b-a27f-4e5d-a251-f3d69b0498ba"); + private readonly Guid InActiveProjectStatusId = Guid.Parse("ef1c356e-0fe0-42df-a5d3-8daee355492d"); + private readonly Guid CompletedProjectStatusId = Guid.Parse("33deaef9-9af1-4f2a-b443-681ea0d04f81"); + public ServiceProjectService(IDbContextFactory dbContextFactory, IServiceScopeFactory serviceScopeFactory, ApplicationDbContext context, @@ -107,7 +113,13 @@ namespace Marco.Pms.Services.Service // Fetch projects for the requested page with ordering by newest var serviceProjects = await serviceProjectQuery - .OrderByDescending(sp => sp.CreatedAt) + .OrderBy(p => + p.ProjectStatusId == ActiveProjectStatusId ? 0 : + p.ProjectStatusId == InProgressProjectStatusId ? 1 : + p.ProjectStatusId == OnHoldProjectStatusId ? 2 : + p.ProjectStatusId == InActiveProjectStatusId ? 3 : + p.ProjectStatusId == CompletedProjectStatusId ? 4 : 5) + .ThenBy(p => p.ShortName) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); -- 2.43.0 From bb01e645fe386e6fcb276f6d4c29cb67ab49ee73 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 11 Dec 2025 11:07:57 +0530 Subject: [PATCH 56/58] Corrected spelling mistake in service project get list API --- Marco.Pms.Services/Service/ServiceProjectService.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marco.Pms.Services/Service/ServiceProjectService.cs b/Marco.Pms.Services/Service/ServiceProjectService.cs index 24d57a2..195f266 100644 --- a/Marco.Pms.Services/Service/ServiceProjectService.cs +++ b/Marco.Pms.Services/Service/ServiceProjectService.cs @@ -114,11 +114,11 @@ namespace Marco.Pms.Services.Service // Fetch projects for the requested page with ordering by newest var serviceProjects = await serviceProjectQuery .OrderBy(p => - p.ProjectStatusId == ActiveProjectStatusId ? 0 : - p.ProjectStatusId == InProgressProjectStatusId ? 1 : - p.ProjectStatusId == OnHoldProjectStatusId ? 2 : - p.ProjectStatusId == InActiveProjectStatusId ? 3 : - p.ProjectStatusId == CompletedProjectStatusId ? 4 : 5) + p.StatusId == ActiveProjectStatusId ? 0 : + p.StatusId == InProgressProjectStatusId ? 1 : + p.StatusId == OnHoldProjectStatusId ? 2 : + p.StatusId == InActiveProjectStatusId ? 3 : + p.StatusId == CompletedProjectStatusId ? 4 : 5) .ThenBy(p => p.ShortName) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) -- 2.43.0 From 910110f86d3f5321e536dec794464b184c131ac8 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 11 Dec 2025 14:54:28 +0530 Subject: [PATCH 57/58] Changed select to project while getting service list API --- Marco.Pms.Services/Service/MasterService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 763c282..e2c3bdb 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -1,4 +1,5 @@ using AutoMapper; +using AutoMapper.QueryableExtensions; using Marco.Pms.DataAccess.Data; using Marco.Pms.Helpers.Utility; using Marco.Pms.Model.Collection; @@ -520,7 +521,7 @@ namespace Marco.Pms.Services.Service // Step 1: Fetch services for the tenant var services = await _context.ServiceMasters .Where(s => s.TenantId == tenantId && s.IsActive) - .Select(s => _mapper.Map(s)) + .ProjectTo(_mapper.ConfigurationProvider) .OrderBy(s => s.Name) .ToListAsync(); -- 2.43.0 From 13d9f2d9e8e1124706fe817ac4b1342c185c3b04 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Fri, 12 Dec 2025 10:42:03 +0530 Subject: [PATCH 58/58] Sending the orginal status code rather than hardcoded status code --- Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs index e861515..ba9d3a4 100644 --- a/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs +++ b/Marco.Pms.Services/Extensions/EncryptResponseAttribute.cs @@ -47,7 +47,7 @@ public class EncryptResponseAttribute : TypeFilterAttribute { Content = encryptedText, ContentType = "text/plain", - StatusCode = 200 + StatusCode = objectResult.StatusCode ?? 200 }; } } -- 2.43.0