diff --git a/0_Framework/0_Framework.csproj b/0_Framework/0_Framework.csproj index ad747dc2..66522232 100644 --- a/0_Framework/0_Framework.csproj +++ b/0_Framework/0_Framework.csproj @@ -6,6 +6,7 @@ + diff --git a/0_Framework/Exceptions/Handler/CustomExceptionHandler.cs b/0_Framework/Exceptions/Handler/CustomExceptionHandler.cs index e6fd9da1..3af1276d 100644 --- a/0_Framework/Exceptions/Handler/CustomExceptionHandler.cs +++ b/0_Framework/Exceptions/Handler/CustomExceptionHandler.cs @@ -1,7 +1,10 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using FluentValidation; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -27,6 +30,14 @@ public class CustomExceptionHandler : IExceptionHandler (string Detail, string Title, int StatusCode, Dictionary? Extra) details = exception switch { + ValidationException validationException => + ( + validationException.Errors.FirstOrDefault()?.ErrorMessage ?? "One or more validation errors occurred.", + "Validation Error", + context.Response.StatusCode = StatusCodes.Status400BadRequest, + null + ), + InternalServerException => ( exception.Message, @@ -34,6 +45,7 @@ public class CustomExceptionHandler : IExceptionHandler context.Response.StatusCode = StatusCodes.Status500InternalServerError, null ), + BadRequestException bre => ( exception.Message, @@ -41,6 +53,7 @@ public class CustomExceptionHandler : IExceptionHandler context.Response.StatusCode = StatusCodes.Status400BadRequest, bre.Extra ), + NotFoundException => ( exception.Message, @@ -48,6 +61,7 @@ public class CustomExceptionHandler : IExceptionHandler context.Response.StatusCode = StatusCodes.Status404NotFound, null ), + UnAuthorizeException => ( exception.Message, @@ -55,6 +69,7 @@ public class CustomExceptionHandler : IExceptionHandler context.Response.StatusCode = StatusCodes.Status401Unauthorized, null ), + _ => ( exception.Message, @@ -73,8 +88,6 @@ public class CustomExceptionHandler : IExceptionHandler Extensions = details.Extra ?? new Dictionary() }; - - problemDetails.Extensions.Add("traceId", context.TraceIdentifier); await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken); diff --git a/CompanyManagment.App.Contracts/EmployeeDocuments/WorkshopWithEmployeeDocumentsViewModel.cs b/CompanyManagment.App.Contracts/EmployeeDocuments/WorkshopWithEmployeeDocumentsViewModel.cs index bfc63e07..df9aedd1 100644 --- a/CompanyManagment.App.Contracts/EmployeeDocuments/WorkshopWithEmployeeDocumentsViewModel.cs +++ b/CompanyManagment.App.Contracts/EmployeeDocuments/WorkshopWithEmployeeDocumentsViewModel.cs @@ -13,5 +13,6 @@ namespace CompanyManagment.App.Contracts.EmployeeDocuments public string EmployerName { get; set; } public List SubmittedItems { get; set; } public int EmployeesWithoutDocumentCount { get; set; } + public long EmployeeId { get; set; } } } diff --git a/CompanyManagment.EFCore/Repository/EmployeeDocumentsRepository.cs b/CompanyManagment.EFCore/Repository/EmployeeDocumentsRepository.cs index 7635c7e9..1cffdc1d 100644 --- a/CompanyManagment.EFCore/Repository/EmployeeDocumentsRepository.cs +++ b/CompanyManagment.EFCore/Repository/EmployeeDocumentsRepository.cs @@ -1194,41 +1194,99 @@ public class EmployeeDocumentsRepository : RepositoryBase(); } + // Step 1: Get employee client temps in memory + var employeeClientTempData = await _companyContext.EmployeeClientTemps + .Where(x => workshops.Contains(x.WorkshopId)) + .Select(x => new { x.WorkshopId, x.EmployeeId }) + .ToListAsync(); + // Step 2: Get employee documents with simplified filter + var employeeDocuments = await _companyContext.EmployeeDocuments + .Where(x => workshops.Contains(x.WorkshopId) && !x.IsConfirmed && !x.IsSentToChecker) + .Select(x => new + { + x.id, + x.WorkshopId, + x.EmployeeId, + x.IsConfirmed, + x.IsSentToChecker, + WorkshopName = x.Workshop.WorkshopName + }) + .ToListAsync(); - var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => workshops.Contains(x.WorkshopId)); + var filteredDocuments = employeeDocuments + .Where(x => employeeClientTempData.Any(temp => + temp.WorkshopId == x.WorkshopId && temp.EmployeeId == x.EmployeeId)) + .ToList(); + var groupedByWorkshop = filteredDocuments + .GroupBy(x => x.WorkshopId) + .Select(g => new + { + WorkshopId = g.Key, + WorkshopName = g.First().WorkshopName, + Count = g.Count() + }) + .ToList(); - var query = _companyContext.EmployeeDocuments - .Where(x => workshops.Contains(x.WorkshopId) && - employeeClientTemp.Any(temp => x.EmployeeId == temp.EmployeeId && temp.WorkshopId == x.WorkshopId) && x.IsConfirmed == false &&x.IsSentToChecker == false) - .Include(x => x.Workshop).Include(x => x.EmployeeDocumentItemCollection) - .GroupBy(x => x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel() - { - WorkshopId = x.Key, - WorkshopFullName = x.FirstOrDefault().Workshop.WorkshopFullName, - EmployeesWithoutDocumentCount = x.Count() - }); + // Step 5: Get workshop employers for the filtered workshops + var workshopIds = groupedByWorkshop.Select(x => x.WorkshopId).ToList(); + var workshopEmployers = await _companyContext.WorkshopEmployers + .Where(x => workshopIds.Contains(x.WorkshopId)) + .Include(x => x.Employer) + .GroupBy(x => x.WorkshopId) + .Select(g => g.FirstOrDefault()) + .ToListAsync(); + + // Step 6: Build result + var res = groupedByWorkshop + .Select(x => new WorkshopWithEmployeeDocumentsViewModel() + { + WorkshopId = x.WorkshopId, + WorkshopFullName = x.WorkshopName, + EmployeesWithoutDocumentCount = x.Count, + EmployerName = workshopEmployers + .FirstOrDefault(y => y.WorkshopId == x.WorkshopId)? + .Employer?.FullName + }) + .Where(x => x.EmployeesWithoutDocumentCount > 0) + .OrderByDescending(x => x.EmployeesWithoutDocumentCount) + .ToList(); + + return res; + + //var employeeClientTemp = _companyContext.EmployeeClientTemps.Where(x => workshops.Contains(x.WorkshopId)); + + // var query = _companyContext.EmployeeDocuments + // .Where(x => workshops.Contains(x.WorkshopId) && + // employeeClientTemp.Any(temp => x.EmployeeId == temp.EmployeeId && temp.WorkshopId == x.WorkshopId) && x.IsConfirmed == false &&x.IsSentToChecker == false) + // .Include(x => x.Workshop).Include(x => x.EmployeeDocumentItemCollection) + // .GroupBy(x => x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel() + // { + // WorkshopId = x.Key, + // WorkshopFullName = x.FirstOrDefault().Workshop.WorkshopFullName, + // EmployeesWithoutDocumentCount = x.Count() + // }); - var workshopEmployers = await _companyContext.WorkshopEmployers.Include(x => x.Employer) - .Where(x => query.Any(y => y.WorkshopId == x.WorkshopId)) - .GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToListAsync(); + // var workshopEmployers = await _companyContext.WorkshopEmployers.Include(x => x.Employer) + // .Where(x => query.Any(y => y.WorkshopId == x.WorkshopId)) + // .GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToListAsync(); - var result = await query.ToListAsync(); + // var result = await query.ToListAsync(); - result.ForEach(x => - { - var employer = workshopEmployers.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.Employer; - x.EmployerName = employer?.FullName; + // result.ForEach(x => + // { + // var employer = workshopEmployers.FirstOrDefault(y => y.WorkshopId == x.WorkshopId)?.Employer; + // x.EmployerName = employer?.FullName; - //x.SubmittedItems.ForEach(y=>y.PicturePath= medias.FirstOrDefault(z=>z.id == y.MediaId)?.Path ?? ""); - }); + // //x.SubmittedItems.ForEach(y=>y.PicturePath= medias.FirstOrDefault(z=>z.id == y.MediaId)?.Path ?? ""); + // }); - return result.Where(x => x.EmployeesWithoutDocumentCount > 0).OrderByDescending(x => x.EmployeesWithoutDocumentCount).ToList(); + // return result.Where(x => x.EmployeesWithoutDocumentCount > 0).OrderByDescending(x => x.EmployeesWithoutDocumentCount).ToList(); } public async Task> GetCreatedEmployeesDocumentByWorkshopIdForAdmin(long workshopId) @@ -1347,33 +1405,37 @@ public class EmployeeDocumentsRepository : RepositoryBase workshops.Contains(x.WorkshopId)) - .Include(x => x.Employer).Select(x => x.Employer.ContractingPartyId).Distinct(); + .Include(x => x.Employer).Select(x => x.Employer.ContractingPartyId).Distinct().ToList(); var accountIds = await _companyContext.ContractingPartyAccounts .Where(x => contractingPartyIds.Contains(x.PersonalContractingPartyId)).Select(x => x.AccountId) .ToListAsync(); - var query = _companyContext.EmployeeDocuments - .Where(x => workshops.Contains(x.WorkshopId) && - (allActiveEmployees.Any(y => y.WorkshopId == x.WorkshopId && y.EmployeeId == x.EmployeeId))) + var query =await _companyContext.EmployeeDocuments + .Where(x => workshops.Contains(x.WorkshopId)) .Include(x => x.Workshop).Include(x => x.EmployeeDocumentItemCollection) .Where(x => x.IsSentToChecker == false && x.HasRejectedItems && x.EmployeeDocumentItemCollection.Any(i => i.DocumentStatus == DocumentStatus.Rejected && accountIds.Contains(i.UploaderId))) .GroupBy(x => x.WorkshopId).Select(x => new WorkshopWithEmployeeDocumentsViewModel() { WorkshopId = x.Key, WorkshopFullName = x.FirstOrDefault().Workshop.WorkshopName, - EmployeesWithoutDocumentCount = x.Count() - }); + EmployeesWithoutDocumentCount = x.Count(), + EmployeeId = x.First().EmployeeId + }).ToListAsync(); + query = query.Where(x => + (allActiveEmployees.Any(y => y.WorkshopId == x.WorkshopId && y.EmployeeId == x.EmployeeId))).ToList(); + + var resWorkshopIds = query.Select(x => x.WorkshopId).ToList(); var workshopEmployers = await _companyContext.WorkshopEmployers.Include(x => x.Employer) - .Where(x => query.Any(y => y.WorkshopId == x.WorkshopId)) + .Where(x => resWorkshopIds.Contains(x.WorkshopId)) .GroupBy(x => x.WorkshopId).Select(x => x.FirstOrDefault()).ToListAsync(); - var result = await query.ToListAsync(); + var result = query; result.ForEach(x => diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeStatusSection/ChangeStatusSectionCommandHandler.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeStatusSection/ChangeStatusSectionCommandHandler.cs index 4214ec2d..9e6803f5 100644 --- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeStatusSection/ChangeStatusSectionCommandHandler.cs +++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Projects/Commands/ChangeStatusSection/ChangeStatusSectionCommandHandler.cs @@ -49,8 +49,11 @@ public class ChangeStatusSectionCommandHandler : IBaseCommandHandler projects, CancellationToken cancellationToken) { + if (!projects.Any()) + return; + var projectIds = projects.Select(x => x.Id).ToList(); - - // تنها تسک‌ها sections دارند، بنابراین برای سطوح مختلف باید متفاوت عمل کنیم - List taskIds; - - switch (projects.FirstOrDefault()?.Level) + var hierarchyLevel = projects.First().Level; + + switch (hierarchyLevel) { case ProjectHierarchyLevel.Project: - // برای پروژه‌ها، باید تمام تسک‌های زیرمجموعه را پیدا کنیم - var phaseIds = await _context.ProjectPhases - .Where(ph => projectIds.Contains(ph.ProjectId)) - .Select(ph => ph.Id) - .ToListAsync(cancellationToken); - - taskIds = await _context.ProjectTasks - .Where(t => phaseIds.Contains(t.PhaseId)) - .Select(t => t.Id) - .ToListAsync(cancellationToken); + await SetSkillFlagsForProjects(projects, projectIds, cancellationToken); break; case ProjectHierarchyLevel.Phase: - // برای فازها، تمام تسک‌های آن فازها را پیدا کنیم - taskIds = await _context.ProjectTasks - .Where(t => projectIds.Contains(t.PhaseId)) - .Select(t => t.Id) - .ToListAsync(cancellationToken); + await SetSkillFlagsForPhases(projects, projectIds, cancellationToken); break; case ProjectHierarchyLevel.Task: - // برای تسک‌ها، خود آنها taskIds هستند - taskIds = projectIds; + await SetSkillFlagsForTasks(projects, projectIds, cancellationToken); break; - - default: - return; } + } - if (!taskIds.Any()) - return; - - var sections = await _context.TaskSections + private async Task SetSkillFlagsForProjects(List projects, List projectIds, CancellationToken cancellationToken) + { + var projectSections = await _context.ProjectSections .Include(x => x.Skill) - .Where(x => taskIds.Contains(x.TaskId)) + .Where(s => projectIds.Contains(s.ProjectId)) .ToListAsync(cancellationToken); + if (!projectSections.Any()) + return; + foreach (var project in projects) { - List relevantTaskIds; - - switch (project.Level) - { - case ProjectHierarchyLevel.Project: - // برای پروژه، تمام تسک‌های زیرمجموعه - var projectPhaseIds = await _context.ProjectPhases - .Where(ph => ph.ProjectId == project.Id) - .Select(ph => ph.Id) - .ToListAsync(cancellationToken); - - relevantTaskIds = await _context.ProjectTasks - .Where(t => projectPhaseIds.Contains(t.PhaseId)) - .Select(t => t.Id) - .ToListAsync(cancellationToken); - break; - - case ProjectHierarchyLevel.Phase: - // برای فاز، تمام تسک‌های آن فاز - relevantTaskIds = await _context.ProjectTasks - .Where(t => t.PhaseId == project.Id) - .Select(t => t.Id) - .ToListAsync(cancellationToken); - break; - - case ProjectHierarchyLevel.Task: - // برای تسک، خود آن - relevantTaskIds = new List { project.Id }; - break; - - default: - continue; - } - - var projectSections = sections.Where(x => relevantTaskIds.Contains(x.TaskId)).ToList(); - project.HasBackend = projectSections.Any(x => x.Skill.Name == "Backend"); - project.HasFront = projectSections.Any(x => x.Skill.Name == "Frontend"); - project.HasDesign = projectSections.Any(x => x.Skill.Name == "UI/UX Design"); + var sections = projectSections.Where(s => s.ProjectId == project.Id).ToList(); + project.HasBackend = sections.Any(x => x.Skill?.Name == "Backend"); + project.HasFront = sections.Any(x => x.Skill?.Name == "Frontend"); + project.HasDesign = sections.Any(x => x.Skill?.Name == "UI/UX Design"); + } + } + + private async Task SetSkillFlagsForPhases(List projects, List phaseIds, CancellationToken cancellationToken) + { + var phaseSections = await _context.PhaseSections + .Include(x => x.Skill) + .Where(s => phaseIds.Contains(s.PhaseId)) + .ToListAsync(cancellationToken); + + if (!phaseSections.Any()) + return; + + foreach (var phase in projects) + { + var sections = phaseSections.Where(s => s.PhaseId == phase.Id).ToList(); + phase.HasBackend = sections.Any(x => x.Skill?.Name == "Backend"); + phase.HasFront = sections.Any(x => x.Skill?.Name == "Frontend"); + phase.HasDesign = sections.Any(x => x.Skill?.Name == "UI/UX Design"); + } + } + + private async Task SetSkillFlagsForTasks(List projects, List taskIds, CancellationToken cancellationToken) + { + var taskSections = await _context.TaskSections + .Include(x => x.Skill) + .Where(s => taskIds.Contains(s.TaskId)) + .ToListAsync(cancellationToken); + + if (!taskSections.Any()) + return; + + foreach (var task in projects) + { + var sections = taskSections.Where(s => s.TaskId == task.Id).ToList(); + task.HasBackend = sections.Any(x => x.Skill?.Name == "Backend"); + task.HasFront = sections.Any(x => x.Skill?.Name == "Frontend"); + task.HasDesign = sections.Any(x => x.Skill?.Name == "UI/UX Design"); } } diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/PhaseSection.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/PhaseSection.cs index 33bdfcdf..05c7bb83 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/PhaseSection.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/PhaseSection.cs @@ -1,4 +1,5 @@ using GozareshgirProgramManager.Domain._Common; +using GozareshgirProgramManager.Domain.SkillAgg.Entities; namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities; @@ -22,6 +23,7 @@ public class PhaseSection : EntityBase // Navigation property public ProjectPhase Phase { get; private set; } = null!; + public Skill? Skill { get; set; } public void UpdateUser(long userId) { diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectSection.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectSection.cs index 67820d49..d41c5eb0 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectSection.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/ProjectSection.cs @@ -1,4 +1,5 @@ using GozareshgirProgramManager.Domain._Common; +using GozareshgirProgramManager.Domain.SkillAgg.Entities; namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities; @@ -21,6 +22,7 @@ public class ProjectSection : EntityBase public Guid SkillId { get; private set; } public Project Project { get; private set; } = null!; + public Skill? Skill { get; set; } public void UpdateUser(long userId) { diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs index c663ed4b..7fd3f3e8 100644 --- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs +++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/TaskSection.cs @@ -210,4 +210,11 @@ public class TaskSection : EntityBase { _additionalTimes.Clear(); } + + public bool HasRemainingTime() + { + var totalSpent = GetTotalTimeSpent(); + var finalEstimate = FinalEstimatedHours; + return totalSpent < finalEstimate; + } } \ No newline at end of file diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.Designer.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.Designer.cs new file mode 100644 index 00000000..2fbb0fa8 --- /dev/null +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.Designer.cs @@ -0,0 +1,857 @@ +// +using System; +using GozareshgirProgramManager.Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace GozareshgirProgramManager.Infrastructure.Migrations +{ + [DbContext(typeof(ProgramManagerDbContext))] + [Migration("20251215155149_add relation to phase section and projectsection to skill")] + partial class addrelationtophasesectionandprojectsectiontoskill + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.CheckoutAgg.Entities.Checkout", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CheckoutEndDate") + .HasColumnType("datetime2"); + + b.Property("CheckoutStartDate") + .HasColumnType("datetime2"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("DeductionFromSalary") + .HasColumnType("float"); + + b.Property("FullName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("MandatoryHours") + .HasColumnType("int"); + + b.Property("Month") + .HasColumnType("int"); + + b.Property("MonthlySalaryDefined") + .HasColumnType("float"); + + b.Property("MonthlySalaryPay") + .HasColumnType("float"); + + b.Property("RemainingHours") + .HasColumnType("int"); + + b.Property("TotalDaysWorked") + .HasColumnType("int"); + + b.Property("TotalHoursWorked") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Checkouts", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.CustomerAgg.Customer", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.ToTable("Customers", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("PhaseId") + .HasColumnType("uniqueidentifier"); + + b.Property("SkillId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("PhaseId"); + + b.HasIndex("SkillId"); + + b.ToTable("PhaseSections"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("HasAssignmentOverride") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("PlannedEndDate") + .HasColumnType("datetime2"); + + b.Property("PlannedStartDate") + .HasColumnType("datetime2"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.ToTable("Projects", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("HasAssignmentOverride") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("OrderIndex") + .HasColumnType("int"); + + b.Property("ProjectId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.ToTable("ProjectPhases", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectSection", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ProjectId") + .HasColumnType("uniqueidentifier"); + + b.Property("SkillId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("SkillId"); + + b.ToTable("ProjectSections"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AllocatedTime") + .HasMaxLength(30) + .HasColumnType("nvarchar(30)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("DueDate") + .HasColumnType("datetime2"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("HasAssignmentOverride") + .HasColumnType("bit"); + + b.Property("HasTimeOverride") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("OrderIndex") + .HasColumnType("int"); + + b.Property("PhaseId") + .HasColumnType("uniqueidentifier"); + + b.Property("Priority") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("PhaseId"); + + b.ToTable("ProjectTasks", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("CurrentAssignedUserId") + .HasColumnType("bigint"); + + b.Property("InitialDescription") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("InitialEstimatedHours") + .IsRequired() + .HasMaxLength(30) + .HasColumnType("nvarchar(30)"); + + b.Property("OriginalAssignedUserId") + .HasColumnType("bigint"); + + b.Property("SkillId") + .HasColumnType("uniqueidentifier"); + + b.Property("Status") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TaskId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SkillId"); + + b.HasIndex("TaskId"); + + b.ToTable("TaskSections", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionActivity", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("EndDate") + .HasColumnType("datetime2"); + + b.Property("EndNotes") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Notes") + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("SectionId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("SectionId"); + + b.ToTable("TaskSectionActivities", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionAdditionalTime", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AddedAt") + .HasColumnType("datetime2"); + + b.Property("AddedByUserId") + .HasColumnType("bigint"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Hours") + .IsRequired() + .HasMaxLength(30) + .HasColumnType("nvarchar(30)"); + + b.Property("Reason") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("TaskSectionId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("TaskSectionId"); + + b.ToTable("TaskSectionAdditionalTimes", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.RoleAgg.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("GozareshgirRoleId") + .HasColumnType("bigint"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("Id"); + + b.ToTable("PmRoles", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.SalaryPaymentSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("EndSettingDate") + .HasColumnType("datetime2"); + + b.Property("HolidayWorking") + .HasColumnType("bit"); + + b.Property("MonthlySalary") + .HasColumnType("float"); + + b.Property("StartSettingDate") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("SalaryPaymentSetting", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.ToTable("Skills", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AccountId") + .HasColumnType("bigint"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("FullName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Mobile") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("ProfilePhotoPath") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("VerifyCode") + .HasMaxLength(10) + .HasColumnType("nvarchar(10)"); + + b.HasKey("Id"); + + b.ToTable("Users", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.UserRefreshToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpiresAt") + .HasColumnType("datetime2"); + + b.Property("IpAddress") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("RevokedAt") + .HasColumnType("datetime2"); + + b.Property("Token") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("UserAgent") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpiresAt"); + + b.HasIndex("Token") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("UserRefreshTokens", (string)null); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase") + .WithMany("PhaseSections") + .HasForeignKey("PhaseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill") + .WithMany() + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Phase"); + + b.Navigation("Skill"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", "Project") + .WithMany("Phases") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectSection", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", "Project") + .WithMany("ProjectSections") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill") + .WithMany() + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Project"); + + b.Navigation("Skill"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase") + .WithMany("Tasks") + .HasForeignKey("PhaseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Phase"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b => + { + b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill") + .WithMany("Sections") + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", "Task") + .WithMany("Sections") + .HasForeignKey("TaskId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Skill"); + + b.Navigation("Task"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionActivity", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", "Section") + .WithMany("Activities") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Section"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionAdditionalTime", b => + { + b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", null) + .WithMany("AdditionalTimes") + .HasForeignKey("TaskSectionId"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.RoleAgg.Entities.Role", b => + { + b.OwnsMany("GozareshgirProgramManager.Domain.PermissionAgg.Entities.Permission", "Permissions", b1 => + { + b1.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id")); + + b1.Property("Code") + .HasColumnType("int"); + + b1.Property("RoleId") + .HasColumnType("bigint"); + + b1.HasKey("Id"); + + b1.HasIndex("RoleId"); + + b1.ToTable("PmRolePermissions", (string)null); + + b1.WithOwner("Role") + .HasForeignKey("RoleId"); + + b1.Navigation("Role"); + }); + + b.Navigation("Permissions"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.SalaryPaymentSetting", b => + { + b.OwnsMany("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.WorkingHours", "WorkingHoursList", b1 => + { + b1.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id")); + + b1.Property("EndShiftOne") + .HasColumnType("time(0)"); + + b1.Property("EndShiftTwo") + .HasColumnType("time(0)"); + + b1.Property("HasRestTime") + .HasColumnType("bit"); + + b1.Property("HasShiftOne") + .HasColumnType("bit"); + + b1.Property("HasShiftTow") + .HasColumnType("bit"); + + b1.Property("IsActiveDay") + .HasColumnType("bit"); + + b1.Property("PersianDayOfWeek") + .HasColumnType("int"); + + b1.Property("RestTime") + .HasColumnType("time(0)"); + + b1.Property("SalaryPaymentSettingId") + .HasColumnType("bigint"); + + b1.Property("ShiftDurationInMinutes") + .HasColumnType("int"); + + b1.Property("StartShiftOne") + .HasColumnType("time(0)"); + + b1.Property("StartShiftTwo") + .HasColumnType("time(0)"); + + b1.HasKey("Id"); + + b1.HasIndex("SalaryPaymentSettingId"); + + b1.ToTable("WorkingHours", (string)null); + + b1.WithOwner("SalaryPaymentSetting") + .HasForeignKey("SalaryPaymentSettingId"); + + b1.Navigation("SalaryPaymentSetting"); + }); + + b.Navigation("WorkingHoursList"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b => + { + b.OwnsMany("GozareshgirProgramManager.Domain.RoleUserAgg.RoleUser", "RoleUser", b1 => + { + b1.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id")); + + b1.Property("RoleId") + .HasColumnType("bigint"); + + b1.Property("UserId") + .HasColumnType("bigint"); + + b1.HasKey("Id"); + + b1.HasIndex("UserId"); + + b1.ToTable("RoleUsers", (string)null); + + b1.WithOwner("User") + .HasForeignKey("UserId"); + + b1.Navigation("User"); + }); + + b.Navigation("RoleUser"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.UserRefreshToken", b => + { + b.HasOne("GozareshgirProgramManager.Domain.UserAgg.Entities.User", "User") + .WithMany("RefreshTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", b => + { + b.Navigation("Phases"); + + b.Navigation("ProjectSections"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b => + { + b.Navigation("PhaseSections"); + + b.Navigation("Tasks"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b => + { + b.Navigation("Sections"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b => + { + b.Navigation("Activities"); + + b.Navigation("AdditionalTimes"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", b => + { + b.Navigation("Sections"); + }); + + modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b => + { + b.Navigation("RefreshTokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.cs new file mode 100644 index 00000000..3f63a30b --- /dev/null +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20251215155149_add relation to phase section and projectsection to skill.cs @@ -0,0 +1,63 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace GozareshgirProgramManager.Infrastructure.Migrations +{ + /// + public partial class addrelationtophasesectionandprojectsectiontoskill : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + migrationBuilder.CreateIndex( + name: "IX_ProjectSections_SkillId", + table: "ProjectSections", + column: "SkillId"); + + migrationBuilder.CreateIndex( + name: "IX_PhaseSections_SkillId", + table: "PhaseSections", + column: "SkillId"); + + migrationBuilder.AddForeignKey( + name: "FK_PhaseSections_Skills_SkillId", + table: "PhaseSections", + column: "SkillId", + principalTable: "Skills", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ProjectSections_Skills_SkillId", + table: "ProjectSections", + column: "SkillId", + principalTable: "Skills", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_PhaseSections_Skills_SkillId", + table: "PhaseSections"); + + migrationBuilder.DropForeignKey( + name: "FK_ProjectSections_Skills_SkillId", + table: "ProjectSections"); + + migrationBuilder.DropIndex( + name: "IX_ProjectSections_SkillId", + table: "ProjectSections"); + + migrationBuilder.DropIndex( + name: "IX_PhaseSections_SkillId", + table: "PhaseSections"); + + } + } +} diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs index 8e4c3871..9ea2308c 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "10.0.0") + .HasAnnotation("ProductVersion", "10.0.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -102,56 +102,6 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations b.ToTable("Customers", (string)null); }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.HolidayAgg.Holiday", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("Year") - .IsRequired() - .HasMaxLength(4) - .HasColumnType("nvarchar(4)"); - - b.HasKey("Id"); - - b.ToTable("Holidays", (string)null); - }); - - modelBuilder.Entity("GozareshgirProgramManager.Domain.HolidayItemAgg.HolidayItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("bigint"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("CreationDate") - .HasColumnType("datetime2"); - - b.Property("HolidayId") - .HasColumnType("bigint"); - - b.Property("HolidayYear") - .IsRequired() - .HasMaxLength(4) - .HasColumnType("nvarchar(4)"); - - b.Property("Holidaydate") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("HolidayId"); - - b.ToTable("Holidayitems", (string)null); - }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b => { b.Property("Id") @@ -174,6 +124,8 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations b.HasIndex("PhaseId"); + b.HasIndex("SkillId"); + b.ToTable("PhaseSections"); }); @@ -284,6 +236,8 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations b.HasIndex("ProjectId"); + b.HasIndex("SkillId"); + b.ToTable("ProjectSections"); }); @@ -630,17 +584,6 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations b.ToTable("UserRefreshTokens", (string)null); }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.HolidayItemAgg.HolidayItem", b => - { - b.HasOne("GozareshgirProgramManager.Domain.HolidayAgg.Holiday", "Holidayss") - .WithMany("HolidayItems") - .HasForeignKey("HolidayId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Holidayss"); - }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b => { b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase") @@ -649,7 +592,14 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill") + .WithMany() + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.Restrict); + b.Navigation("Phase"); + + b.Navigation("Skill"); }); modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b => @@ -671,7 +621,14 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill") + .WithMany() + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.Restrict); + b.Navigation("Project"); + + b.Navigation("Skill"); }); modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b => @@ -856,11 +813,6 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations b.Navigation("User"); }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.HolidayAgg.Holiday", b => - { - b.Navigation("HolidayItems"); - }); - modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", b => { b.Navigation("Phases"); diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/PhaseSectionMapping.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/PhaseSectionMapping.cs index c1db7d49..1b4a829f 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/PhaseSectionMapping.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/PhaseSectionMapping.cs @@ -17,5 +17,11 @@ public class PhaseSectionMapping:IEntityTypeConfiguration .WithMany(p => p.PhaseSections) .HasForeignKey(ps => ps.PhaseId) .OnDelete(DeleteBehavior.Cascade); + + builder.HasOne(ps => ps.Skill) + .WithMany() + .HasForeignKey(ps => ps.SkillId) + .IsRequired(false) + .OnDelete(DeleteBehavior.Restrict); } } \ No newline at end of file diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/ProjectSectionMapping.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/ProjectSectionMapping.cs index ebc8df44..454ab86d 100644 --- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/ProjectSectionMapping.cs +++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/ProjectSectionMapping.cs @@ -16,5 +16,11 @@ public class ProjectSectionMapping:IEntityTypeConfiguration .WithMany(x => x.ProjectSections) .HasForeignKey(x => x.ProjectId) .OnDelete(DeleteBehavior.Cascade); + + builder.HasOne(x => x.Skill) + .WithMany() + .HasForeignKey(x => x.SkillId) + .IsRequired(false) + .OnDelete(DeleteBehavior.Restrict); } } \ No newline at end of file