From ceb328cfa7b2daa436087b4eefbaeb35c45c1b86 Mon Sep 17 00:00:00 2001 From: SamSys Date: Tue, 6 Jan 2026 15:28:12 +0330 Subject: [PATCH 1/2] Save AddOrEdit Jobs to group --- .../IClassificationGroupRepository.cs | 13 +++- .../IClassificationSchemeApplication.cs | 7 ++ .../ClassificationSchemeApplication.cs | 10 +++ .../ClassificationGroupRepository.cs | 68 +++++++++++++++++++ .../ClassificationSchemeController.cs | 12 +++- 5 files changed, 106 insertions(+), 4 deletions(-) diff --git a/Company.Domain/ClassificationSchemeAgg/IClassificationGroupRepository.cs b/Company.Domain/ClassificationSchemeAgg/IClassificationGroupRepository.cs index 8da1913a..5b76bab5 100644 --- a/Company.Domain/ClassificationSchemeAgg/IClassificationGroupRepository.cs +++ b/Company.Domain/ClassificationSchemeAgg/IClassificationGroupRepository.cs @@ -44,11 +44,18 @@ public interface IClassificationGroupRepository : IRepository CheckIfEmployeeHasThisJob(long jobId, long groupId); /// - /// دریافت مشاغل گروه توسط آی دی گروه + /// ذخیر ایجاد یا ویرایش مشاغل در گروه /// - /// + /// /// - Task> GetGroupJobs(long groupId); + Task SaveJobsToGroup(AddOrEditJobInGroupDto command); + + /// + /// دریافت مشاغل گروه توسط آی دی گروه + /// + /// + /// + Task> GetGroupJobs(long groupId); /// /// چک میکند که آی پرسنلی وجود دارد که این شغل به او نسبت داده شده diff --git a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs index f4da7501..4fc1d1a0 100644 --- a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs +++ b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs @@ -225,6 +225,13 @@ public interface IClassificationSchemeApplication /// Task CheckIfEmployeeHasThisJob(long jobId, long groupId); + + /// + /// ذخیر ایجاد یا ویرایش مشاغل در گروه + /// + /// + /// + Task SaveJobsToGroup(AddOrEditJobInGroupDto command); #endregion } \ No newline at end of file diff --git a/CompanyManagment.Application/ClassificationSchemeApplication.cs b/CompanyManagment.Application/ClassificationSchemeApplication.cs index 52184360..137594a8 100644 --- a/CompanyManagment.Application/ClassificationSchemeApplication.cs +++ b/CompanyManagment.Application/ClassificationSchemeApplication.cs @@ -633,4 +633,14 @@ public class ClassificationSchemeApplication : IClassificationSchemeApplication return op.Succcedded(-1, "حذف با موفقیت انجام شد"); } + + public async Task SaveJobsToGroup(AddOrEditJobInGroupDto command) + { + var op = new OperationResult(); + var res= await _classificationGroupRepository.SaveJobsToGroup(command); + if (!res) + return op.Failed("خطا در انجام عملیات"); + + return op.Succcedded(); + } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/ClassificationGroupRepository.cs b/CompanyManagment.EFCore/Repository/ClassificationGroupRepository.cs index 74c37171..4965d132 100644 --- a/CompanyManagment.EFCore/Repository/ClassificationGroupRepository.cs +++ b/CompanyManagment.EFCore/Repository/ClassificationGroupRepository.cs @@ -224,5 +224,73 @@ public class ClassificationGroupRepository : RepositoryBase x.ClassificationGroupJobId == id && x.ClassificationGroupId == groupId); } + + + public async Task SaveJobsToGroup(AddOrEditJobInGroupDto command) + { + var newJoblist = new List(); + var alreadyExitjobs = new List(); + var alreadyAdded = await _context.ClassificationGroups.Where(x => x.id == command.GroupId) + .Include(x => x.ClassificationGroupJobs).FirstOrDefaultAsync(); + if (command.AddJobListDto.Count > 0) + { + var addedJobsIds = command.AddJobListDto.Where(x => x.JobId > 0).Select(x => x.JobId).ToList(); + var getJobs = _context.Jobs.Where(x => addedJobsIds.Contains(x.id)); + + foreach (var item in getJobs) + { + + var newJob = new ClassificationGroupJob(item.id, item.JobName, item.JobCode, command.GroupId, + $"{command.GroupNoInt}"); + + if (alreadyAdded.ClassificationGroupJobs.Any(x => x.JobId == item.id)) + { + alreadyExitjobs.Add(newJob); + } + else + { + newJoblist.Add(newJob); + } + + } + } + + + if (alreadyAdded.ClassificationGroupJobs.Count == 0) + { + + if (command.AddJobListDto.Count > 0) + { + + await _context.ClassificationGroupJobs.AddRangeAsync(newJoblist); + await _context.SaveChangesAsync(); + } + } + else + { + + + + var alreadyExitJobsIds = alreadyExitjobs.Select(x => x.JobId).ToList(); + + var toBeRemove = alreadyAdded.ClassificationGroupJobs.Where(x => !alreadyExitJobsIds.Contains(x.JobId)) + .ToList(); + if (toBeRemove.Count > 0) + { + _context.ClassificationGroupJobs.RemoveRange(toBeRemove); + await _context.SaveChangesAsync(); + } + + + if (newJoblist.Count > 0) + { + await _context.ClassificationGroupJobs.AddRangeAsync(newJoblist); + await _context.SaveChangesAsync(); + } + + } + + return true; + } #endregion } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs b/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs index 3fd584eb..9d31c410 100644 --- a/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs @@ -149,6 +149,16 @@ public class ClassificationSchemeController : AdminBaseController return result; } - + /// + /// ذخیره افزودن یا ویرایش مشاغل گروه + /// + /// + /// + [HttpPost("SaveJobsToGroup")] + public async Task> SaveJobsToGroup(AddOrEditJobInGroupDto command) + { + var result = await _classificationSchemeApplication.SaveJobsToGroup(command); + return result; + } #endregion } \ No newline at end of file From 9ff9b0be1840b62551c9423ae07dca4bfb98735b Mon Sep 17 00:00:00 2001 From: SamSys Date: Tue, 6 Jan 2026 17:33:40 +0330 Subject: [PATCH 2/2] add salary list --- .../IClassificationGroupSalariesRepository.cs | 11 +++++ .../IClassificationSchemeApplication.cs | 7 +++ .../ClassificationSchemeApplication.cs | 10 ++++- .../ClassificationGroupSalariesRepository.cs | 44 +++++++++++++++++++ .../ClassificationSchemeController.cs | 19 ++++++++ 5 files changed, 90 insertions(+), 1 deletion(-) diff --git a/Company.Domain/ClassificationSchemeAgg/IClassificationGroupSalariesRepository.cs b/Company.Domain/ClassificationSchemeAgg/IClassificationGroupSalariesRepository.cs index fc026a2c..a1d4ed31 100644 --- a/Company.Domain/ClassificationSchemeAgg/IClassificationGroupSalariesRepository.cs +++ b/Company.Domain/ClassificationSchemeAgg/IClassificationGroupSalariesRepository.cs @@ -30,5 +30,16 @@ public interface IClassificationGroupSalariesRepository : IRepository /// Task GetSalariesTabData(long schemeId); + + + #region ForApi + /// + /// لیست دستمزدها بر اساس تاریخ و سال برای تب دستمزدها + /// + /// + /// + Task> GetSalaryList(long schemeId); + + #endregion } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs index 4fc1d1a0..35fd1596 100644 --- a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs +++ b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs @@ -232,6 +232,13 @@ public interface IClassificationSchemeApplication /// /// Task SaveJobsToGroup(AddOrEditJobInGroupDto command); + + /// + /// لیست دستمزدها بر اساس تاریخ و سال برای تب دستمزدها + /// + /// + /// + Task> GetSalaryList(long schemeId); #endregion } \ No newline at end of file diff --git a/CompanyManagment.Application/ClassificationSchemeApplication.cs b/CompanyManagment.Application/ClassificationSchemeApplication.cs index 137594a8..7089d810 100644 --- a/CompanyManagment.Application/ClassificationSchemeApplication.cs +++ b/CompanyManagment.Application/ClassificationSchemeApplication.cs @@ -603,6 +603,7 @@ public class ClassificationSchemeApplication : IClassificationSchemeApplication } + #region ForApi public async Task DeleteScheme(long id) { @@ -637,10 +638,17 @@ public class ClassificationSchemeApplication : IClassificationSchemeApplication public async Task SaveJobsToGroup(AddOrEditJobInGroupDto command) { var op = new OperationResult(); - var res= await _classificationGroupRepository.SaveJobsToGroup(command); + var res = await _classificationGroupRepository.SaveJobsToGroup(command); if (!res) return op.Failed("خطا در انجام عملیات"); return op.Succcedded(); } + + public async Task> GetSalaryList(long schemeId) + { + return await _classificationGroupSalariesRepository.GetSalaryList(schemeId); + } + + #endregion } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs b/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs index 997fc970..35d2c38c 100644 --- a/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs +++ b/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs @@ -139,5 +139,49 @@ public class ClassificationGroupSalariesRepository : RepositoryBase> GetSalaryList(long schemeId) + { + var scheme = await _context.ClassificationSchemes.AsSplitQuery().Include(xc => xc.ClassificationRialCoefficients) + .Include(xg => xg.ClassificationGroups) + .ThenInclude(xs => xs.ClassificationGroupSalaries) + .FirstOrDefaultAsync(x => x.id == schemeId); + + if (scheme == null) + return null; + + // جمع‌آوری همه‌ی حقوق‌ها از تمام گروه‌ها + var allSalaries = scheme.ClassificationGroups + .SelectMany(g => g.ClassificationGroupSalaries) + .ToList(); + + // اگر هیچ حقوقی وجود ندارد + if (!allSalaries.Any()) + { + return new List(); + } + + // گروه‌بندی بر اساس StartDate و EndDate برای حذف موارد تکراری + var distinctPeriods = allSalaries + .GroupBy(s => new { s.StartDate, s.EndDate }) + .Select(g => g.First()) // فقط یکی از هر بازه تاریخ + .OrderByDescending(x => x.StartDate) + .ToList(); + + //تبدیل به مدل خروجی + var dataList = distinctPeriods + .Select(s => new SalaryAndRialCoefficientTabDataList + { + RialCoefficientStr = $"{scheme.ClassificationRialCoefficients.FirstOrDefault(x => x.StartDate.Date == s.StartDate.Date && x.EndDate.Date == s.EndDate.Date)?.RialCoefficient}", + StartDateFa = s.StartDate.ToFarsi(), + EndDateFa = s.EndDate.ToFarsi(), + Year = s.Year + }) + .ToList(); + + return dataList; + } + + #endregion } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs b/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs index 9d31c410..1b653718 100644 --- a/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs +++ b/ServiceHost/Areas/Admin/Controllers/ClassificationSchemeController.cs @@ -23,6 +23,7 @@ public class ClassificationSchemeController : AdminBaseController _jobApplication = jobApplication; } + // تب لیست طرح #region SchemeTab /// @@ -100,6 +101,7 @@ public class ClassificationSchemeController : AdminBaseController #endregion + // تب تعیین مشاغل گروه #region GroupsTab /// /// دریافت لیست گروه ها @@ -161,4 +163,21 @@ public class ClassificationSchemeController : AdminBaseController return result; } #endregion + + //تب تعیین دستمزد + #region SalariesTab + + /// + /// دریافت لیست دستمزدها + /// + /// + /// + [HttpGet("GetSalariesList")] + public async Task> GetSalariesList(long schemeId) + { + var result =await _classificationSchemeApplication.GetSalaryList(schemeId); + return result; + } + + #endregion } \ No newline at end of file