new metod To Compute Spreation BaseYear

This commit is contained in:
SamSys
2025-08-15 15:49:35 +03:30
parent e0f7ff5ec7
commit c04a8f86a4
3 changed files with 372 additions and 3 deletions

View File

@@ -21,6 +21,18 @@ public interface IYearlySalaryRepository : IRepository<long, YearlySalary>
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);
/// <summary>
/// متد محاسبه پایه سنوات و لیست پایه سنوات های پرسنل
/// </summary>
/// <param name="contractStart"></param>
/// <param name="contractEnd"></param>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <param name="leftWorkList"></param>
/// <returns></returns>
BaseYearDataViewModel BaseYearCompute(DateTime contractStart, DateTime contractEnd, long employeeId,
long workshopId, List<LeftWorkViewModel> leftWorkList);
DayliFeeViewModel DayliFeeComputing(DateTime startDateW,DateTime contractStart, DateTime endDateW, long employeeId, long workshopId,List<LeftWorkViewModel> leftWorkList);
Task<DayliFeeViewModel> DayliFeeComputingAsync(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List<LeftWorkViewModel> leftWorkList);
string ConsumableItems(DateTime endDateW);

View File

@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
namespace CompanyManagment.App.Contracts.YearlySalary;
/// <summary>
/// دیتای پایه سنوات از اولین شروع بکار پرسنل
/// </summary>
public class BaseYearDataViewModel
{
/// <summary>
/// آی دی پرسنل
/// </summary>
public long EmployeeId { get; set; }
/// <summary>
/// آی دی کارگاه
/// </summary>
public long WorkshopId { get; set; }
/// <summary>
/// پایه سنوات محاسبه شده نهایی
/// </summary>
public double BaseYearResult { get; set; }
/// <summary>
/// لیست تمام پایه سنوات های محاسبه شده
/// </summary>
public List<BaseYearDataList> BaseYearDataList { get; set; }
}
/// <summary>
/// لیست تمام پایه سنوات های محاسبه شده
/// </summary>
public class BaseYearDataList
{
/// <summary>
/// پایه سنوات
/// </summary>
public double BaseYear { get; set; }
/// <summary>
/// تاریخ میلادی شروع محاسبه پایه سنوات
/// </summary>
public DateTime StartDateGr { get; set; }
/// <summary>
/// تاریخ میلادی پایان محاسبه پایه سنوات
/// </summary>
public DateTime EndDateGr { get; set; }
/// <summary>
/// تاریخ شمسی شروع محاسبه پایه سنوات
/// </summary>
public string StartDateFa { get; set; }
/// <summary>
/// تاریخ شمسی پایان محاسبه پایه سنوات
/// </summary>
public string EndDateFa { get; set; }
/// <summary>
/// سالی که در آن پایه سنوات تعلق گرفته
/// </summary>
public string Year { get; set; }
}

View File

@@ -795,9 +795,299 @@ public class YearlySalaryRepository : RepositoryBase<long, YearlySalary>, IYearl
return currected;
}
//محاسبه حقوق روزانه
#region DayliSalary
public DayliFeeViewModel DayliFeeComputing(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List<LeftWorkViewModel> leftWorkList)
//محاسبه حقوق روزانه
#region DayliSalary
/// <summary>
/// متد محاسبه پایه سنوات
/// </summary>
/// <param name="contractStart"></param>
/// <param name="contractEnd"></param>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <param name="leftWorkList"></param>
/// <returns></returns>
public BaseYearDataViewModel BaseYearCompute(DateTime contractStart, DateTime contractEnd, long employeeId, long workshopId, List<LeftWorkViewModel> 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<DateTime>();
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;
}
/// <summary>
/// متد کمکی پایه سنوات
/// </summary>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
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<LeftWorkViewModel> leftWorkList)
{
int oldYear = 0;
string oldYearTemp = string.Empty;