diff --git a/Company.Domain/YearlySalaryAgg/IYearlySalaryRepository.cs b/Company.Domain/YearlySalaryAgg/IYearlySalaryRepository.cs index 7a0a3acc..943abefa 100644 --- a/Company.Domain/YearlySalaryAgg/IYearlySalaryRepository.cs +++ b/Company.Domain/YearlySalaryAgg/IYearlySalaryRepository.cs @@ -21,6 +21,18 @@ public interface IYearlySalaryRepository : IRepository double GetLeavePay(DateTime contractStart, DateTime contractEnd, double daylyWage, double consumableItem, double housingAllowance, double familyAllowance , string weeklyWorkingTime, int officialholiday, int friday, string totalHoursH, string totalHorsM); double GetOverTimeWorking(double dayliWage, string overTimeWorkH, string overTimeWorkM); double GetOverNightWorking(double dayliWage, string overNightWorkH, string overNightWorkM, string weeklyWorkingTime, int officialholiday, int friday, DateTime contractStart, DateTime contractEnd, string totalHoursH, string totalHorsM); + + /// + /// متد محاسبه پایه سنوات و لیست پایه سنوات های پرسنل + /// + /// + /// + /// + /// + /// + /// + BaseYearDataViewModel BaseYearCompute(DateTime contractStart, DateTime contractEnd, long employeeId, + long workshopId, List leftWorkList); DayliFeeViewModel DayliFeeComputing(DateTime startDateW,DateTime contractStart, DateTime endDateW, long employeeId, long workshopId,List leftWorkList); Task DayliFeeComputingAsync(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List leftWorkList); string ConsumableItems(DateTime endDateW); diff --git a/CompanyManagment.App.Contracts/YearlySalary/BaseYearDataViewModel.cs b/CompanyManagment.App.Contracts/YearlySalary/BaseYearDataViewModel.cs new file mode 100644 index 00000000..76e749ee --- /dev/null +++ b/CompanyManagment.App.Contracts/YearlySalary/BaseYearDataViewModel.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; + +namespace CompanyManagment.App.Contracts.YearlySalary; + +/// +/// دیتای پایه سنوات از اولین شروع بکار پرسنل +/// +public class BaseYearDataViewModel +{ + /// + /// آی دی پرسنل + /// + public long EmployeeId { get; set; } + + /// + /// آی دی کارگاه + /// + public long WorkshopId { get; set; } + + + /// + /// پایه سنوات محاسبه شده نهایی + /// + public double BaseYearResult { get; set; } + + /// + /// لیست تمام پایه سنوات های محاسبه شده + /// + public List BaseYearDataList { get; set; } +} + +/// +/// لیست تمام پایه سنوات های محاسبه شده +/// +public class BaseYearDataList +{ + /// + /// پایه سنوات + /// + public double BaseYear { get; set; } + + /// + /// تاریخ میلادی شروع محاسبه پایه سنوات + /// + public DateTime StartDateGr { get; set; } + + /// + /// تاریخ میلادی پایان محاسبه پایه سنوات + /// + public DateTime EndDateGr { get; set; } + + /// + /// تاریخ شمسی شروع محاسبه پایه سنوات + /// + public string StartDateFa { get; set; } + + /// + /// تاریخ شمسی پایان محاسبه پایه سنوات + /// + public string EndDateFa { get; set; } + + /// + /// سالی که در آن پایه سنوات تعلق گرفته + /// + public string Year { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs index 5d90620f..7f5c7540 100644 --- a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs +++ b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs @@ -795,9 +795,299 @@ public class YearlySalaryRepository : RepositoryBase, IYearl return currected; } - //محاسبه حقوق روزانه - #region DayliSalary - public DayliFeeViewModel DayliFeeComputing(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List leftWorkList) + //محاسبه حقوق روزانه + #region DayliSalary + + /// + /// متد محاسبه پایه سنوات + /// + /// + /// + /// + /// + /// + /// + public BaseYearDataViewModel BaseYearCompute(DateTime contractStart, DateTime contractEnd, long employeeId, long workshopId, List leftWorkList) + { + //خروجی متد + var baseYearResult = new BaseYearDataViewModel(); + baseYearResult.WorkshopId = workshopId; + baseYearResult.EmployeeId = employeeId; + + //لیست شروع بکار / ترک کار پرسنل + leftWorkList = leftWorkList.OrderBy(x => x.StartWorkDateGr).ToList(); + //مقادیر سالانه + var salary = _context.YearlySalaries.OrderByDescending(x => x.EndDate).Include(x => x.YearlySalaryItemsList).ToList(); + //آیا در حلقه کبیشه بودن چک شود + bool checkKabiseh = true; + var isKabiseh = false; + var EndOfYaerDate = new DateTime(); + //لیست تاریخ هایی که پایه سنوات تعلق گرفته + var baseYearDateList = new List(); + + double baseYear = 0; + // اگر یک شروع بکار داشت + 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); + checkKabiseh = true; + baseYearDateList.Add(a); + Console.WriteLine($" End : {a.ToFarsi()}"); + } + + + } + + } + else //اگر بیش از یک شروع بکار داشت + { + int max365 = 0; + int dayCounter = 0; + 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) + { + + + + + checkKabiseh = true; + var a = current.AddDays(1); + baseYearDateList.Add(a); + Console.WriteLine($" End : {a.ToFarsi()}"); + Console.WriteLine(dayCounter); + dayCounter = 0; + } + + } + + } + } + + // پایه سنوات نهایی + double selectBase = 0; + 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 firstBasic = firstbasicSalari + .YearlySalaryItemsList.Where(x => x.ItemName == "پایه سنوات").Select(x => x.ItemValue).FirstOrDefault(); + 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 baseList = new List<(double baseYaer, DateTime start, DateTime end, string year)>(); + var first = (firstBasic, firstbasicSalari.StartDate, firstbasicSalari.EndDate, firstbasicSalari.Year); + 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 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 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 >= currentSalary.StartDate && x <= currentSalary.EndDate)) + currentBasic = 0; + + var currentBase = currentBasic + percntBaseYear; + + baseYear = currentBase; + + + // var round = GetCurrectFirstDailyFee(currentBase, $"{year}"); + var record = (baseYear, currentSalary.StartDate, currentSalary.EndDate, currentSalary.Year); + baseList.Add(record); + + + + } + + } + Console.ResetColor(); + + + selectBase = baseList.Last().baseYaer; + baseYearResult = new BaseYearDataViewModel() + { + WorkshopId = workshopId, + EmployeeId = employeeId, + BaseYearResult = selectBase, + + BaseYearDataList = baseList.Select(x => new BaseYearDataList() + { + BaseYear = x.baseYaer, + + StartDateGr = x.start, + EndDateGr = x.end, + + StartDateFa = x.start.ToFarsi(), + EndDateFa = x.end.ToFarsi(), + Year = x.year + }).ToList(), + + }; + } + + //var resCompute = DayliFeeComputingTest(startDateW, contractStart, endDateW, employeeId, workshopId, leftWorkList); + //var originalCompute = DayliFeeComputing(startDateW, contractStart, endDateW, employeeId, workshopId, leftWorkList); + //var lastBaseResult = baseYearDateList.Last().baseyearDouble; + + //Console.WriteLine($"dailyWage = {resCompute.DayliFeeDouble} - baseYear {selectBase} dailywagePlusBaseyaer = {resCompute.DayliFeeDouble + selectBase} ok = {originalCompute.DayliFeeDouble}"); + 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; + } + + public DayliFeeViewModel DayliFeeComputing(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List leftWorkList) { int oldYear = 0; string oldYearTemp = string.Empty;