new metod To Compute Spreation BaseYear
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user