From 10e740061107fafb5705b81754035f63ff5e56e6 Mon Sep 17 00:00:00 2001 From: SamSys Date: Sun, 2 Nov 2025 19:11:04 +0330 Subject: [PATCH] test moda completed --- 0_Framework/Application/Tools.cs | 29 ++ .../IClassificationSchemeRepository.cs | 16 +- .../AddEmployeeToGroup.cs | 2 +- .../ClassificationScheme/EmployeeInfoTab.cs | 2 + .../IClassificationSchemeApplication.cs | 17 + .../ClassificationSchemeApplication.cs | 8 + .../ClassificationGroupSalariesRepository.cs | 17 +- .../ClassificationSchemeRepository.cs | 462 +++++++++++++++++- .../Workshops/ClassificationScheme.cshtml.cs | 144 +++++- .../ClassificationSchemeTab.cshtml | 25 +- .../_ClassificationPartials/TestScheme.cshtml | 386 +++++++++++++++ ServiceHost/appsettings.Development.json | 4 +- 12 files changed, 1087 insertions(+), 25 deletions(-) create mode 100644 ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/TestScheme.cshtml diff --git a/0_Framework/Application/Tools.cs b/0_Framework/Application/Tools.cs index 98f58bb9..746529f9 100644 --- a/0_Framework/Application/Tools.cs +++ b/0_Framework/Application/Tools.cs @@ -33,6 +33,35 @@ public static class Tools public static string[] DayNames = { "شنبه", "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه" }; public static string[] DayNamesG = { "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه", "شنبه" }; + /// + /// نام ستون از جدول مزد سنوات طبثه بندی را میگیرد و دیتای داخل آن ستون را برمیگرداند + /// + /// + /// + /// + public static double? GetDynamicDouble(object obj, string propertyName) + { + if (obj == null || string.IsNullOrWhiteSpace(propertyName)) + return null; + + var propertyInfo = obj.GetType().GetProperty(propertyName); + if (propertyInfo == null) + return null; + + var value = propertyInfo.GetValue(obj); + if (value == null) + return null; + + try + { + return Convert.ToDouble(value); + } + catch + { + return null; + } + } + public static bool IsMobileValid(this string mobileNo) { diff --git a/Company.Domain/ClassificationSchemeAgg/IClassificationSchemeRepository.cs b/Company.Domain/ClassificationSchemeAgg/IClassificationSchemeRepository.cs index 0b996745..ad4b43e9 100644 --- a/Company.Domain/ClassificationSchemeAgg/IClassificationSchemeRepository.cs +++ b/Company.Domain/ClassificationSchemeAgg/IClassificationSchemeRepository.cs @@ -1,6 +1,8 @@ using _0_Framework.Application; using _0_Framework.Domain; using CompanyManagment.App.Contracts.ClassificationScheme; +using CompanyManagment.App.Contracts.YearlySalary; +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -24,5 +26,17 @@ public interface IClassificationSchemeRepository : IRepository GetClassificationScheme(long id); - + /// + /// متد محاسبه پایه سنوات برا افراد تک گروه + /// + /// تاریخ شروع طرح + /// تاریخ پاین طرح، اجباری نیست + /// تاریخ شروع قراداد + /// تاریخ پایان قراداد + /// شماره گروه + /// آی دی پرسنل + /// آی دی کارگاه + /// + Task BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd, + DateTime contractStart, DateTime contractEnd, string groupNo, long employeeId, long workshopId); } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/ClassificationScheme/AddEmployeeToGroup.cs b/CompanyManagment.App.Contracts/ClassificationScheme/AddEmployeeToGroup.cs index 3b956a37..3e8b495f 100644 --- a/CompanyManagment.App.Contracts/ClassificationScheme/AddEmployeeToGroup.cs +++ b/CompanyManagment.App.Contracts/ClassificationScheme/AddEmployeeToGroup.cs @@ -35,7 +35,7 @@ public class AddEmployeeToGroup /// /// شماره گروه /// - public long GoroupNo { get; set; } + public string GoroupNo { get; set; } /// /// آی دی شغل diff --git a/CompanyManagment.App.Contracts/ClassificationScheme/EmployeeInfoTab.cs b/CompanyManagment.App.Contracts/ClassificationScheme/EmployeeInfoTab.cs index bf40f427..a2f9cd5e 100644 --- a/CompanyManagment.App.Contracts/ClassificationScheme/EmployeeInfoTab.cs +++ b/CompanyManagment.App.Contracts/ClassificationScheme/EmployeeInfoTab.cs @@ -32,6 +32,8 @@ public class EmployeeInfoTab /// لیست پرسنل /// public List EmployeeInfoList { get; set; } + + public List YearlyList { get; set; } } /// diff --git a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs index 75c55730..9c9234bb 100644 --- a/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs +++ b/CompanyManagment.App.Contracts/ClassificationScheme/IClassificationSchemeApplication.cs @@ -1,5 +1,7 @@ using _0_Framework.Application; using CompanyManagment.App.Contracts.TemporaryClientRegistration; +using CompanyManagment.App.Contracts.YearlySalary; +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -147,4 +149,19 @@ public interface IClassificationSchemeApplication /// Task GetEmployeeMemberizeData(long employeeId); + + /// + /// متد محاسبه پایه سنوات برا افراد تک گروه + /// + /// تاریخ شروع طرح + /// تاریخ پاین طرح، اجباری نیست + /// تاریخ شروع قراداد + /// تاریخ پایان قراداد + /// شماره گروه + /// آی دی پرسنل + /// آی دی کارگاه + /// + Task BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd, + DateTime contractStart, DateTime contractEnd, string groupNo, long employeeId, long workshopId); + } \ No newline at end of file diff --git a/CompanyManagment.Application/ClassificationSchemeApplication.cs b/CompanyManagment.Application/ClassificationSchemeApplication.cs index 6bfe8b37..9140b7e4 100644 --- a/CompanyManagment.Application/ClassificationSchemeApplication.cs +++ b/CompanyManagment.Application/ClassificationSchemeApplication.cs @@ -6,6 +6,7 @@ using _0_Framework.Application; using _0_Framework.Application.Enums; using Company.Domain.ClassificationSchemeAgg; using CompanyManagment.App.Contracts.ClassificationScheme; +using CompanyManagment.App.Contracts.YearlySalary; using Microsoft.EntityFrameworkCore; namespace CompanyManagment.Application; @@ -397,4 +398,11 @@ public class ClassificationSchemeApplication : IClassificationSchemeApplication } + + public async Task BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd, DateTime contractStart, DateTime contractEnd, + string groupNo, long employeeId, long workshopId) + { + return await _classificationSchemeRepository.BaseYearComputeOneGroup(schemeStart, schemeEnd, contractStart, + contractEnd, groupNo, employeeId, workshopId); + } } \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs b/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs index b3c666d3..e397c5e5 100644 --- a/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs +++ b/CompanyManagment.EFCore/Repository/ClassificationGroupSalariesRepository.cs @@ -51,14 +51,25 @@ public class ClassificationGroupSalariesRepository : RepositoryBase x.SchemeId == schemeId && x.StartDate == startDatGr).Select(x => new EditClassificationGroupSalaryAndRialCoefficient { Id = x.id, ClassificationGroupId = x.ClassificationGroupId, GroupNo = x.GroupNo, - GroupSalaryStr = x.GroupSalary.ToMoney() + GroupSalaryStr = x.GroupSalary.ToMoney(), + GroupSalary = x.GroupSalary + }) .ToList(); } diff --git a/CompanyManagment.EFCore/Repository/ClassificationSchemeRepository.cs b/CompanyManagment.EFCore/Repository/ClassificationSchemeRepository.cs index 64944f07..1707ef00 100644 --- a/CompanyManagment.EFCore/Repository/ClassificationSchemeRepository.cs +++ b/CompanyManagment.EFCore/Repository/ClassificationSchemeRepository.cs @@ -6,7 +6,10 @@ using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.ClassificationSchemeAgg; using CompanyManagment.App.Contracts.ClassificationScheme; +using CompanyManagment.App.Contracts.LeftWork; +using CompanyManagment.App.Contracts.YearlySalary; using Microsoft.EntityFrameworkCore; +using PersianTools.Core; namespace CompanyManagment.EFCore.Repository; @@ -78,5 +81,462 @@ public class ClassificationSchemeRepository :RepositoryBase x.Id == id); } - + /// + /// متد محاسبه پایه سنوات برا افراد تک گروه + /// + /// تاریخ شروع طرح + /// تاریخ پاین طرح، اجباری نیست + /// تاریخ شروع قراداد + /// تاریخ پایان قراداد + /// شماره گروه + /// آی دی پرسنل + /// آی دی کارگاه + /// + public async Task BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd, + DateTime contractStart, DateTime contractEnd, string groupNo, long employeeId, long workshopId) + { + //خروجی متد + var baseYearResult = new BaseYearDataViewModel(); + baseYearResult.WorkshopId = workshopId; + baseYearResult.EmployeeId = employeeId; + + + + //لیست شروع بکار / ترک کار پرسنل + var leftWorkList = await _context.LeftWorkList + .Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId).Select(x=> new LeftWorkViewModel + { + Id = x.id, + StartWorkDateGr = x.StartWorkDate, + StartWorkDate = x.StartWorkDate.ToFarsi(), + LeftWorkDateGr = x.LeftWorkDate, + HasLeft = x.HasLeft, + }).OrderBy(x=>x.StartWorkDateGr).ToListAsync(); + //اولین شروع بکار + var firstStartWorkDate = leftWorkList.First().StartWorkDateGr; + var firstStartWork = leftWorkList.First().StartWorkDate; + //اگر شروع طرح بعد از اولین شروع بکار بود + if (schemeStart > firstStartWorkDate) + { + var leftWorkStart = leftWorkList.FirstOrDefault(x => x.StartWorkDateGr <= schemeStart && x.LeftWorkDateGr > schemeStart); + + if (leftWorkStart != null) + { + //اگر تاریخ شروع طرح بین بازه اولین شروع بکار و ترک کار قرار گرفت + if (leftWorkStart.StartWorkDateGr == firstStartWorkDate) + { + var changedLeftwork = new LeftWorkViewModel() + { + Id = leftWorkStart.Id, + StartWorkDateGr = schemeStart, + StartWorkDate = schemeStart.ToFarsi(), + LeftWorkDateGr = leftWorkStart.LeftWorkDateGr, + HasLeft = leftWorkStart.HasLeft, + }; + + leftWorkList.Remove(leftWorkStart); + leftWorkList.Add(changedLeftwork); + firstStartWork = schemeStart.ToFarsi(); + } + else //اگر تاریخ شروع طرح در بازه شروع به ترک کارهایی بعد از اولین قرارگرفت + { + //لیست شروع بکار/ ترک کارهایی که باید حذف شوند + var leftWorksToBeRemove = leftWorkList.Where(x => x.StartWorkDateGr < leftWorkStart.StartWorkDateGr) + .ToList(); + foreach (var item in leftWorksToBeRemove.ToList()) + { + leftWorkList.Remove(item); + } + + var changedLeftwork = new LeftWorkViewModel() + { + Id = leftWorkStart.Id, + StartWorkDateGr = schemeStart, + StartWorkDate = schemeStart.ToFarsi(), + LeftWorkDateGr = leftWorkStart.LeftWorkDateGr, + HasLeft = leftWorkStart.HasLeft, + }; + firstStartWork = schemeStart.ToFarsi(); + leftWorkList.Remove(leftWorkStart); + leftWorkList.Add(changedLeftwork); + } + + } + else //اگر شروع طرح در فاصله بین شروع بکار/ترک کارها بود + { + //لیست شروع بکار/ ترک کارهایی که باید حذف شوند + var leftWorksToBeRemove = leftWorkList.Where(x => x.StartWorkDateGr < schemeStart) + .ToList(); + foreach (var item in leftWorksToBeRemove.ToList()) + { + leftWorkList.Remove(item); + } + + leftWorkList = leftWorkList.OrderBy(x => x.StartWorkDateGr).ToList(); + firstStartWork = leftWorkList.First().StartWorkDate; + + } + } + //مرتب سازی + leftWorkList = leftWorkList.OrderBy(x => x.StartWorkDateGr).ToList(); + + + //مقادیر سالانه + var salary = await _context.YearlySalaries.OrderByDescending(x => x.EndDate).Include(x => x.YearlySalaryItemsList).ToListAsync(); + + //مزد سنوات طبقه بندی + var classifiedBaseYearList =await _context.ClassifiedSalaries.ToListAsync(); + + //آیا در حلقه کبیشه بودن چک شود + bool checkKabiseh = true; + var isKabiseh = false; + var EndOfYaerDate = new DateTime(); + //لیست تاریخ هایی که پایه سنوات تعلق گرفته + var baseYearDateList = new List(); + + double baseYear = 0; + + //اگر تاریخ پایان طرح خالی نبود + if (schemeEnd.HasValue) + { + //اگر تاریخ پایان طرخ از تاریخ پایان قرارداد کوچکتر بود + //در نتیجه تاریخ پاینه محاسبات همان پایان طرح است + if (schemeEnd.Value < contractEnd) + contractEnd = schemeEnd.Value; + } + + //اگر فقط یک شروع بکار داشت + if (leftWorkList.Count < 2) + { + var leftWork = leftWorkList.First(); + //اگر ترک کار کرده بود پایان چرخه تاریخ آخرین روز کاری اوست + var endComputeDate = leftWork.HasLeft && leftWork.LeftWorkDateGr <= contractEnd ? leftWork.LeftWorkDateGr.AddDays(-1) : contractEnd; + //شروع چرخه شروع بکار پرسنل + var startComputeDate = leftWork.StartWorkDateGr; + + + for (var current = startComputeDate; current <= endComputeDate; current = current.AddDays(1)) + { + var currentChanges = new DateTime(current.Year, current.Month, current.Day); + + if (checkKabiseh) + { + + isKabiseh = ($"{current.ToFarsi()}").YearTotalDays() == 367 ? true : false; + string kabise = ""; + if (isKabiseh) + kabise = "kabise"; + var currentChangesPc = currentChanges.ToPersianDateTime(); + EndOfYaerDate = isKabiseh ? ($"{currentChangesPc.AddDays(365)}").ToGeorgianDateTime() : ($"{currentChangesPc.AddDays(364)}").ToGeorgianDateTime(); + Console.WriteLine($" start : {current.ToFarsi()} {kabise}"); + } + + checkKabiseh = false; + if (current == EndOfYaerDate) + { + + + + var a = current.AddDays(1); + if (a <= endComputeDate) + { + checkKabiseh = true; + baseYearDateList.Add(a); + Console.WriteLine($" End : {a.ToFarsi()}"); + } + + } + + + } + } + else //اگر بیش از یک شروع بکار داشت + { + int max365 = 0; + int dayCounter = 0; + bool hasCute = false; + foreach (var leftWork in leftWorkList) + { + //اگر ترک کار کرده بود پایان چرخه تاریخ آخرین روز کاری اوست + var endComputeDate = leftWork.HasLeft && leftWork.LeftWorkDateGr <= contractEnd ? leftWork.LeftWorkDateGr.AddDays(-1) : contractEnd; + //شروع چرخه شروع بکار پرسنل + var startComputeDate = leftWork.StartWorkDateGr; + + for (var current = startComputeDate; current <= endComputeDate; current = current.AddDays(1)) + { + + if (checkKabiseh && dayCounter == 0) + { + + isKabiseh = ($"{current.ToFarsi()}").YearTotalDays() == 367 ? true : false; + string kabise = ""; + if (isKabiseh) + kabise = "kabise"; + + max365 = isKabiseh ? 366 : 365; + Console.WriteLine($" start : {current.ToFarsi()} {kabise}"); + } + + dayCounter += 1; + checkKabiseh = false; + + if (dayCounter == max365) + { + + var a = !hasCute ? current.AddDays(1) : current; + if (a <= endComputeDate) + { + checkKabiseh = true; + baseYearDateList.Add(a); + Console.WriteLine($" End : {a.ToFarsi()}"); + Console.WriteLine(dayCounter); + if (hasCute) + { + dayCounter = 1; + isKabiseh = ($"{current.ToFarsi()}").YearTotalDays() == 367 ? true : false; + max365 = isKabiseh ? 366 : 365; + + string kabise = ""; + if (isKabiseh) + kabise = "kabise"; + Console.WriteLine($" start : {current.ToFarsi()} {kabise}"); + } + else + { + dayCounter = 0; + } + hasCute = false; + } + else + { + hasCute = true; + max365 += 1; + } + + + + + + } + + } + + } + } + + double selectBase = 0; + var baseList = new List<(double baseYaer, DateTime start, DateTime end, string baseYearPay, DateTime baseYearPayGr, string year, bool hasStartWork, bool hasLeftWork)>(); + + + if (baseYearDateList.Count > 0) + { + var firstBaseYearDate = baseYearDateList.First(); + var res = MonthByMonthList(firstBaseYearDate, contractEnd); + var firstbasicSalari = + salary.FirstOrDefault(x => x.StartDate <= firstBaseYearDate && x.EndDate >= firstBaseYearDate); + var firstClassifiedBaseYear = classifiedBaseYearList.FirstOrDefault(x => x.StartDate <= firstBaseYearDate && x.EndDate >= firstBaseYearDate); + + //پایه سنوات سال جاری + var firstBasicObject = Tools.GetDynamicDouble(firstClassifiedBaseYear, $"Group{groupNo}"); + double firstBasic = firstBasicObject != null ? firstBasicObject.Value : 0; + var firstfixFeePercentage = firstbasicSalari + .YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault(); + + // پایه سنوات سال قبل ضربدر درصد مزد ثابت تقسیم بر صد + //var beforePercntBaseYear = ((beforBaseStart * firstfixFeePercentage) / 100) + beforBaseStart; + //firstBasic += beforePercntBaseYear; + baseYear = firstBasic; + res = res.Where(x => x.start != firstBaseYearDate).OrderBy(x => x.start).ToList(); + //var afterSalary = salary.Where(x => x.StartDate > firstbasicSalari.EndDate).ToList(); + + + var first = (firstBasic, firstbasicSalari.StartDate, firstbasicSalari.EndDate, firstBaseYearDate.ToFarsi(), firstBaseYearDate, firstbasicSalari.Year, false, false); + baseList.Add(first); + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine($"{1398} -> firstBasic : {firstBasic}"); + var lastItem = res.Count > 1 ? res.Last() : res.FirstOrDefault(); + foreach (var item in res) + { + var lastReecord = baseList.Last(); + var year = Convert.ToInt32(item.start.ToFarsi().Substring(0, 4)); + if (item.start > lastReecord.end && lastReecord.year != $"{year}") + { + + + var selectedSalary = salary.Where(x => x.Year == $"{year}").OrderBy(x => x.StartDate).ToList(); + var currentSalary = selectedSalary.First(); + if (selectedSalary.Count > 1) + { + currentSalary = selectedSalary.Last(); + var firstSalery = selectedSalary.First(); + if (baseYearDateList.Any(x => x >= firstSalery.StartDate && x <= firstSalery.EndDate) || lastItem.end < currentSalary.StartDate) + { + currentSalary = firstSalery; + } + + } + + var selectedBaseYear = classifiedBaseYearList.Where(x => x.Year == year).OrderBy(x => x.StartDate).ToList(); + var currentBaseYear = selectedBaseYear.First(); + if (selectedBaseYear.Count > 1) + { + currentBaseYear = selectedBaseYear.Last(); + var firstBaseYear = selectedBaseYear.First(); + if (baseYearDateList.Any(x => x >= firstBaseYear.StartDate && x <= firstBaseYear.EndDate) || lastItem.end < currentBaseYear.StartDate) + { + currentBaseYear = firstBaseYear; + } + } + + //درصد مزد ثابت تاریخ جاری + var fixFeePercentage = currentSalary + .YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault(); + + // پایه سنوات سال قبل ضربدر درصد مزد ثابت تقسیم بر صد + var percntBaseYear = ((lastReecord.baseYaer * fixFeePercentage) / 100) + lastReecord.baseYaer; + Console.ForegroundColor = ConsoleColor.Green; + + var currentBasicObject = Tools.GetDynamicDouble(currentBaseYear, $"Group{groupNo}"); + double currentBasic = currentBasicObject != null ? currentBasicObject.Value : 0; + //var currentBasic = currentSalary + // .YearlySalaryItemsList.Where(x => x.ItemName == "پایه سنوات").Select(x => x.ItemValue).FirstOrDefault(); + Console.WriteLine($"{year} -> [{lastReecord.baseYaer} * {fixFeePercentage} /100 + {lastReecord.baseYaer}] = {percntBaseYear} => [{currentBasic} + {percntBaseYear}] = {currentBasic + percntBaseYear} "); + + if (!baseYearDateList.Any(x => x >= currentBaseYear.StartDate && x <= currentBaseYear.EndDate)) + currentBasic = 0; + + var currentBase = currentBasic + percntBaseYear; + + baseYear = currentBase; + var baseYearPay = "-"; + var baseYearPayDayGr = new DateTime(); + if (baseYearDateList.Any(x => x >= currentBaseYear.StartDate && x <= currentBaseYear.EndDate)) + { + var existBaseYear = baseYearDateList.FirstOrDefault(x => x >= currentBaseYear.StartDate && x <= currentBaseYear.EndDate); + baseYearPay = existBaseYear.ToFarsi(); + baseYearPayDayGr = new DateTime(existBaseYear.Year, existBaseYear.Month, existBaseYear.Day, 17, 01, 01); + } + else + { + baseYearPayDayGr = new DateTime(item.start.Year, item.start.Month, item.start.Day, 17, 01, 01); + + } + + + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine(baseYearPay); + Console.ResetColor(); + + // var round = GetCurrectFirstDailyFee(currentBase, $"{year}"); + var record = (baseYear, currentSalary.StartDate, currentSalary.EndDate, baseYearPay, baseYearPayDayGr, currentSalary.Year, false, false); + baseList.Add(record); + + + + } + + } + Console.ResetColor(); + + + + } + + selectBase = baseList.Any() ? baseList.Last().baseYaer : 0; + //افزودن تاریخ های شروع بکار و ترک کار به لیست + foreach (var left in leftWorkList) + { + var startWork = (0, new DateTime(), new DateTime(), left.StartWorkDateGr.ToFarsi(), left.StartWorkDateGr, "-", true, false); + baseList.Add(startWork); + + if (left.HasLeft) + { + var leftWork = (0, new DateTime(), new DateTime(), left.LeftWorkDateGr.ToFarsi(), left.LeftWorkDateGr, "-", false, true); + baseList.Add(leftWork); + } + + + } + + + baseYearResult = new BaseYearDataViewModel() + { + WorkshopId = workshopId, + EmployeeId = employeeId, + BaseYearResult = selectBase, + FirstWorkDayInLeftWork = firstStartWork, + BaseYearDataList = baseList.Select(x => new BaseYearDataList() + { + BaseYear = x.baseYaer, + + StartDateGr = x.start, + EndDateGr = x.end, + BaseYearPayDay = x.baseYearPay, + BaseYearPayDayGr = x.baseYearPayGr, + StartDateFa = x.start.ToFarsi(), + EndDateFa = x.end.ToFarsi(), + Year = x.year, + HasLeftWork = x.hasLeftWork, + HasStartWork = x.hasStartWork, + }).OrderBy(x => x.BaseYearPayDayGr).ToList(), + + }; + Console.WriteLine("BaseYear : " + selectBase); + return baseYearResult; + } + + + /// + /// متد کمکی پایه سنوات + /// + /// + /// + /// + private List<(DateTime start, DateTime end)> MonthByMonthList(DateTime startDate, DateTime endDate) + { + + var start = startDate.ToFarsi(); + var end = endDate.ToFarsi(); + var ContractPreiodsList = new List<(DateTime start, DateTime end)>(); + + + var syear = Convert.ToInt32(start.Substring(0, 4)); + var smonth = Convert.ToInt32(start.Substring(5, 2)); + var sday = Convert.ToInt32(start.Substring(8, 2)); + + var eyear = Convert.ToInt32(end.Substring(0, 4)); + var emonth = Convert.ToInt32(end.Substring(5, 2)); + var eday = Convert.ToInt32(end.Substring(8, 2)); + + var PersianStartDate = new PersianDateTime(syear, smonth, sday); + var PersianStartDateAddingMount = new PersianDateTime(syear, smonth, 1); + var PersianEndDate = new PersianDateTime(eyear, emonth, eday); + + + + var totalmonth = ((PersianEndDate.Year - PersianStartDateAddingMount.Year) * 12) + (PersianEndDate.Month - PersianStartDateAddingMount.Month) + 1; + for (int i = 0; i < totalmonth; i++) + { + + + var currentEndDate = PersianStartDateAddingMount.AddMonths(1).AddDays(-1); + if (currentEndDate > PersianEndDate) + { + currentEndDate = PersianEndDate; + } + + DateTime startPeriod = ($"{PersianStartDate}").ToGeorgianDateTime(); + DateTime endPeriod = ($"{currentEndDate}").ToGeorgianDateTime(); + var record = (startPeriod, endPeriod); + ContractPreiodsList.Add(record); + //Console.WriteLine($"Month {i + 1} : {PersianStartDate.ToString("yyyy-MM-dd")} to {currentEndDate.ToString("yyyy-MM-dd")}"); + + PersianStartDate = PersianStartDate.AddMonths(1); + PersianStartDate = new PersianDateTime(PersianStartDate.Year, PersianStartDate.Month, 1); + + + } + + return ContractPreiodsList; + } } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/ClassificationScheme.cshtml.cs b/ServiceHost/Areas/Admin/Pages/Company/Workshops/ClassificationScheme.cshtml.cs index 8e546626..72d4eebe 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Workshops/ClassificationScheme.cshtml.cs +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/ClassificationScheme.cshtml.cs @@ -1,7 +1,11 @@ -using Company.Domain.ClassificationSchemeAgg; +using _0_Framework.Application; +using _0_Framework.Application.Enums; +using Company.Domain.ClassificationSchemeAgg; using CompanyManagment.App.Contracts.ClassificationScheme; using CompanyManagment.App.Contracts.Job; using CompanyManagment.App.Contracts.Workshop; +using CompanyManagment.App.Contracts.YearlySalary; +using CompanyManagment.EFCore.Migrations; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -14,11 +18,13 @@ public class ClassificationSchemeModel : PageModel { private readonly IClassificationSchemeApplication _classificationSchemeApplication; private readonly IJobApplication _jobApplication; + private readonly IYearlySalaryApplication _yearlySalaryApplication; - public ClassificationSchemeModel(IClassificationSchemeApplication classificationSchemeApplication, IJobApplication jobApplication) + public ClassificationSchemeModel(IClassificationSchemeApplication classificationSchemeApplication, IJobApplication jobApplication, IYearlySalaryApplication yearlySalaryApplication) { _classificationSchemeApplication = classificationSchemeApplication; _jobApplication = jobApplication; + _yearlySalaryApplication = yearlySalaryApplication; } /// @@ -110,7 +116,7 @@ public class ClassificationSchemeModel : PageModel //تب تعیین مشاغل #region GroupJobsTab - + /// /// تب تعیین مشاغل گروه /// @@ -135,7 +141,7 @@ public class ClassificationSchemeModel : PageModel model.GroupNo = groupNo; model.EditClassificationGroupJob = _classificationSchemeApplication.GetGroupJobs(groupId).GetAwaiter().GetResult(); - + return Partial("_ClassificationPartials/CreateOrEditGroupJobs", model); } @@ -168,7 +174,7 @@ public class ClassificationSchemeModel : PageModel /// بررسی امکان حذف شغل /// /// - public IActionResult OnGetCheckDeleteJob(long id,long groupId) + public IActionResult OnGetCheckDeleteJob(long id, long groupId) { var checkExist = _classificationSchemeApplication.CheckEmployeeHasThisJob(id, groupId).GetAwaiter().GetResult(); @@ -201,7 +207,7 @@ public class ClassificationSchemeModel : PageModel #region SalariesTab - + /// /// چک میکند که آیا گروه بدون شغل وجود دارد یا نه @@ -221,11 +227,11 @@ public class ClassificationSchemeModel : PageModel // حالا می‌تونی بررسی کنی آیا گروهی بدون Job وجود دارد یا نه: bool hasEmptyGroup = hasJobsList.Contains(false); - // bool hasEmptyGroup = groupAndJobs.Any(g => g.EditClassificationGroupJob == null || g.EditClassificationGroupJob.Count == 0); - return new JsonResult(new - { - hasEmptyGroup = hasEmptyGroup, - }); + // bool hasEmptyGroup = groupAndJobs.Any(g => g.EditClassificationGroupJob == null || g.EditClassificationGroupJob.Count == 0); + return new JsonResult(new + { + hasEmptyGroup = hasEmptyGroup, + }); } /// @@ -324,11 +330,11 @@ public class ClassificationSchemeModel : PageModel FullName = fullName, }; var result = _classificationSchemeApplication.GetEmployeeDataTab(command).GetAwaiter().GetResult(); - if(result.EmployeeInfoList == null || !result.EmployeeInfoList.Any()) + if (result.EmployeeInfoList == null || !result.EmployeeInfoList.Any()) return new JsonResult(new { hasEmployee = false - + }); var personnelList = result.EmployeeInfoList.OrderBy(x => x.Black ? 1 : 0); @@ -368,7 +374,7 @@ public class ClassificationSchemeModel : PageModel /// public IActionResult OnPostAddToGroup(AddEmployeeToGroup command) { - + var result = _classificationSchemeApplication.AddEmployeeToGroup(command).GetAwaiter().GetResult(); if (!result.IsSuccedded) { @@ -449,4 +455,114 @@ public class ClassificationSchemeModel : PageModel #endregion + + //تست طرح + #region TestScheme + + /// + /// لود مودال تست + /// + /// + /// + public IActionResult OnGetTestScheme(long schemeId) + { + var command = new EmployeeInfoTab + { + SchemeId = schemeId, + + }; + var result = _classificationSchemeApplication.GetEmployeeDataTab(command).GetAwaiter().GetResult(); + + var employeeWithGroup = result.EmployeeInfoList.Where(x => x.HasGroup).ToList(); + var years = + _yearlySalaryApplication.GetYears(); + var model = new EmployeeInfoTab() + { + SchemeId = schemeId, + EmployeeInfoList = employeeWithGroup, + YearlyList = years + }; + + return Partial("_ClassificationPartials/TestScheme", model); + } + + /// + /// متد محاسبه تست + /// + /// + /// + /// + /// + /// + public IActionResult OnGetComputeTest(long schemeId, long employeeId, string year, string month) + { + var scheme = _classificationSchemeApplication.GetClassificationScheme(schemeId).GetAwaiter().GetResult(); + var typeOfCoefficient = scheme.TypeOfCoefficient; + + var startDate = $"{year}/{month}/01"; + var endDate = startDate.FindeEndOfMonth(); + var startDateGr = startDate.ToGeorgianDateTime(); + var endDateGr = endDate.ToGeorgianDateTime(); + double salaryResult = 0; + double salary = 0; + double coefficient = 0; + double rate = 0; + string mathModel = ""; + var employeeMemberizeData = _classificationSchemeApplication.GetEmployeeMemberizeData(employeeId).GetAwaiter().GetResult(); + + var groupId = employeeMemberizeData.GroupId; + var group = _classificationSchemeApplication.GetGroups(schemeId).GetAwaiter().GetResult(); + var groupNo = group.FirstOrDefault(x => x.GroupId == groupId)!.GroupNo; + var groupSalaryData = _classificationSchemeApplication.GetEditSalariesData(schemeId, startDate, endDate).GetAwaiter() + .GetResult(); + + var salaryData = groupSalaryData.SalariesAndCoefficientList.FirstOrDefault(x => x.GroupNo == groupNo); + if (salaryData != null) + { + salary = salaryData.GroupSalary; + coefficient = groupSalaryData.RialCoefficient; + } + + if (typeOfCoefficient != TypeOfCoefficient.RialCoefficient) + { + coefficient = 0; + } + + rate = ClassificationRangeOfGroupRate.GetGroupDistanceRate(groupNo).DistanceRate; + + if (groupNo != "1") + { + salaryResult = (coefficient * rate) + salary; + + mathModel = $"{salaryResult} = {salary} + ( x {rate} {coefficient} )"; + } + else + { + salaryResult = salary; + + } + + var baseYearResult = _classificationSchemeApplication.BaseYearComputeOneGroup(scheme.ExecutionDateGr, + scheme.EndSchemeDateGr, startDateGr, endDateGr, groupNo, employeeId, scheme.WorkshopId).GetAwaiter().GetResult(); + var baseYearResultFa = baseYearResult.BaseYearResult > 0 ? baseYearResult.BaseYearResult.ToMoney() : "0"; + var salaryResultFa = salaryResult.ToMoney(); + + double baseYearResultRound = baseYearResultFa != "0" ? baseYearResultFa.MoneyToDouble() : 0; + double salaryResultRound = salaryResultFa.MoneyToDouble(); + + return new JsonResult(new + { + salaryResult = salaryResultFa, + salary = salary, + rate = rate, + coefficient = coefficient, + salaryResultDouble = salaryResult, + baseYearResult = baseYearResultFa, + mabnaDailyWage = (baseYearResultRound + salaryResultRound).ToMoney(), + baseYearDataList = baseYearResult.BaseYearDataList, + }); + } + + #endregion + } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/ClassificationSchemeTab.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/ClassificationSchemeTab.cshtml index 53427922..0bd9f1ff 100644 --- a/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/ClassificationSchemeTab.cshtml +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/ClassificationSchemeTab.cshtml @@ -94,7 +94,7 @@ } - \ No newline at end of file + +@if (Model.HasScheme) +{ + +} diff --git a/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/TestScheme.cshtml b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/TestScheme.cshtml new file mode 100644 index 00000000..5b0aff77 --- /dev/null +++ b/ServiceHost/Areas/Admin/Pages/Company/Workshops/_ClassificationPartials/TestScheme.cshtml @@ -0,0 +1,386 @@ +@using _0_Framework.Application.Enums +@model CompanyManagment.App.Contracts.ClassificationScheme.EmployeeInfoTab +@Html.AntiForgeryToken() +@{ + +} + + + + + + + \ No newline at end of file diff --git a/ServiceHost/appsettings.Development.json b/ServiceHost/appsettings.Development.json index b99bd4af..1de1758f 100644 --- a/ServiceHost/appsettings.Development.json +++ b/ServiceHost/appsettings.Development.json @@ -16,10 +16,10 @@ //local - "MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;", + //"MesbahDb": "Data Source=.;Initial Catalog=mesbah_db;Integrated Security=True;TrustServerCertificate=true;", //dad-mehr - //"MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;", + "MesbahDb": "Data Source=.;Initial Catalog=teamWork;Integrated Security=True;TrustServerCertificate=true;", "TestDb": "Data Source=.;Initial Catalog=TestDb;Integrated Security=True;TrustServerCertificate=true;"