Files
Backend-Api/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs
SamSys e2494a48a5 ddd
2024-12-08 18:46:14 +03:30

3331 lines
151 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using _0_Framework.Application;
using _0_Framework.InfraStructure;
using Company.Domain.LeftWorkAgg;
using Company.Domain.MandatoryHoursAgg;
using Company.Domain.YearlySalaryAgg;
using CompanyManagment.App.Contracts.Checkout;
using CompanyManagment.App.Contracts.Holiday;
using CompanyManagment.App.Contracts.LeftWork;
using CompanyManagment.App.Contracts.YearlySalary;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
using PersianTools.Core;
namespace CompanyManagment.EFCore.Repository;
public class YearlySalaryRepository : RepositoryBase<long, YearlySalary>, IYearlySalaryRepository
{
private readonly CompanyContext _context;
private readonly ILeftWorkRepository _leftWorkRepository;
private readonly IMandatoryHoursRepository _mandatoryHoursRepository;
public YearlySalaryRepository(CompanyContext context, ILeftWorkRepository leftWorkRepository, IMandatoryHoursRepository mandatoryHoursRepository) : base(context)
{
_context = context;
_leftWorkRepository = leftWorkRepository;
_mandatoryHoursRepository = mandatoryHoursRepository;
}
// لیست سال های برای دراپ دان
#region GetYearsToDropDown
public List<string> GetYears()
{
List<string> yearlist = new List<string>();
PersianDateTime startDate = new PersianDateTime(1370, 1, 1);
DateTime endDateNow = DateTime.Now;
var endDateNowFa = endDateNow.ToFarsi();
var y = Convert.ToInt32(endDateNowFa.Substring(0, 4));
var m = Convert.ToInt32(endDateNowFa.Substring(5, 2));
var d = Convert.ToInt32(endDateNowFa.Substring(8, 2));
if (m == 12)
y += 1;
PersianDateTime endDate = new PersianDateTime(y, m, d);
for (PersianDateTime date = endDate; date >= startDate; date = date.AddYears(-1))
{
yearlist.Add(date.ToString("yyyy"));
}
return yearlist;
}
#endregion
//دریافت مقادیر یک سال بر اساس سال انتخاب شده
#region YearlySalaryByYear
public List<YearlySalaryViewModel> GetYearlySalary()
{
return _context.YearlySalaries.Select(x => new YearlySalaryViewModel
{
Id = x.id,
StartDate = x.StartDate.ToFarsi(),
Year = x.Year
})
.OrderByDescending(x => x.Year).ToList();
}
#endregion
//محاسبه حقوق ماهیانه عیدی و پاداش ، سنوات
#region GetMontlyBunosYears
public MontlywageBunosYearsViewModel GetMontlyBunosYears(TimeSpan weeklyTime, DateTime contractStart, DateTime contractEnd, double daylyWage,
string weeklyWorkingTime, int officialholiday, int friday, string totalHoursH, string totalHorsM, string basic, int fridayStartToEnd, double dayliFeeComplete)
{
double basicDouble = basic.MoneyToDouble();
double sub = 0;
double bacicMontlyResult = 0;
double montlyResult = 0;
double montlySalaryResult = 0;
double basicYearResult = 0;
var salary = _context.YearlySalaries.OrderByDescending(x => x.EndDate).Include(x => x.YearlySalaryItemsList).ToList();
var SalaryItems =
salary.FirstOrDefault(x => x.StartDate <= contractStart && x.EndDate >= contractStart);
var BasicDayliFee = SalaryItems
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
var contractEndFa = contractEnd.ToFarsi();
var TotalDays = (contractEnd - contractStart).TotalDays + 1;
//var DayCounter = Convert.ToInt32(TotalDays);
//var EndOfM = Convert.ToInt32(contractEndFa.Substring(8, 2));
//if (EndOfM == 31)
//{
// TotalDays = 30;
//}
// یدست آوردن کل ساعت کار پرسنل در ماه
var totalHoursHDouble = Convert.ToDouble(totalHoursH);
var totalHoursMDouble = Convert.ToDouble(totalHorsM);
if (totalHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
totalHoursMDouble = totalHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این ماه
var totalHours = totalHoursHDouble + totalHoursMDouble;// ساعت کارکرد پرسنل در این ماه
//var MandatoryDays = TotalDays - friday - officialholiday;
var MandatoryDays = TotalDays - fridayStartToEnd;
//بدست آوردن ساعت موظفی این ماه
var TotalMandatoryHours = MandatoryDays * 7.33;//ساعت موظفی این ماه
//محاسبه سنوات
var yearsResult = (daylyWage * 30) / 365 * TotalDays;
//محاسبه عیدی و پاداش
var bunosResult = (daylyWage * 60) / 365 * TotalDays;
if (weeklyWorkingTime == "24 - 12" || weeklyWorkingTime == "24 - 24"
|| weeklyWorkingTime == "36 - 12" ||
weeklyWorkingTime == "48 - 24")
{
if (totalHours < TotalMandatoryHours)//weeklyTimeDouble < 44.00اگر کمتر از 44 ساعت کار کرد
{
var b = (BasicDayliFee * totalHours) / TotalMandatoryHours;
var dayli = (dayliFeeComplete * totalHours) / TotalMandatoryHours;
if (basicDouble > 0)//اگر پایه سنوات داشت
{
//حقوق ماهیانه
montlySalaryResult = b * TotalDays;
//پایه سنوات
basicYearResult = (dayli - b) * TotalDays;
}
else// اگر پایه سنوات نداشت
{
//حقوق ماهانه
montlySalaryResult = daylyWage * TotalDays;
//پایه سنوات
basicYearResult = 0;
}
}
else
{
daylyWage = basicDouble > 0 ? (daylyWage + basicDouble) : daylyWage;
montlyResult = daylyWage * TotalDays;// مزد ماهانه با پایه سنوات
bacicMontlyResult = BasicDayliFee * TotalDays;// مزد ماهانه بدون پایه سنوات
if (montlyResult > bacicMontlyResult)
{
montlySalaryResult = bacicMontlyResult;
basicYearResult = montlyResult - bacicMontlyResult;
}
else
{
montlySalaryResult = montlyResult;
}
}
}
else
{
//double weeklyTimeDouble = 0;
//try
//{
// weeklyTimeDouble = double.Parse(weeklyWorkingTime, CultureInfo.InvariantCulture);
//}
//catch (Exception e)
//{
// weeklyTimeDouble = double.Parse(weeklyWorkingTime);
//}
if (totalHours < TotalMandatoryHours)//weeklyTimeDouble < 44.00اگر کمتر از 44 ساعت کار کرد
{
//var divideNum = TimeSpan.Parse("06:00");
//// مجموع ساعت کار هفته تقسیم بر 6 ساعت
//var dividTo6Days = 34.57 / 6;
//// مزد روزانه تقسیم بر 7.33
//var dailyStep1 = BasicDayliFee / 7.33;
////نتیجه ضربدر جواب مجموع ساعت تقسیم بر 6 روز هفته
//var dailyStep2 = dailyStep1 * dividTo6Days;
//var dailyFeeString = dailyStep2.ToMoney();
//var dayilyFee = dailyFeeString.MoneyToDouble();
//var a = (daylyWage * totalHours) / TotalMandatoryHours;
var b = (BasicDayliFee * totalHours) / TotalMandatoryHours;
var dayli = (dayliFeeComplete * totalHours) / TotalMandatoryHours;
if (basicDouble > 0)//اگر پایه سنوات داشت
{
//حقوق ماهیانه
montlySalaryResult = b * TotalDays;
//پایه سنوات
basicYearResult = (dayli - b) * TotalDays;
}
else// اگر پایه سنوات نداشت
{
//حقوق ماهانه
montlySalaryResult = daylyWage * TotalDays;
//پایه سنوات
basicYearResult = 0;
}
//if (sub >= 0)
//{
// basicYearResult = sub * TotalDays;
// montlySalaryResult = dayilyFee * TotalDays;
//}
//else
//{
// basicYearResult = 0;
// montlySalaryResult = daylyWage * TotalDays;
//}
}
else//اگر بیشتر از 44 ساعت کار کرد
{
//محاسبه حقوق ماهانه
montlyResult = daylyWage * TotalDays;// مزد ماهانه با پایه سنوات
bacicMontlyResult = BasicDayliFee * TotalDays;// مزد ماهانه بدون پایه سنوات
if (montlyResult > bacicMontlyResult)
{
montlySalaryResult = bacicMontlyResult;
basicYearResult = montlyResult - bacicMontlyResult;
}
else
{
montlySalaryResult = montlyResult;
}
}
}
var result = new MontlywageBunosYearsViewModel()
{
MontlyWage = montlySalaryResult,// حقوق ماهانه بدون پایه سنوات
Years = yearsResult,// سنوات
Bunos = bunosResult,//عیدی پاداش
BasicYears = basicYearResult,//پایه سنوات
SumOfWorkingDay = $"{TotalDays}",
};
return result;
}
#endregion
//مزد مرخصی
#region GetLeavePay
public 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 result = 0;
var TotalDays = (contractEnd - contractStart).TotalDays + 1;
// {مقدار ساعت مجاز مرخصی در برای یک روز{کامل
var leaveHoursesPerDay = 190.58 / 365;
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
var leaveHoursesPerContractDays = leaveHoursesPerDay * TotalDays;
if (weeklyWorkingTime == "24 - 12" || weeklyWorkingTime == "24 - 24"
|| weeklyWorkingTime == "36 - 12" ||
weeklyWorkingTime == "48 - 24")
{
var MandatoryDays = TotalDays - friday - officialholiday;
//بدست آوردن ساعت موظفی این ماه
var TotalMandatoryHours = MandatoryDays * 7.33;
//تبدیل ساعت به عدد
var totalHoursHDouble = Convert.ToDouble(totalHoursH);
var totalHoursMDouble = Convert.ToDouble(totalHorsM);
if (totalHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
totalHoursMDouble = totalHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این ماه
var totalHours = totalHoursHDouble + totalHoursMDouble;
var employeeWorkingDay = TotalDays - friday;
if (totalHours < TotalMandatoryHours)// اگر کمتر از 44 ساعت کار کرد
{
var dayliHours = totalHours / employeeWorkingDay;
//مقدار مزد روزانه برای یک ساعت
var dayliFee = daylyWage / dayliHours;
//اقلام مصرفی برای یک ساعت
var ConoumableItemsStep1 = consumableItem / 30;
var ConsumableItems = ConoumableItemsStep1 / dayliHours;
//کمک هزینه مسکن برای یک ساعت
var housingAllowanceStep1 = housingAllowance / 30;
var HousingAllowance = housingAllowanceStep1 / dayliHours;
//حق عائله مندی برای یک ساعت
var familyAllowanceStep1 = familyAllowance / 30;
var FamilyAllowance = familyAllowanceStep1 / dayliHours;
var Step1Result1 = dayliFee + ConsumableItems + HousingAllowance + FamilyAllowance;
// تناسب مجدد به نسبت ساعات کمتر از 7/33
var res = (leaveHoursesPerContractDays * dayliHours) / 7.33;
result = Step1Result1 * res;
}
else
{
//مقدار مزد روزانه برای یک ساعت
var dayliFee = daylyWage / 7.33;
//اقلام مصرفی برای یک ساعت
var ConoumableItemsStep1 = consumableItem / 30;
var ConsumableItems = ConoumableItemsStep1 / 7.33;
//کمک هزینه مسکن برای یک ساعت
var housingAllowanceStep1 = housingAllowance / 30;
var HousingAllowance = housingAllowanceStep1 / 7.33;
//حق عائله مندی برای یک ساعت
var familyAllowanceStep1 = familyAllowance / 30;
var FamilyAllowance = familyAllowanceStep1 / 7.33;
var Step1Result2 = dayliFee + ConsumableItems + HousingAllowance + FamilyAllowance;
result = Step1Result2 * leaveHoursesPerContractDays;
}
}
else
{
double weeklyTime = 0;
try
{
weeklyTime = double.Parse(weeklyWorkingTime, CultureInfo.InvariantCulture);
}
catch (Exception e)
{
weeklyTime = double.Parse(weeklyWorkingTime);
}
if (weeklyTime < 44.00)
{
//بدست آوردن میانگین ساعت کار پرسنل در روز
var personelDayliHours = weeklyTime / 6;
//مقدار مزد روزانه برای یک ساعت
var dayliFee = daylyWage / personelDayliHours;
//اقلام مصرفی برای یک ساعت
var ConoumableItemsStep1 = consumableItem / 30;
var ConsumableItems = ConoumableItemsStep1 / personelDayliHours;
//کمک هزینه مسکن برای یک ساعت
var housingAllowanceStep1 = housingAllowance / 30;
var HousingAllowance = housingAllowanceStep1 / personelDayliHours;
//حق عائله مندی برای یک ساعت
var familyAllowanceStep1 = familyAllowance / 30;
var FamilyAllowance = familyAllowanceStep1 / personelDayliHours;
//مزد مرخصی این پرسنل به ازای یک ساعت
var leavPayPerHours = dayliFee + ConsumableItems + HousingAllowance + FamilyAllowance;
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
var res = (leaveHoursesPerContractDays * personelDayliHours) / 7.33;
result = leavPayPerHours * res;
}
else
{
//مقدار مزد روزانه برای یک ساعت
var dayliFee = daylyWage / 7.33;
//اقلام مصرفی برای یک ساعت
var ConoumableItemsStep1 = consumableItem / 30;
var ConsumableItems = ConoumableItemsStep1 / 7.33;
//کمک هزینه مسکن برای یک ساعت
var housingAllowanceStep1 = housingAllowance / 30;
var HousingAllowance = housingAllowanceStep1 / 7.33;
//حق عائله مندی برای یک ساعت
var familyAllowanceStep1 = familyAllowance / 30;
var FamilyAllowance = familyAllowanceStep1 / 7.33;
var leavPayPerHours = dayliFee + ConsumableItems + HousingAllowance + FamilyAllowance;
result = leavPayPerHours * leaveHoursesPerContractDays;
}
}
return result;
}
#endregion
//اضافه کاری
#region OverTimeWorking
public double GetOverTimeWorking(double dayliWage, string overTimeWorkH, string overTimeWorkM)
{
double result = 0;
// اگر اضافه کاری داشت
if (overTimeWorkH != "0" || overTimeWorkM != "0")
{
var overtimeH = Convert.ToDouble(overTimeWorkH);
var overtimeM = Convert.ToDouble(overTimeWorkM);
if (overtimeM > 0)
{
//تبیدل دقیه به اعشار
overtimeM = overtimeM / 60;
}
var overTime = overtimeH + overtimeM;
// محاسبه اضافه کاری برای یک ساعت
var oneHouerOverTime = dayliWage / 7.33 * 1.4;
result = oneHouerOverTime * overTime;
}
return result;
}
#endregion
//شب کاری
#region OverNightWorking
public double GetOverNightWorking(double dayliWage, string overNightWorkH, string overNightWorkM, string weeklyWorkingTime, int officialholiday, int friday, DateTime contractStart, DateTime contractEnd, string totalHoursH, string totalHorsM)
{
double result = 0;
double computeResult = 0;
//تعداد روزهای قرارداد
if (weeklyWorkingTime == "24 - 12" || weeklyWorkingTime == "24 - 24"
|| weeklyWorkingTime == "36 - 12" ||
weeklyWorkingTime == "48 - 24")
{
var TotalDays = (contractEnd - contractStart).TotalDays + 1;
//روزهای قرارداد منهای جمعه ها و تعطیلات رسمی
var MandatoryDays = TotalDays - friday - officialholiday;
//بدست آوردن ساعت موظفی این ماه
var TotalMandatoryHours = MandatoryDays * 7.33;
//تبدیل ساعت به عدد
var totalHoursHDouble = Convert.ToDouble(totalHoursH);
var totalHoursMDouble = Convert.ToDouble(totalHorsM);
if (totalHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
totalHoursMDouble = totalHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این ماه
var totalHours = totalHoursHDouble + totalHoursMDouble;
var employeeWorkingDay = TotalDays - friday;
if (overNightWorkH != "0" || overNightWorkM != "0")
{
var overtimeNightH = Convert.ToDouble(overNightWorkH);
var overtimeNightM = Convert.ToDouble(overNightWorkM);
if (overtimeNightM > 0)
{
//تبیدل دقیه به اعشار
overtimeNightM = overtimeNightM / 60;
}
var overNightTime = overtimeNightH + overtimeNightM;
//به دست آوردن ساعات کارکرد
// محاسبه اضافه کاری برای یک ساعت
if (totalHours < TotalMandatoryHours)// اگر کمتر از 44 ساعت کار کرد
{
//بدست آوردن میانگین ساعت کار کارگر در یک روز
var employeeMonadtory = totalHours / employeeWorkingDay;
computeResult = (dayliWage / employeeMonadtory * 35) / 100;
}
else
{
computeResult = (dayliWage / 7.33 * 35) / 100;
}
result = computeResult * overNightTime;
}
}
else
{
if (overNightWorkH != "0" || overNightWorkM != "0")
{
var overtimeNightH = Convert.ToDouble(overNightWorkH);
var overtimeNightM = Convert.ToDouble(overNightWorkM);
if (overtimeNightM > 0)
{
//تبیدل دقیه به اعشار
overtimeNightM = overtimeNightM / 60;
}
var overNightTime = overtimeNightH + overtimeNightM;
//به دست آوردن ساعات کارکرد
double weeklyTime = 0;
try
{
weeklyTime = double.Parse(weeklyWorkingTime, CultureInfo.InvariantCulture);
}
catch (Exception e)
{
weeklyTime = double.Parse(weeklyWorkingTime);
}
// محاسبه اضافه کاری برای یک ساعت
if (weeklyTime < 44.00)// اگر کمتر از 44 ساعت کار کرد
{
var dayliHours = weeklyTime / 6;
computeResult = (dayliWage / dayliHours * 35) / 100;
}
else
{
computeResult = (dayliWage / 7.33 * 35) / 100;
}
result = computeResult * overNightTime;
}
// اگر شیکاری کاری داشت
}
return result;
}
#endregion
//محاسبه حقوق روزانه
#region DayliSalary
public DayliFeeViewModel DayliFeeComputing(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId, long workshopId, List<LeftWorkViewModel> leftWorkList)
{
int oldYear = 0;
string oldYearTemp = string.Empty;
var startPeriod = new DateTime();
var endtPeriod = new DateTime();
string finalResultMoney = string.Empty;
double FinalResult = 0;
int DayCounter = 0;
int Max365 = 365;
double Basic = 0;
double BaseResult = 0;
DateTime periodStarter = new DateTime();
int loopdateYear = 0;
long stDateId = 0;//ای دی ماه های دوگانه
double basicResultSum = 0;
//مقادیر سالانه
var salary = _context.YearlySalaries.OrderByDescending(x => x.EndDate).Include(x => x.YearlySalaryItemsList).ToList();
// تاریخ اولین شروع بکار
var startDateB = leftWorkList.OrderBy(x => x.StartWorkDateGr).Select(x => x.StartWorkDate).FirstOrDefault();
//نگهدارنده آی دی سال در مقادیر سالانه
long loopDateId = 0;
var syear = Convert.ToInt32(startDateB.Substring(0, 4));
var smonth = Convert.ToInt32(startDateB.Substring(5, 2));
var sday = Convert.ToInt32(startDateB.Substring(8, 2));
var endDateConvert = endDateW.ToFarsi();
var eyear = Convert.ToInt32(endDateConvert.Substring(0, 4));
var emonth = Convert.ToInt32(endDateConvert.Substring(5, 2));
var eday = Convert.ToInt32(endDateConvert.Substring(8, 2));
//تبدیل تاریخ اولین شروع بکار به شمسی تقویمی
var d1 = new PersianDateTime(syear, smonth, sday);
//تبدیل تاریخ پایان قرارداد به شمسی تقویمی
var d2 = new PersianDateTime(eyear, emonth, eday);
var getWork = startDateB.ToGeorgianDateTime();
//یافتن سال گزشته
var getWorkYear = syear - 1;
oldYear = syear - 1;
var getWorkYearString = getWorkYear.ToString();
//var getWorkSalary = salary.FirstOrDefault(x=>x.Year == getWorkYearString);
var dayliSalaryStep1Check = salary.Any(x => x.Year == getWorkYearString);
// یافتن مزد روزانه سال قبل از اولین شروع بکار
var DayliSalaryStep1 = salary.FirstOrDefault(x => x.Year == getWorkYearString)
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
//مقدار اولیه مزد روزانه
double firstDayliSalary = DayliSalaryStep1;
for (DateTime LoopDate = getWork; LoopDate <= endDateW; LoopDate = LoopDate.AddDays(1))
{
var loopdateFa = LoopDate.ToFarsi();
loopdateYear = Convert.ToInt32(loopdateFa.Substring(0, 4));
var LoopDateGr = LoopDate;
//یافتن ترک کار
var check = leftWorkList.Any(x => x.StartWorkDateGr == LoopDateGr);
if (check)
{
var period = leftWorkList.FirstOrDefault(x => x.StartWorkDateGr == LoopDateGr);
//ذخیره تاریخ شروع بکار
startPeriod = period.StartWorkDateGr;
if (period.LeftWorkDate == "1500/01/01")
{
endtPeriod = endDateW;
}
else
{
endtPeriod = period.LeftWorkDateGr.AddDays(-1);
// ذخیره تاریخ ترک کار
}
}
//اگر تاریخ جاری بزرگتر یت مساوی تاریخ شروع ترک کار و کوچکتر یا مساوی تاریخ پایان ترک کار بود
if (LoopDateGr >= startPeriod && LoopDateGr <= endtPeriod)
{
//اگر شمارنده روزها صفر بود
if (DayCounter == 0)
{
//var date = LoopDate.ToString();
// ذهیر تعداد روز های سال جاری بر اساس کبیسه یودن یا نبودن
Max365 = 365;
}
// یک روز به شمارنده روزها اضافه کن
DayCounter += 1;
//periodStarter = startPeriod.ContractStartGr;
}
//آیا در مقادیر سالانه رکوردی وجود دارد که شروعش از تاریخ جاری کوچکتر و پایانش از تاریخ جاری بزرگتر باشد
var checkExist = salary.Any(x =>
x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId);
if (checkExist)
{
var test = loopdateYear.ToString();//سال جاری رو بدست بیار
var step2 = salary.Where(x => x.Year == test).OrderByDescending(x => x.StartDate).ToList();// اونایی رو بیار که سال جاری هستن
if (step2.Count > 1)// اگر تعدادشون بیش از 1 بود
{
var stDate = step2.FirstOrDefault(); // آخری
if (DayCounter < Max365)
{
if (LoopDateGr >= stDate.StartDate && LoopDateGr <= stDate.EndDate && oldYear != loopdateYear && stDate.id != stDateId)
{
var fixFeePercentage = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مبلغ مزد ثابت سال جاری
var fixFeePrice = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "مبلغ مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مزد روزانه سال قبل ضربدر درصد مزد ثابت تقسیم بر صد
var percntSumDaylifee = (firstDayliSalary * fixFeePercentage) / 100;
// نتیجه عملیات بالا بعلاوه مزد سال قبل
var Sum = firstDayliSalary + percntSumDaylifee;
//مزد پایه
BaseResult = Sum + fixFeePrice;
//var rondUp = Convert.ToInt32(BaseResult);
Console.WriteLine($"{test} - mozdeSaleGhabl[{firstDayliSalary}] - mozdeSaleJari[{BaseResult}] - fixFeePercentage[{fixFeePercentage}] - fixFeePrice[{fixFeePrice}]");
//آی دی سال جاری
loopDateId = salary.Where(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId).Select(x => x.id).FirstOrDefault();
// ذخیره سال جاری بعنوان سال گذشته برای عملیات بعدی
oldYear = loopdateYear;
stDateId = stDate.id;
}
else
{
if (BaseResult == 0)
{
var oldYearString = oldYear.ToString();
BaseResult = salary.FirstOrDefault(x => x.Year == oldYearString)
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
}
}
}
else if (DayCounter == Max365 && oldYear != loopdateYear)
{
var fixFeePercentage = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مبلغ مزد ثابت سال جاری
var fixFeePrice = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "مبلغ مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مزد روزانه سال قبل ضربدر درصد مزد ثابت تقسیم بر صد
var percntSumDaylifee = (firstDayliSalary * fixFeePercentage) / 100;
// نتیجه عملیات بالا بعلاوه مزد سال قبل
var Sum = firstDayliSalary + percntSumDaylifee;
//مزد پایه
BaseResult = Sum + fixFeePrice;
//var rondUp = Convert.ToInt32(BaseResult);
Console.WriteLine($"{test} - mozdeSaleGhabl[{firstDayliSalary}] - mozdeSaleJari[{BaseResult}] - fixFeePercentage[{fixFeePercentage}] - fixFeePrice[{fixFeePrice}]");
//آی دی سال جاری
loopDateId = salary.Where(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId).Select(x => x.id).FirstOrDefault();
// ذخیره سال جاری بعنوان سال گذشته برای عملیات بعدی
oldYear = loopdateYear;
}
}
else if (step2.Count == 1 && oldYear != loopdateYear)
{
//درصد مزد ثابت تاریخ جاری
var fixFeePercentage = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مبلغ مزد ثابت سال جاری
var fixFeePrice = salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId)
.YearlySalaryItemsList.Where(x => x.ItemName == "مبلغ مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
// مزد روزانه سال قبل ضربدر درصد مزد ثابت تقسیم بر صد
var percntSumDaylifee = (firstDayliSalary * fixFeePercentage) / 100;
// نتیجه عملیات بالا بعلاوه مزد سال قبل
var Sum = firstDayliSalary + percntSumDaylifee;
//مزد پایه
BaseResult = Sum + fixFeePrice;
//var rondUp = Convert.ToInt32(BaseResult);
Console.WriteLine($"{test} - mozdeSaleGhabl[{firstDayliSalary}] - mozdeSaleJari[{BaseResult}] - fixFeePercentage[{fixFeePercentage}] - fixFeePrice[{fixFeePrice}]");
//آی دی سال جاری
loopDateId = salary.Where(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr && x.id != loopDateId).Select(x => x.id).FirstOrDefault();
// ذخیره سال جاری بعنوان سال گذشته برای عملیات بعدی
oldYear = loopdateYear;
}
}
//اگر شرط بالا صحیح بود و سال جاری از سال گذشته بزرگتر بود اعملیات را انجام بده
//if (checkExist && loopdateYear > oldYear)
//{
//}
//اگر شمارنده روزها مساوی شد یا 365
if (DayCounter == Max365)
{
var test = LoopDateGr.ToFarsi();
var basicSalari =
salary.FirstOrDefault(x => x.StartDate <= LoopDateGr && x.EndDate >= LoopDateGr);
//پایه سنوات سال جاری
Basic = basicSalari
.YearlySalaryItemsList.Where(x => x.ItemName == "پایه سنوات").Select(x => x.ItemValue).FirstOrDefault();
//پایه سنوات سال جاری بعلاوه مزد پایه
BaseResult += Basic;
basicResultSum += Basic;
Console.BackgroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($"{test} - mozd[{BaseResult}] - Basic[{Basic}]");
Console.ResetColor();
//صفر نمودن شمارنده روزها
DayCounter = 0;
}
//if (loopdateFa == "1398/12/29")
//{
// Console.WriteLine(BaseResult);
//}
//else if (loopdateFa == "1399/12/30")
//{
// Console.WriteLine(BaseResult);
//}
//else if (loopdateFa == "1400/12/29")
//{
// Console.WriteLine(BaseResult);
//}
//else if (loopdateFa == "1401/12/29")
//{
// Console.WriteLine(BaseResult);
//}
//else if (loopdateFa == "1402/01/29")
//{
// Console.WriteLine(BaseResult);
//}
FinalResult = BaseResult;
//ذخیره نتیجه نهایی مزد پایه
firstDayliSalary = FinalResult;
}
//ارسال مزد نهایی بعد از پایان حقه
#region round
int FinalResultInt = (int)FinalResult;
var FinalResultDouble = (double)FinalResultInt;
#endregion
finalResultMoney = FinalResultDouble.ToMoney();
var res = new DayliFeeViewModel()
{
DayliFeeDouble = FinalResultDouble,
DayliFee = finalResultMoney,
Basic = basicResultSum.ToMoney()
};
return res;
}
public async Task<DayliFeeViewModel> DayliFeeComputingAsync(DateTime startDateW, DateTime contractStart, DateTime endDateW, long employeeId,
long workshopId, List<LeftWorkViewModel> leftWorkList)
{
var res = DayliFeeComputing(startDateW, contractStart, endDateW, employeeId,
workshopId, leftWorkList);
return res;
}
#endregion
//کمک هزینه اقلام از جدول مقادیر بر اساس سال انتخاب شده
#region ConsumableItems
public string ConsumableItems(DateTime endDateW)
{
var endDateInput = _context.YearlySalaries
.SingleOrDefault(x => x.StartDate <= endDateW && x.EndDate >= endDateW);
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "کمک هزینه اقلام");
var res = FirstItems.ItemValue;
var result = res.ToMoney();
return result;
}
#endregion
//یافتن حق مسکن از جدول مقادیر بر اساس سال انتخاب شده
#region HousingAllowance
public string HousingAllowance(DateTime endDateW)
{
var endDateInput = _context.YearlySalaries
.SingleOrDefault(x => x.StartDate <= endDateW && x.EndDate >= endDateW);
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "کمک هزینه مسکن");
var res = FirstItems.ItemValue;
var result = res.ToMoney();
return result;
}
#endregion
// محاسبه حق عائله مندی پرسنل بر اساس تاریخ ورودی و آی دی پرسنل
#region FamilyAllowance
public string FamilyAllowance(long personelID, DateTime EndCantract)
{
DateTime zeroTime = new DateTime(1, 1, 1);
TimeSpan Age = new TimeSpan();
int childeNumber = 0;
var endDateInput = _context.YearlySalaries
.SingleOrDefault(x => x.StartDate <= EndCantract && x.EndDate >= EndCantract);
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "مزد روزانه");
var dayliSalary = FirstItems.ItemValue;
var dayliSalar3 = dayliSalary * 3;
try
{
var children = _context.EmployeeChildrenSet.Where(x => x.EmployeeId == personelID).ToList();
var insuranceYearAndMonth = _context.Employees.SingleOrDefault(x => x.id == personelID);
var yearI = Convert.ToInt32(insuranceYearAndMonth.InsuranceHistoryByYear);
var monthI = Convert.ToInt32(insuranceYearAndMonth.InsuranceHistoryByMonth);
yearI *= 365;
monthI *= 30;
var insurancHistoey = yearI + monthI;
foreach (var item in children)
{
if (item.DateOfBirth < EndCantract)
{
Age = (EndCantract - item.DateOfBirth);
var ageUp18 = (zeroTime + Age).Year - 1; var res = ageUp18;
if (ageUp18 <= 18 && insurancHistoey >= 720)
{
childeNumber += 1;
}
}
}
}
catch (Exception e)
{
childeNumber = 0;
}
var ress = dayliSalar3 * childeNumber;
var result = ress.ToMoney();
return result;
}
#endregion
#region AsyncMetods
public async Task<string> ConsumableItemsAsync(DateTime endDateW)
{
var res = ConsumableItems(endDateW);
return res;
}
public async Task<string> HousingAllowanceAsync(DateTime endDateW)
{
var res = HousingAllowance(endDateW);
return res;
}
public async Task<string> FamilyAllowanceAsync(long personelID, DateTime EndCantract)
{
var res = FamilyAllowance(personelID, EndCantract);
return res;
}
#endregion
//جستجوی مقادیر یک سال یا آی دی
#region SerachYearlySalaryById
public EditYearlySalary GetDetails(long id)
{
return _context.YearlySalaries.Select(x => new EditYearlySalary
{
Id = x.id,
StartDate = x.StartDate.ToFarsi(),
EndDate = x.EndDate.ToFarsi(),
ConnectionId = x.ConnectionId,
}).FirstOrDefault(x => x.Id == id);
}
#endregion
// سرچ مدل صفحه مقادیر سالانه
#region YearlySalaryMainSerach
public List<YearlySalaryViewModel> Search(YearlySalarySearchModel searchModel)
{
var query = _context.YearlySalaries.Select(x => new YearlySalaryViewModel
{
Id = x.id,
StartDate = x.StartDate.ToFarsi(),
StartDateGr = x.StartDate,
Year = x.Year,
EndDate = x.EndDate.ToFarsi(),
});
if (!string.IsNullOrWhiteSpace(searchModel.year))
{
query = query.Where(x => x.Year == searchModel.year);
}
return query.OrderByDescending(x => x.StartDateGr).ToList();
}
#endregion
public int FindConnection()
{
int connectionid = 0;
var exist = _context.YearlySalaries.Any(x => x.ConnectionId > 0);
if (exist)
{
connectionid = _context.YearlySalaries.Max(x => x.ConnectionId);
}
else
{
connectionid = 0;
}
return connectionid += 1;
}
// heydari جستجوی مقادیر با سرچ مدل
#region yearlySalarySearchBySearchModel
public EditYearlySalary GetDetailsBySearchModel(YearlySalarySearchModel searchModel)
{
var query = _context.YearlySalaries.FirstOrDefault(x => x.StartDate <= searchModel.StartDateGr && x.EndDate >= searchModel.EndDateGr && x.Year == searchModel.year);
if (query != null)
{
var yearlySalariesObj = new EditYearlySalary()
{
Id = query.id,
StartDate = query.StartDate.ToFarsi(),
EndDate = query.EndDate.ToFarsi(),
ConnectionId = query.ConnectionId,
};
return yearlySalariesObj;
}
else
return null;
}
#endregion
// محاسبه حق تاهل
#region MarriedAlloance
public double MarriedAllowance(DateTime endDateW, long employeeId)
{
var getEmployee = _context.Employees.FirstOrDefault(x => x.id == employeeId);
if (getEmployee == null)
{
return 0;
}
if (getEmployee.MaritalStatus == "متاهل")
{
var endDateInput = _context.YearlySalaries
.SingleOrDefault(x => x.StartDate <= endDateW && x.EndDate >= endDateW);
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "حق تاهل");
if (FirstItems == null)
{
return 0;
}
return FirstItems.ItemValue;
}
else
{
return 0;
}
}
#endregion
//سنوات
#region yeaers
public BunosesAndYearsPayStatus Years(DateTime separationStartDate, DateTime leftWorkDate, DateTime separationEndDate, double daylyWage, string yearsOptions,
bool hasleft, DateTime startWorkDate, DateTime contractStart, DateTime contractEnd, long workshopId, long employeeId, bool isOldContract)
{
BunosesAndYearsPayStatus finalResult = new BunosesAndYearsPayStatus();
var startDateFa = separationEndDate.ToFarsi();
var checkoutMonth = startDateFa.Substring(5, 2);
double result = 0;
var start1403 = new DateTime(2024, 3, 20);
switch (yearsOptions)
{
case "OnCheckoutOfMonth":
var totalCheckoutDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalCheckoutDays;
break;
//محاسبه در پایان سال به شرطی که قرارداد منتهی به پایان سال باشد
case "OnEndOfYear"://درپایان سال
if (isOldContract && contractEnd < start1403)
{
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
else if (isOldContract && contractEnd > start1403)
{
if ((hasleft && leftWorkDate <= separationEndDate) || (checkoutMonth == "12" && separationEndDate == contractEnd))
{
//بدست آوردن اولین روز سال
var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
// اگر تاریخ شروع بکار بزرگتر مساوی روز اول همین سال بود از تازیخ شوع بکار استفاده میشود در غیر اینصورت از روز اول سال استفاده میشود
var startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldYearsPay = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundYearsPay = ((foundDayliWage * 30) / 365) * foundTotaldays;
sumOfOldYearsPay += foundYearsPay;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthYearsPay = ((daylyWage * 30) / 365) * totalDays;
finalResult.YearsPay = lastMonthYearsPay + sumOfOldYearsPay;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
}
}
else if (!isOldContract)
{
if ((hasleft && leftWorkDate <= separationEndDate) || (checkoutMonth == "12" && separationEndDate == contractEnd))
{
//بدست آوردن اولین روز سال
var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
var startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldYearsPay = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundYearsPay = ((foundDayliWage * 30) / 365) * foundTotaldays;
sumOfOldYearsPay += foundYearsPay;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthYearsPay = ((daylyWage * 30) / 365) * totalDays;
finalResult.YearsPay = lastMonthYearsPay + sumOfOldYearsPay;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
//var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
//result = (daylyWage * 30) / 365 * totalDays;
}
}
break;
//از شروع بکار تا ترک کار
case "OnLeftWork"://درپایان همکاری
if (isOldContract && contractEnd < start1403)
{
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
else if (isOldContract && contractEnd > start1403)
{
if ((hasleft && leftWorkDate <= separationEndDate))
{
//بدست آوردن اولین روز سال
var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
// اگر تاریخ شروع بکار بزرگتر مساوی روز اول همین سال بود از تازیخ شوع بکار استفاده میشود در غیر اینصورت از روز اول سال استفاده میشود
var startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
}
else if (!isOldContract)
{
if ((hasleft && leftWorkDate <= separationEndDate))
{
var totalDays = (separationEndDate - startWorkDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
}
break;
// از شروع قراداد تا پایان قراداد یا ترک کار
case "OnEndOfContract"://در پایان قرارداد
var start1403EndOfContract = new DateTime(2024, 3, 20);
if (isOldContract && contractEnd < start1403EndOfContract)
{
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
else if (isOldContract && contractEnd > start1403)
{
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
{
var totalDays = (separationEndDate - contractStart).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
}else if (!isOldContract)
{
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
{
var totalDays = (separationEndDate - contractStart).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
}
break;
case "EndOfContract1402LeftWork1403": //پایان قرارداد قبل 403 پایان همکاری بعد 403
if (contractStart >= start1403 && contractEnd > start1403)// بعد از 1403
{
if (hasleft && leftWorkDate <= separationEndDate)//اگر ترک کار کرده بود
{
//اگر شروع بکار بعد از 1403 بود تاریخ شرو بکار را در نظر میگیرد در غیر اینصورت اولین روز 1403 را در نظر میگیرد
var startComputeDay = startWorkDate >= start1403 ? startWorkDate : start1403;
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
}
}
else if (contractStart < start1403 && contractEnd < start1403)// قبل از 1403
{
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
//if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)// اگر ترک کار کرده بود یا فیش آخر قراداد بود
//{
// var totalDays = (separationEndDate - contractStart).TotalDays + 1;
// result = (daylyWage * 30) / 365 * totalDays;
//}
}
break;
default:
finalResult.YearsPay = 0;
break;
}
return finalResult;
}
#endregion
//مزد مرخصی
#region LeavePay
public LeaveAndAbsenceViewModel LeavePay(string startDateFa, DateTime leftWorkDate, DateTime separationStartDate, DateTime separationEndDate,
double daylyWage, string computeOptions, bool hasleft, DateTime startWorkDate, DateTime contractStart,
DateTime contractEnd, long workshopId, long employeeId, int fridayStartToEnd, int officialHoliday, string totalHoursH, string totalHorsM, double consumableItem,
double housingAllowance, double familyAllowance, double marriedAllowance, bool isOldContract)
{
var result = new LeaveAndAbsenceViewModel();
// ماه فیش آخر
var checkoutMonth = startDateFa.Substring(5, 2);
// بدست آوردن مقدار مجاژ مرخصی پرسنل در این فیش
#region HoursPerDay
// روز های کارکرد فیش
var totalChekoutDays = (separationEndDate - separationStartDate).TotalDays + 1;
//تعداد روزهای موظفی این فیش حقوقی
//var mandatoryWorkingDay = totalChekoutDays - (fridayStartToEnd + officialHoliday);
//تبدیل ساعت به عدد
var totalHoursHDouble = Convert.ToDouble(totalHoursH);
var totalHoursMDouble = Convert.ToDouble(totalHorsM);
if (totalHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
totalHoursMDouble = totalHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این ماه
var totalHours = totalHoursHDouble + totalHoursMDouble;
var checkoutMandatoryDays = _mandatoryHoursRepository.GetMondatoryDays(separationStartDate, separationEndDate);
// میانگین ساعت کارکرد پرسنل در روز
var hoursePerDay = totalHours / checkoutMandatoryDays.MoandatoryDays;
// {مقدار ساعت مجاز مرخصی در برای یک روز{کامل
var leaveHoursesPerDay = 190.58 / 365;
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
double canToLeave = 0;
//مزد مرخصی برای یک ساعت
#region MyRegion
//مقدار مزد روزانه برای یک ساعت
var LeaveDayliFee = daylyWage / 7.33;// مورد سوم - به این روش برای بک ساعت مرد مرخصی درست است
//اقلام مصرفی برای یک ساعت
var LeaveConoumableItemsStep1 = consumableItem / totalChekoutDays;
var LeaveConsumableItems = LeaveConoumableItemsStep1 / 7.33;
//کمک هزینه مسکن برای یک ساعت
var LeavehousingAllowanceStep1 = housingAllowance / totalChekoutDays;
var LeaveHousingAllowance = LeavehousingAllowanceStep1 / 7.33;
//حق عائله مندی برای یک ساعت
var LeavefamilyAllowanceStep1 = familyAllowance / totalChekoutDays;
var LeaveFamilyAllowance = LeavefamilyAllowanceStep1 / 7.33;
//حق تاهل برای یک ساعت
var LeavemarriedAllowanceStep1 = marriedAllowance / totalChekoutDays;
var LeaveMarriedAllowance = LeavemarriedAllowanceStep1 / 7.33;
var leavePayPerHours = LeaveDayliFee + LeaveConsumableItems + LeaveHousingAllowance + LeaveFamilyAllowance + LeaveMarriedAllowance;
#endregion
//غیبت برای یک ساعت
double absenceDeductionPerHourses = leavePayPerHours;
//if (hoursePerDay < 7.33)
//{
// //مقدار مزد روزانه برای یک ساعت
// var dayliFee = daylyWage / hoursePerDay;
// //اقلام مصرفی برای یک ساعت
// var ConoumableItemsStep1 = consumableItem / 30;
// var ConsumableItems = ConoumableItemsStep1 / hoursePerDay;
// //کمک هزینه مسکن برای یک ساعت
// var housingAllowanceStep1 = housingAllowance / 30;
// var HousingAllowance = housingAllowanceStep1 / hoursePerDay;
// //حق عائله مندی برای یک ساعت
// var familyAllowanceStep1 = familyAllowance / 30;
// var FamilyAllowance = familyAllowanceStep1 / hoursePerDay;
// //حق تاهل برای یک ساعت
// var marriedAllowanceStep1 = marriedAllowance / 30;
// var MarriedAllowance = marriedAllowanceStep1 / hoursePerDay;
// //مزد مرخصی این پرسنل به ازای یک ساعت
// absenceDeductionPerHourses = dayliFee + ConsumableItems + HousingAllowance + FamilyAllowance + MarriedAllowance;
//}
//else
//{
// //مزد مرخصی این پرسنل به ازای یک ساعت
// absenceDeductionPerHourses = LeaveDayliFee + LeaveConsumableItems + LeaveHousingAllowance + LeaveFamilyAllowance + LeaveMarriedAllowance;
//}
#endregion
//بدست آوردن اولین روز سال
var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
var start1403 = new DateTime(2024, 3, 20);
switch (computeOptions)
{
case "OnCheckoutOfMonth":
var resCanToLeave = OnCheckoutCantoleaveList(separationStartDate, separationEndDate, workshopId, employeeId,
leaveHoursesPerDay, totalChekoutDays, hoursePerDay);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = resCanToLeave.CanToLeave;
//مزد مرخصی
result.LeavPay = resCanToLeave.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resCanToLeave.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resCanToLeave.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = hoursePerDay;
break;
//محاسبه در پایان سال به شرطی که قرارداد منتهی به پایان سال باشد
case "OnEndOfYear":
if (isOldContract && contractEnd < start1403)
{
var resEndOfYear = OnCheckoutCantoleaveList(separationStartDate, separationEndDate, workshopId, employeeId,
leaveHoursesPerDay, totalChekoutDays, hoursePerDay);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = resEndOfYear.CanToLeave;
//مزد مرخصی
result.LeavPay = resEndOfYear.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resEndOfYear.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resEndOfYear.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = hoursePerDay;
}
else if(isOldContract && contractEnd > start1403)
{
var startDate = startWorkDate >= start1403 ? startWorkDate: start1403;
var endOfYearRes = EndOfYearCantoleaveList(startDate, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if ((hasleft && leftWorkDate <= separationEndDate) || (separationEndDate == contractEnd && checkoutMonth == "12"))
{
var end = EndOfYearCantoleaveList(startDate, separationEndDate, workshopId, employeeId,
hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM,
separationStartDate);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
var canTolv = endOfYearRes.CanToLeave;
var absence = end.Sum(x => x.PeriodOfAbsence);
if (canTolv >= absence)
{
canTolv -= absence;
absence = 0;
}
else
{
absence -= canTolv;
canTolv = 0;
}
//مزد مرخصی
//result.LeavPay = endOfYearRes.CanToLeave * leavePayPerHours;
result.LeavPay = canTolv * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = absence;
////مدت طلب مرخصی
result.CreditLeaves = canTolv;
//کسری غیبت
result.AbsenceDeduction = absence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = end.FirstOrDefault()!.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = endOfYearRes.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = endOfYearRes.PeriodOfAbsence;
//کسری غیبت
//result.AbsenceDeduction = endOfYearRes.PeriodOfAbsence * absenceDeductionPerHourses;
result.AbsenceDeduction = 0;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = endOfYearRes.WorkingPerDayHourses;
}
}
else if (!isOldContract)
{
var endOfYearRes = EndOfYearCantoleaveList(startWorkDate, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if ((hasleft && leftWorkDate <= separationEndDate) || (separationEndDate == contractEnd && checkoutMonth == "12"))
{
var end = EndOfYearCantoleaveList(startWorkDate, separationEndDate, workshopId, employeeId,
hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM,
separationStartDate);
var canTolv = endOfYearRes.CanToLeave;
var absence = end.Sum(x => x.PeriodOfAbsence);
if (canTolv >= absence)
{
canTolv -= absence;
absence = 0;
}
else
{
absence -= canTolv;
canTolv = 0;
}
result.LeavPay = canTolv * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = absence;
////مدت طلب مرخصی
result.CreditLeaves = canTolv;
//کسری غیبت
result.AbsenceDeduction = absence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = end.FirstOrDefault()!.WorkingPerDayHourses;
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
//مزد مرخصی
//result.LeavPay = endOfYearRes.CanToLeave * leavePayPerHours;
//مدت غیبت
//result.AbsencePeriod = endOfYearRes.PeriodOfAbsence;
//کسری غیبت
//result.AbsenceDeduction = endOfYearRes.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
//result.AverageHoursPerDay = endOfYearRes.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = endOfYearRes.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = endOfYearRes.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = endOfYearRes.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = endOfYearRes.WorkingPerDayHourses;
}
}
break;
case "OnLeftWork"://درپایان همکاری
if (isOldContract && contractEnd < start1403)
{
var resLeftWork = OnCheckoutCantoleaveList(separationStartDate, separationEndDate, workshopId, employeeId,
leaveHoursesPerDay, totalChekoutDays, hoursePerDay);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = resLeftWork.CanToLeave;
//مزد مرخصی
result.LeavPay = resLeftWork.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resLeftWork.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resLeftWork.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = hoursePerDay;
}
else if (isOldContract && contractEnd > start1403)
{
var startDate = startWorkDate >= start1403 ? startWorkDate : start1403;
var res = LeftWorkCantoleaveList(startDate, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if (hasleft && leftWorkDate <= separationEndDate)
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = 0;
//مزد مرخصی
result.LeavPay = res.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = res.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = res.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = res.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = res.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = res.WorkingPerDayHourses;
}
}
else if (!isOldContract)
{
var res = LeftWorkCantoleaveList(startWorkDate, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if (hasleft && leftWorkDate <= separationEndDate)
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = 0;
//مزد مرخصی
result.LeavPay = res.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = res.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = res.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = res.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = res.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = res.WorkingPerDayHourses;
}
}
break;
case "OnEndOfContract"://در پایان قرارداد
if (isOldContract && contractEnd < start1403)
{
var resEndOfContract = OnCheckoutCantoleaveList(separationStartDate, separationEndDate, workshopId, employeeId,
leaveHoursesPerDay, totalChekoutDays, hoursePerDay);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = resEndOfContract.CanToLeave;
//مزد مرخصی
result.LeavPay = resEndOfContract.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resEndOfContract.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resEndOfContract.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = hoursePerDay;
}
else if ((isOldContract && contractEnd > start1403) || (!isOldContract))
{
var resEndOfContract = LeftWorkCantoleaveList(contractStart, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if (resEndOfContract != null)
{
if ((hasleft && leftWorkDate <= separationEndDate) || resEndOfContract.LastChekoutOfContract)
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = 0;
//مزد مرخصی
result.LeavPay = resEndOfContract.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resEndOfContract.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resEndOfContract.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = resEndOfContract.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = resEndOfContract.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = resEndOfContract.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resEndOfContract.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = resEndOfContract.WorkingPerDayHourses;
}
}
}
break;
case "EndOfContract1402LeftWork1403": //پایان قرارداد قبل 403 پایان همکاری بعد 403
if (contractStart >= start1403 && contractEnd > start1403)// بعد از 1403
{
//تاریخ شروع یافتن قرادادها
var startSearchContracts = startWorkDate >= start1403 ? startWorkDate : start1403;
//تمام قراداد ها از تاریخ شروع تا پایان این فیش
var ress = LeftWorkCantoleaveList(startSearchContracts, separationEndDate, workshopId, employeeId, hasleft, leftWorkDate, fridayStartToEnd, officialHoliday, totalHoursH, totalHorsM, separationStartDate)
.FirstOrDefault(x => x.ContractStart == separationStartDate);
if (hasleft && leftWorkDate <= separationEndDate)
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = 0;
//مزد مرخصی
result.LeavPay = ress.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = ress.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = ress.PeriodOfAbsence * absenceDeductionPerHourses; ;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = ress.WorkingPerDayHourses;
}
else
{
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = false;
//مدت طلب مرخصی
result.CreditLeaves = ress.CanToLeave;
//مزد مرخصی
result.LeavPay = 0;
//مدت غیبت
result.AbsencePeriod = ress.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = ress.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = ress.WorkingPerDayHourses;
}
}
else if (contractEnd < start1403)// قبل از 1403
{
var resCanTo1402 = OnCheckoutCantoleaveList(separationStartDate, separationEndDate, workshopId, employeeId,
leaveHoursesPerDay, totalChekoutDays, hoursePerDay);
//وضعیت تصفیه مزد مرخصی
result.LeaveCheckout = true;
////مدت طلب مرخصی
result.CreditLeaves = resCanTo1402.CanToLeave;
//مزد مرخصی
result.LeavPay = resCanTo1402.CanToLeave * leavePayPerHours;
//مدت غیبت
result.AbsencePeriod = resCanTo1402.PeriodOfAbsence;
//کسری غیبت
result.AbsenceDeduction = resCanTo1402.PeriodOfAbsence * absenceDeductionPerHourses;
//میانگین ساعت کار در یک روز
result.AverageHoursPerDay = hoursePerDay;
}
break;
default:
result = new LeaveAndAbsenceViewModel();
break;
}
return result;
}
public List<ContractsCanToLeave> LeftWorkCantoleaveList(DateTime startDate, DateTime endDate, long workshopId, long employeeId, bool hasleft, DateTime leftWorkDate, int fridayStartToEnd, int officialHoliday, string totalHoursH, string totalHorsM, DateTime separationStartDate)
{
// {مقدار ساعت مجاز مرخصی در برای یک روز{کامل
var leaveHoursesPerDay = 190.58 / 365;
var contactCanToleaveList = new List<ContractsCanToLeave>();
var allContractsBetween = _context.Contracts.AsSplitQuery().Include(x => x.WorkingHoursList)
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
x.ContractEnd >= startDate && x.ContarctStart <= endDate).ToList();
int mandatoryDays = 0;
double allCanToLeave = 0;
double canToLeave = 0;
int contractCounter = 0;
foreach (var contract in allContractsBetween)
{
contractCounter += 1;
var m = _mandatoryHoursRepository.GetMondatoryDays(contract.ContarctStart,
contract.ContractEnd);
var workinghoursH = contract.WorkingHoursList.Select(x => x.TotalHoursesH).FirstOrDefault();
var workinghoursM = contract.WorkingHoursList.Select(x => x.TotalHoursesM).FirstOrDefault();
workinghoursM = string.IsNullOrWhiteSpace(workinghoursM) ? "0" : workinghoursM;
var workingHoursHDouble = Convert.ToDouble(workinghoursH);
var workingHoursMDouble = Convert.ToDouble(workinghoursM);
if (workingHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
workingHoursMDouble = workingHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این ماه
var totalWorkingHours = workingHoursHDouble + workingHoursMDouble;
// میانگین ساعت کارکرد پرسنل در روز
var workingHoursePerDay = totalWorkingHours / m.MoandatoryDays;
// از شروع قرارداد تا پایان قرارداد
var totalDays = (contract.ContractEnd - contract.ContarctStart).TotalDays + 1;
double leftChekoutCanToleave = 0;
double leftleaveHoursesPerTotalDays = 0;
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
var leaveHoursesPerTotalDays = leaveHoursesPerDay * totalDays;
double thisContractCanToLeavPerDay = 0;
double leftThisContractCanToLeavePerDay = 0;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
thisContractCanToLeavPerDay = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
//if (hasleft && leftWorkDate <= endDate)
//{
// leftThisContractCanToLeavePerDay = (leftleaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
//}
}
else
{
workingHoursePerDay = 7.33;
thisContractCanToLeavPerDay = leaveHoursesPerTotalDays;
//if (hasleft && leftWorkDate <= endDate)
//{
// leftThisContractCanToLeavePerDay = leftleaveHoursesPerTotalDays;
//}
}
//canToLeave = allCanToLeave + thisContractCanToLeavPerDay;
//leftChekoutCanToleave = allCanToLeave + leftThisContractCanToLeavePerDay;
var sdate = contract.ContarctStart.ToFarsi();
var edate = contract.ContractEnd.ToFarsi();
// اگر فیش در قرارداد جاری حلقه بود تا تاریخ پایان فیش برو
if (separationStartDate >= contract.ContarctStart && separationStartDate < contract.ContractEnd)
edate = endDate.ToFarsi();
var syear = Convert.ToInt32(sdate.Substring(0, 4));
var smonth = Convert.ToInt32(sdate.Substring(5, 2));
var sday = Convert.ToInt32(sdate.Substring(8, 2));
var eyear = Convert.ToInt32(edate.Substring(0, 4));
var emonth = Convert.ToInt32(edate.Substring(5, 2));
var eday = Convert.ToInt32(edate.Substring(8, 2));
var d1 = new PersianDateTime(syear, smonth, sday);
var d2 = new PersianDateTime(eyear, emonth, eday);
for (var currntMonth = d1; currntMonth <= d2; currntMonth = currntMonth.AddMonths(1))
{
var startMonthFa = $"{currntMonth}";
var startMonthGr = new DateTime();
if (currntMonth == d1)
{
var d1Fa = $"{d1}";
startMonthGr = d1Fa.ToGeorgianDateTime();
}
else
{
var a = $"{startMonthFa.Substring(0, 8)}01";
startMonthGr = a.ToGeorgianDateTime();
}
var endMonthFa = startMonthFa.FindeEndOfMonth();
var endMonthGr = endMonthFa.ToGeorgianDateTime();
bool left = false;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
left = true;
if (endMonthGr > leftWorkDate)
endMonthGr = endDate;
}
#region 365
double canToLeavAfter365 = 0;
bool is365 = false;
var countChekoutDays = (int)((endMonthGr - startMonthGr).TotalDays + 1);
var beforeCountDays = contactCanToleaveList.MaxBy(x => x.ContractStart);
if (beforeCountDays != null)
{
if (!beforeCountDays.EndOfYear)
{
var sumCounDays = countChekoutDays + beforeCountDays.CountChekoutDays;
if (sumCounDays > 365)
{
is365 = true;
countChekoutDays = sumCounDays - 365;
// مقدار ساعت مجاز مرخصی باقی مانده بعد از 365 روز
leaveHoursesPerTotalDays = 7.33 * 9;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
canToLeavAfter365 = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
canToLeavAfter365 = leaveHoursesPerTotalDays;
}
}
else
{
countChekoutDays = sumCounDays;
}
}
}
#endregion
var leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startMonthGr && x.EndLeave >= startMonthGr) ||
(x.StartLeave <= endMonthGr && x.EndLeave >= endMonthGr) ||
(x.StartLeave >= startMonthGr && x.StartLeave <= endMonthGr) ||
(x.EndLeave >= startMonthGr && x.EndLeave <= endMonthGr)).ToList();
//مرخصی استفاده شده در این ماه
double usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startDate ? startDate : item.StartLeave;
end = item.EndLeave > endDate ? endDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
//طلب مرخصی این ماه
double creditLeaves = 0;
// مزد مرخصی
double leavePay = 0;
//مدت غیبت
double periodOfAbsence = 0;
double absenceDeduction = 0;
var beforContactCanToleave = new ContractsCanToLeave();
var beforContractCount = contractCounter - 1;
if (contactCanToleaveList.Count > 0)
{
//آخری قبل از این
beforContactCanToleave = contactCanToleaveList.MaxBy(x => x.ContractStart);
canToLeave = beforContactCanToleave.CanToLeave;
if (beforContactCanToleave.LastChekoutOfContract)
canToLeave = thisContractCanToLeavPerDay + beforContactCanToleave.CanToLeave;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
if (canToLeave > 0)
{
#region LeftChekoutCanToLeave
var leftMonthtotalDays = Convert.ToInt32((leftWorkDate - contract.ContarctStart).TotalDays + 1);
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{ترک کار شده
leaveHoursesPerTotalDays = leaveHoursesPerDay * leftMonthtotalDays;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
thisContractCanToLeavPerDay = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
workingHoursePerDay = 7.33;
thisContractCanToLeavPerDay = leaveHoursesPerTotalDays;
}
if (contactCanToleaveList.Any(x => x.LastChekoutOfContract && x.ContractCounter == beforContractCount))
{
var b = contactCanToleaveList.FirstOrDefault(x =>
x.LastChekoutOfContract && x.ContractCounter == beforContractCount);
canToLeave = thisContractCanToLeavPerDay + b.CanToLeave;
}
else
{
canToLeave = thisContractCanToLeavPerDay;
}
leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= contract.ContarctStart && x.EndLeave >= contract.ContarctStart) ||
(x.StartLeave <= leftWorkDate && x.EndLeave >= leftWorkDate) ||
(x.StartLeave >= contract.ContarctStart && x.StartLeave <= leftWorkDate) ||
(x.EndLeave >= contract.ContarctStart && x.EndLeave <= leftWorkDate)).ToList();
usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startDate ? startDate : item.StartLeave;
end = item.EndLeave > endDate ? endDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
#endregion
}
else
{
var checkAbsenceDeduction = contactCanToleaveList
.Where(x => x.CanToLeave == 0 && x.ContractStart >= contract.ContarctStart).MaxBy(x => x.ContractStart);
if (checkAbsenceDeduction != null)
{
var startSerach = checkAbsenceDeduction.ContractEnd.AddDays(1);
leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startSerach && x.EndLeave >= startSerach) ||
(x.StartLeave <= leftWorkDate && x.EndLeave >= leftWorkDate) ||
(x.StartLeave >= startSerach && x.StartLeave <= leftWorkDate) ||
(x.EndLeave >= startSerach && x.EndLeave <= leftWorkDate)).ToList();
usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startSerach ? startSerach : item.StartLeave;
end = item.EndLeave > leftWorkDate ? leftWorkDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
}
}
}
}
else
{
canToLeave = thisContractCanToLeavPerDay;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
var leftMonthtotalDays = Convert.ToInt32((leftWorkDate - contract.ContarctStart).TotalDays + 1);
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
leaveHoursesPerTotalDays = leaveHoursesPerDay * leftMonthtotalDays;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
canToLeave = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
workingHoursePerDay = 7.33;
canToLeave = leaveHoursesPerTotalDays;
}
}
}
;
if (canToLeave >= usedLeaves) //اگر طلب مرخصی داشت
{
creditLeaves = canToLeave - usedLeaves;
var has365 = contactCanToleaveList.Any(x => x.Is365);
//اگر از 365 روز تجاوز کرد و باقی مانده مرخصی بیشتر از 9 روز بود فقط 9 روز بماند
if (is365 && !has365 && creditLeaves > canToLeavAfter365 && !left)
{
creditLeaves = canToLeavAfter365;
}
if (is365 && has365 && !left)
{
var last365 = contactCanToleaveList
.Where(x => x.Is365)
.MaxBy(x => x.ContractStart);
canToLeavAfter365 += last365.CanToLeave;
if (creditLeaves > canToLeavAfter365)
{
creditLeaves = canToLeavAfter365;
}
}
periodOfAbsence = 0;
}
else
{
periodOfAbsence = usedLeaves - canToLeave;
#region AbsenceItemsCompute
//var consumableItems = ConsumableItems(endMonthGr);
//var housingAllowance = HousingAllowance(endMonthGr);
//var familyAllowance = FamilyAllowance(employeeId, endMonthGr);
//var marriedAllowance = MarriedAllowance(endMonthGr, employeeId);
//var leftworkList = _leftWorkRepository.search(new LeftWorkSearchModel(){EmployeeId = employeeId,WorkshopId = workshopId});
//if (leftworkList == null)
// leftworkList = new List<LeftWorkViewModel>();
////دستمزد تجمیعی تا این تاریخ
//var dayliFeeResult = DayliFeeComputing(startDate, contract.ContarctStart, endDate, employeeId, workshopId, leftworkList);
//var dayliFeeComplete = dayliFeeResult.DayliFee.MoneyToDouble();
//if (workingHoursePerDay < 7.33)
//{
// //مقدار مزد روزانه برای یک ساعت
// //var contractDayliFee = contract.DayliWage.MoneyToDouble();
// var dayliFee = dayliFeeComplete / workingHoursePerDay;
// var HousingAllowonceNumberType = housingAllowance.MoneyToDouble();
// var HousingStep1 = HousingAllowonceNumberType / 30;
// var HousingPerHourse = HousingStep1 / workingHoursePerDay;
// var consumableItemsNumberType = consumableItems.MoneyToDouble();
// var consumableItemsStep1 = consumableItemsNumberType / 30;
// var consumablePerHourse = consumableItemsStep1 / workingHoursePerDay;
// var MarriedStep1 = marriedAllowance / 30;
// var MarriedPerHours = MarriedStep1 / workingHoursePerDay;
// var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
// var familyAllowanceStep1 = familyAllowanceNumberType / 30;
// var familyPerHours = familyAllowanceStep1 / workingHoursePerDay;
// //کسری غیبت این پرسنل به ازای یک ساعت
// var absencePerHourse = dayliFee + HousingPerHourse + consumablePerHourse + MarriedPerHours + familyPerHours;
// absenceDeduction = absencePerHourse * periodOfAbsence;
//}
//else
//{
// //مقدار مزد روزانه برای یک ساعت
// var dayliFee = dayliFeeComplete / 7.33;
// var HousingAllowonceNumberType = housingAllowance.MoneyToDouble();
// var HousingStep1 = HousingAllowonceNumberType / 30;
// var HousingPerHourse = HousingStep1 / 7.33;
// var consumableItemsNumberType = consumableItems.MoneyToDouble();
// var consumableItemsStep1 = consumableItemsNumberType / 30;
// var consumablePerHourse = consumableItemsStep1 / 7.33;
// var MarriedStep1 = marriedAllowance / 30;
// var MarriedPerHours = MarriedStep1 / 7.33;
// var familyAllowanceNumberType = familyAllowance.MoneyToDouble();
// var familyAllowanceStep1 = familyAllowanceNumberType / 30;
// var familyPerHours = familyAllowanceStep1 / 7.33;
// //کسری غیبت این پرسنل به ازای یک ساعت
// var absencePerHourse = dayliFee + HousingPerHourse + consumablePerHourse + MarriedPerHours + familyPerHours;
// absenceDeduction = absencePerHourse * periodOfAbsence;
//}
#endregion
creditLeaves = 0;
}
bool lastChekout = endMonthGr == contract.ContractEnd;
contactCanToleaveList.Add(new ContractsCanToLeave()
{
ContractCounter = contractCounter,
WorkingPerDayHourses = workingHoursePerDay,
ContractStart = startMonthGr,
ContractEnd = endMonthGr,
CanToLeave = creditLeaves,
PeriodOfAbsence = periodOfAbsence,
AbsenceDeduction = absenceDeduction,
LastChekoutOfContract = lastChekout,
Left = left,
CountChekoutDays = countChekoutDays,
Is365 = is365,
});
}
allCanToLeave = canToLeave;
}
return contactCanToleaveList;
}
public List<ContractsCanToLeave> EndOfYearCantoleaveList(DateTime startDate, DateTime endDate, long workshopId, long employeeId, bool hasleft,
DateTime leftWorkDate, int fridayStartToEnd, int officialHoliday, string totalHoursH, string totalHorsM,
DateTime separationStartDate)
{
// {مقدار ساعت مجاز مرخصی در برای یک روز{کامل
var leaveHoursesPerDay = 190.58 / 365;
var contactCanToleaveList = new List<ContractsCanToLeave>();
var allContractsBetween = _context.Contracts.AsSplitQuery().Include(x => x.WorkingHoursList)
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId &&
x.ContractEnd >= startDate && x.ContarctStart <= endDate).OrderBy(x=>x.ContarctStart).ToList();
double canToLeave = 0;
int contractCounter = 0;
foreach (var contract in allContractsBetween)
{
contractCounter += 1;
var m = _mandatoryHoursRepository.GetMondatoryDays(contract.ContarctStart,
contract.ContractEnd);
// میانگین ساعت کارکرد پرسنل در روز
#region PersonelWorkingHoursPerDay
var workinghoursH = contract.WorkingHoursList.Select(x => x.TotalHoursesH).FirstOrDefault();
var workinghoursM = contract.WorkingHoursList.Select(x => x.TotalHoursesM).FirstOrDefault();
//workinghoursH = string.IsNullOrWhiteSpace(workinghoursH) ? "0" : workinghoursH;
workinghoursM = string.IsNullOrWhiteSpace(workinghoursM) ? "0" : workinghoursM;
var workingHoursHDouble = Convert.ToDouble(workinghoursH);
var workingHoursMDouble = Convert.ToDouble(workinghoursM);
if (workingHoursMDouble > 0)
{
//تبیدل دقیه به اعشار
workingHoursMDouble = workingHoursMDouble / 60;
}
//کل ساعت کار پرسنل در این قرارداد
var totalWorkingHours = workingHoursHDouble + workingHoursMDouble;
// میانگین ساعت کارکرد پرسنل در روز
var workingHoursePerDay = totalWorkingHours / m.MoandatoryDays;
#endregion
// مقدار ساعت استاندارد مرخصی در این قرارداد
#region StandardCanToleave
// از شروع قرارداد تا پایان قرارداد
var totalDays = (contract.ContractEnd - contract.ContarctStart).TotalDays + 1;
double leftChekoutCanToleave = 0;
double leftleaveHoursesPerTotalDays = 0;
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
var leaveHoursesPerTotalDays = leaveHoursesPerDay * totalDays;
#endregion
//مقدار ساعت مجاز مرخصی پرسنل در این قرارداد
#region PersonelCanToLeave
double personelCanToLeave = 0;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
personelCanToLeave = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
workingHoursePerDay = 7.33;
personelCanToLeave = leaveHoursesPerTotalDays;
}
#endregion
double leftThisContractCanToLeavePerDay = 0;
var sdate = contract.ContarctStart.ToFarsi();
var edate = contract.ContractEnd.ToFarsi();
// اگر فیش در قرارداد جاری حلقه بود تا تاریخ پایان فیش برو
if (separationStartDate >= contract.ContarctStart && separationStartDate < contract.ContractEnd)
edate = endDate.ToFarsi();
var syear = Convert.ToInt32(sdate.Substring(0, 4));
var smonth = Convert.ToInt32(sdate.Substring(5, 2));
var sday = Convert.ToInt32(sdate.Substring(8, 2));
var eyear = Convert.ToInt32(edate.Substring(0, 4));
var emonth = Convert.ToInt32(edate.Substring(5, 2));
var eday = Convert.ToInt32(edate.Substring(8, 2));
var d1 = new PersianDateTime(syear, smonth, sday);
var d2 = new PersianDateTime(eyear, emonth, eday);
for (var currntMonth = d1; currntMonth <= d2; currntMonth = currntMonth.AddMonths(1))
{
var startMonthFa = $"{currntMonth}";
var startMonthGr = new DateTime();
if (currntMonth == d1)
{
var d1Fa = $"{d1}";
startMonthGr = d1Fa.ToGeorgianDateTime();
}
else
{
var a = $"{startMonthFa.Substring(0, 8)}01";
startMonthGr = a.ToGeorgianDateTime();
}
var endMonthFa = startMonthFa.FindeEndOfMonth();
bool isEndOfYear = endMonthFa.Substring(5, 2) == "12";
var endMonthGr = endMonthFa.ToGeorgianDateTime();
bool left = false;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
left = true;
if (endMonthGr > leftWorkDate)
endMonthGr = endDate;
}
#region 365
double canToLeavAfter365 = 0;
bool is365 = false;
var countChekoutDays = (int)((endMonthGr - startMonthGr).TotalDays + 1);
var beforeCountDays = contactCanToleaveList.MaxBy(x => x.ContractStart);
if (beforeCountDays != null)
{
if (!beforeCountDays.EndOfYear)
{
var sumCounDays = countChekoutDays + beforeCountDays.CountChekoutDays;
if (sumCounDays > 365)
{
is365 = true;
countChekoutDays = sumCounDays - 365;
// مقدار ساعت مجاز مرخصی باقی مانده بعد از 365 روز
leaveHoursesPerTotalDays = 7.33 * 9;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
canToLeavAfter365 = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
canToLeavAfter365 = leaveHoursesPerTotalDays;
}
}
else
{
countChekoutDays = sumCounDays;
}
}
}
#endregion
var leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startMonthGr && x.EndLeave >= startMonthGr) ||
(x.StartLeave <= endMonthGr && x.EndLeave >= endMonthGr) ||
(x.StartLeave >= startMonthGr && x.StartLeave <= endMonthGr) ||
(x.EndLeave >= startMonthGr && x.EndLeave <= endMonthGr)).ToList();
//مرخصی استفاده شده در این ماه
double usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startDate ? startDate : item.StartLeave;
end = item.EndLeave > endDate ? endDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
//طلب مرخصی این ماه
double creditLeaves = 0;
// مزد مرخصی
double leavePay = 0;
//مدت غیبت
double periodOfAbsence = 0;
double absenceDeduction = 0;
var beforContactCanToleave = new ContractsCanToLeave();
var beforContractCount = contractCounter - 1;
if (contactCanToleaveList.Count > 0)
{
//آخری قبل از این
beforContactCanToleave = contactCanToleaveList.MaxBy(x => x.ContractStart);
if (beforContactCanToleave.EndOfYear)
{
canToLeave = personelCanToLeave;
}
else
{
canToLeave = beforContactCanToleave.CanToLeave;
}
if (beforContactCanToleave.LastChekoutOfContract && !beforContactCanToleave.EndOfYear)
canToLeave = personelCanToLeave + beforContactCanToleave.CanToLeave;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
if (canToLeave > 0)
{
#region LeftChekoutCanToLeave
var check365 = contactCanToleaveList.FirstOrDefault(x =>
x.ContractStart >= contract.ContarctStart && x.Is365);
if (check365 != null)
{
var startAfter365 = check365.ContractEnd.AddDays(1);
canToLeave = check365.CanToLeave;
leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startAfter365 && x.EndLeave >= startAfter365) ||
(x.StartLeave <= leftWorkDate && x.EndLeave >= leftWorkDate) ||
(x.StartLeave >= startAfter365 && x.StartLeave <= leftWorkDate) ||
(x.EndLeave >= startAfter365 && x.EndLeave <= leftWorkDate)).ToList();
usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startAfter365 ? startAfter365 : item.StartLeave;
end = item.EndLeave > leftWorkDate ? leftWorkDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
}
else
{
var leftMonthtotalDays = Convert.ToInt32((leftWorkDate - contract.ContarctStart).TotalDays + 1);
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{ترک کار شده
leaveHoursesPerTotalDays = leaveHoursesPerDay * leftMonthtotalDays;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
personelCanToLeave = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
workingHoursePerDay = 7.33;
personelCanToLeave = leaveHoursesPerTotalDays;
}
if (contactCanToleaveList.Any(x => x.LastChekoutOfContract && x.ContractCounter == beforContractCount && !x.EndOfYear))
{
var b = contactCanToleaveList.FirstOrDefault(x =>
x.LastChekoutOfContract && x.ContractCounter == beforContractCount && !x.EndOfYear);
canToLeave = personelCanToLeave + b.CanToLeave;
}
else
{
canToLeave = personelCanToLeave;
}
leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= contract.ContarctStart && x.EndLeave >= contract.ContarctStart) ||
(x.StartLeave <= leftWorkDate && x.EndLeave >= leftWorkDate) ||
(x.StartLeave >= contract.ContarctStart && x.StartLeave <= leftWorkDate) ||
(x.EndLeave >= contract.ContarctStart && x.EndLeave <= leftWorkDate)).ToList();
usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < contract.ContarctStart ? contract.ContarctStart : item.StartLeave;
end = item.EndLeave > leftWorkDate ? leftWorkDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
}
#endregion
}
else
{
var checkAbsenceDeduction = contactCanToleaveList
.Where(x => x.CanToLeave == 0 && x.ContractStart >= contract.ContarctStart)
.MaxBy(x => x.ContractStart);
if (checkAbsenceDeduction != null)
{
var startSerach = checkAbsenceDeduction.ContractEnd.AddDays(1);
leaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startSerach && x.EndLeave >= startSerach) ||
(x.StartLeave <= leftWorkDate && x.EndLeave >= leftWorkDate) ||
(x.StartLeave >= startSerach && x.StartLeave <= leftWorkDate) ||
(x.EndLeave >= startSerach && x.EndLeave <= leftWorkDate)).ToList();
usedLeaves = 0;
if (leaveList.Count > 0)
{
foreach (var item in leaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startSerach ? startSerach : item.StartLeave;
end = item.EndLeave > leftWorkDate ? leftWorkDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * workingHoursePerDay;
usedLeaves += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeaves += usedLeave;
}
}
}
}
}
}
}
else
{
canToLeave = personelCanToLeave;
if (hasleft && leftWorkDate >= startMonthGr && leftWorkDate <= endMonthGr)
{
var leftMonthtotalDays = Convert.ToInt32((leftWorkDate - contract.ContarctStart).TotalDays + 1);
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
leaveHoursesPerTotalDays = leaveHoursesPerDay * leftMonthtotalDays;
if (workingHoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
canToLeave = (leaveHoursesPerTotalDays * workingHoursePerDay) / 7.33;
}
else
{
workingHoursePerDay = 7.33;
canToLeave = leaveHoursesPerTotalDays;
}
}
}
bool lastChekout = endMonthGr == contract.ContractEnd;
bool endOfyear = lastChekout && isEndOfYear;
#region NewcChanges
var has365B = contactCanToleaveList.Any(x => x.Is365);
creditLeaves = canToLeave;
//اگر از 365 روز تجاوز کرد و باقی مانده مرخصی بیشتر از 9 روز بود فقط 9 روز بماند
if (is365 && !has365B && creditLeaves > canToLeavAfter365 && !left && !endOfyear)
{
creditLeaves = canToLeavAfter365;
}
if (is365 && has365B && !left && !endOfyear)
{
var last365 = contactCanToleaveList
.Where(x => x.Is365)
.MaxBy(x => x.ContractStart);
canToLeavAfter365 += last365.CanToLeave;
if (creditLeaves > canToLeavAfter365)
{
creditLeaves = canToLeavAfter365;
}
}
periodOfAbsence = usedLeaves;
#endregion
contactCanToleaveList.Add(new ContractsCanToLeave()
{
ContractCounter = contractCounter,
WorkingPerDayHourses = workingHoursePerDay,
ContractStart = startMonthGr,
ContractEnd = endMonthGr,
CanToLeave = creditLeaves,
PeriodOfAbsence = periodOfAbsence,
AbsenceDeduction = absenceDeduction,
LastChekoutOfContract = lastChekout,
Left = left,
EndOfYear = endOfyear,
CountChekoutDays = countChekoutDays,
Is365 = is365,
});
}
}
return contactCanToleaveList;
}
public ContractsCanToLeave OnCheckoutCantoleaveList(DateTime startDate, DateTime endDate, long workshopId, long employeeId,
double leaveHoursesPerDay, double totalChekoutDays, double hoursePerDay)
{
double checkoutCanToLeave = 0;
// {مقدار ساعت مجاز مرخصی در مدت این فیش حقوقی{کامل
var starndardHoursesPerTotalDays = leaveHoursesPerDay * totalChekoutDays;
if (hoursePerDay < 7.33)
{
// تناسب مجدد به نسبت ساعات کمتر از 7/33 برای بدست آوردن ساعت مجاز مرخصی این پرسنل
checkoutCanToLeave = (starndardHoursesPerTotalDays * hoursePerDay) / 7.33;
}
else
{
hoursePerDay = 7.33;
checkoutCanToLeave = starndardHoursesPerTotalDays;
}
//بدست آوردن مرخصی این ماه
var checkoutLeaveList = _context.LeaveList.AsSplitQuery()
.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId)
.Where(x => x.LeaveType == "استحقاقی" && x.IsAccepted)
.Where(x =>
(x.StartLeave <= startDate && x.EndLeave >= startDate) ||
(x.StartLeave <= endDate && x.EndLeave >= endDate) ||
(x.StartLeave >= startDate && x.StartLeave <= endDate) ||
(x.EndLeave >= startDate && x.EndLeave <= endDate)).ToList();
//مرخصی استفاده شده در این ماه
double usedLeavesChekout = 0;
if (checkoutLeaveList.Count > 0)
{
foreach (var item in checkoutLeaveList)
{
var start = new DateTime();
var end = new DateTime();
start = item.StartLeave < startDate ? startDate : item.StartLeave;
end = item.EndLeave > endDate ? endDate : item.EndLeave;
if (item.PaidLeaveType == "روزانه")
{
var leaveSpan = (end - start).TotalDays + 1;
var usedLeave = leaveSpan * hoursePerDay;
usedLeavesChekout += usedLeave;
}
else
{
var leavingHourses = TimeSpan.Parse(item.LeaveHourses);
var usedLeave = (leavingHourses.TotalMinutes) / 60;
usedLeavesChekout += usedLeave;
}
}
}
double creditLeaves = 0;
double periodOfAbsence = 0;
if (checkoutCanToLeave >= usedLeavesChekout) //اگر طلب مرخصی داشت
{
creditLeaves = checkoutCanToLeave - usedLeavesChekout;
periodOfAbsence = 0;
}
else
{
periodOfAbsence = usedLeavesChekout - checkoutCanToLeave;
creditLeaves = 0;
}
var result = new ContractsCanToLeave()
{
CanToLeave = creditLeaves,
PeriodOfAbsence = periodOfAbsence,
};
return result;
}
public async Task<HolidayApiVewModel> HolidayGregorian(DateTime gregorianDate)
{
var result = new HolidayApiVewModel();
var gregorianStr = gregorianDate.ToString("MM/dd/yyyy");
var month = gregorianStr.Substring(0, 2);
var day = gregorianStr.Substring(3, 2);
var year = gregorianStr.Substring(6, 4);
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"https://holidayapi.ir/gregorian/{year}/{month}/{day}");
request.Headers.Add("Cookie", "XSRF-TOKEN=eyJpdiI6IjFrOTRrM0tFeVh5ZHFnNis3K0xZQVE9PSIsInZhbHVlIjoidlQ5TEg3c2hGYTVYeU0zRU9ha2NWTWpnYWRLMWxWSG9NWm5JYXhiaC8xRzliSlpmZGp2TlExd0VtL0JIL2JYWXNnVEREeTZNNDd1VHRQdjlQajFCNUxHZkwvdExWb3hCc25IMndUdEVwdDJ4T3drbkdhRTdscVoxNUxDeVNNOTciLCJtYWMiOiJkNjY4NGNkZWI3NGNkMzA1YWUyMjQxNGU5MWYwMjVlMGE1OGQzMjhkYTQ1NGE5NzcyNjA3NGNhM2RjOGI2NDVmIiwidGFnIjoiIn0%3D; holidayapi_session=eyJpdiI6IkdxRGx1NUZsRnlJazUwS3JhRUgrMFE9PSIsInZhbHVlIjoiclZ2U0hQZTErZ3duQmZXWmV6WjlvR1JTWEpwZHRSR0p2YytFOENUYzg0R1JBOGZHcWI1TzhFTEtIRjdXQy9Qa0doY0RXR2pBRGZTOEN3cGJsVEtTcC9uSkliOWZ6U3ZJRkFvY3N0TytWSGJwNWt2dWhKTmI0bnJOb09Ic3NJd0siLCJtYWMiOiI2MTk4YzNjNTdmODJmNDVkZTM5YWE2OTcyNGJiYzI1MTM1ZTViYTZlZTVhZTNhMzNmY2U5NzM1OThiOTg5YThlIiwidGFnIjoiIn0%3D");
var response = await client.SendAsync(request);
var success = response.IsSuccessStatusCode;
if (success)
{
var res = await response.Content.ReadAsStringAsync();
var convertedRes = JsonConvert.DeserializeObject<HolidayJsonResult>(res);
result.IsHoliday = convertedRes.IsHoliday;
result.IsSuccess = true;
}
return result;
}
public async Task<HolidayApiVewModel> HolidayShamsi(string shamsiDate)
{
var result = new HolidayApiVewModel();
var year = shamsiDate.Substring(0, 4);
var month = shamsiDate.Substring(5, 2);
var day = shamsiDate.Substring(8, 2);
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, $"https://holidayapi.ir/gregorian/{year}/{month}/{day}");
request.Headers.Add("Cookie", "XSRF-TOKEN=eyJpdiI6IjFrOTRrM0tFeVh5ZHFnNis3K0xZQVE9PSIsInZhbHVlIjoidlQ5TEg3c2hGYTVYeU0zRU9ha2NWTWpnYWRLMWxWSG9NWm5JYXhiaC8xRzliSlpmZGp2TlExd0VtL0JIL2JYWXNnVEREeTZNNDd1VHRQdjlQajFCNUxHZkwvdExWb3hCc25IMndUdEVwdDJ4T3drbkdhRTdscVoxNUxDeVNNOTciLCJtYWMiOiJkNjY4NGNkZWI3NGNkMzA1YWUyMjQxNGU5MWYwMjVlMGE1OGQzMjhkYTQ1NGE5NzcyNjA3NGNhM2RjOGI2NDVmIiwidGFnIjoiIn0%3D; holidayapi_session=eyJpdiI6IkdxRGx1NUZsRnlJazUwS3JhRUgrMFE9PSIsInZhbHVlIjoiclZ2U0hQZTErZ3duQmZXWmV6WjlvR1JTWEpwZHRSR0p2YytFOENUYzg0R1JBOGZHcWI1TzhFTEtIRjdXQy9Qa0doY0RXR2pBRGZTOEN3cGJsVEtTcC9uSkliOWZ6U3ZJRkFvY3N0TytWSGJwNWt2dWhKTmI0bnJOb09Ic3NJd0siLCJtYWMiOiI2MTk4YzNjNTdmODJmNDVkZTM5YWE2OTcyNGJiYzI1MTM1ZTViYTZlZTVhZTNhMzNmY2U5NzM1OThiOTg5YThlIiwidGFnIjoiIn0%3D");
var response = await client.SendAsync(request);
var success = response.IsSuccessStatusCode;
if (success)
{
var res = await response.Content.ReadAsStringAsync();
var convertedRes = JsonConvert.DeserializeObject<HolidayJsonResult>(res);
result.IsHoliday = convertedRes.IsHoliday;
result.IsSuccess = true;
}
return result;
}
#endregion
//عیدی
#region Bunoses
public BunosesAndYearsPayStatus Bunoses(string startDateFa, DateTime leftWorkDate, DateTime separationStartDate, DateTime separationEndDate, double daylyWage, string bonusesOptions,
bool hasleft, DateTime startWorkDate, DateTime contractStart, DateTime contractEnd, long workshopId,
long employeeId, bool isOldContract)
{
BunosesAndYearsPayStatus finalResult = new BunosesAndYearsPayStatus();
double result = 0;
// ماه فیش آخر
var checkoutMonth = startDateFa.Substring(5, 2);
var start1403 = new DateTime(2024, 3, 20);
switch (bonusesOptions)
{
case "OnCheckoutOfMonth":
var totalCheckoutDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totalCheckoutDays;
break;
case "OnEndOfYear"://درپایان سال
if (isOldContract && contractEnd < start1403)
{
var totaltDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totaltDays;
}
else if (isOldContract && contractEnd > start1403)
{
if ((hasleft && leftWorkDate <= separationEndDate) || checkoutMonth == "12")
{
//بدست آوردن اولین روز سال
string startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
DateTime startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
// اگر تاریخ شروع بکار بزرگتر مساوی روز اول همین سال بود از تازیخ شوع بکار استفاده میشود در غیر اینصورت از روز اول سال استفاده میشود
DateTime startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldBonuses = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundYearsPay = ((foundDayliWage * 60) / 365) * foundTotaldays;
sumOfOldBonuses += foundYearsPay;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
finalResult.Bunoses = lastMonthBonuses + sumOfOldBonuses;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
}
}
else if(!isOldContract)
{
if ((hasleft && leftWorkDate <= separationEndDate) || checkoutMonth == "12")
{
//بدست آوردن اولین روز سال
var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
var startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldBonuses = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundYearsPay = ((foundDayliWage * 60) / 365) * foundTotaldays;
sumOfOldBonuses += foundYearsPay;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
finalResult.Bunoses = lastMonthBonuses + sumOfOldBonuses;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
}
}
break;
case "OnEndOfContract"://در پایان قرارداد
if (isOldContract && contractEnd < start1403)
{
var totaltDays = (separationEndDate - separationStartDate).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totaltDays;
}
else if (isOldContract && contractEnd > start1403)
{
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
{
//بدست آوردن اولین روز سال
//var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
//var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
var startComputeDay = contractStart;
//var totalDays = (separationEndDate - contractStart).TotalDays + 1;
//result = (daylyWage * 60) / 365 * totalDays;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldBonuses = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundBonuses = ((foundDayliWage * 60) / 365) * foundTotaldays;
sumOfOldBonuses += foundBonuses;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
finalResult.Bunoses = lastMonthBonuses + sumOfOldBonuses;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
}
}
else if(!isOldContract)
{
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
{
var startComputeDay = contractStart;
//var totalDays = (separationEndDate - contractStart).TotalDays + 1;
// finalResult.Bunoses = (daylyWage * 60) / 365 * totalDays;
#region NewCompute
//شروع دوره
string st = startComputeDay.ToFarsi();
int syear = Convert.ToInt32(st.Substring(0, 4));
int smonth = Convert.ToInt32(st.Substring(5, 2));
PersianDateTime startPeriod = new PersianDateTime(syear, smonth, 1);
PersianDateTime startPeriodGr = new PersianDateTime(syear, smonth, 1);
//پایان فیش حقوقی آخر
PersianDateTime endCheckout = separationEndDate.ToPersianDateTime();
if (startPeriod.Year == endCheckout.Year && startPeriod.Month == endCheckout.Month)
{
var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
finalResult.Bunoses = ((daylyWage * 60) / 365) * totalDays;
}
else
{
var checkoutList = _context.CheckoutSet.Where(x => x.EmployeeId == employeeId && x.WorkshopId == workshopId &&
x.ContractStart >= startComputeDay && x.ContractEnd < separationStartDate).AsEnumerable();
//پایان دوره
PersianDateTime endPeriod = (separationStartDate.AddDays(-1)).ToPersianDateTime();
List<BunosesAndYearsPayStatus> nullDateList = new List<BunosesAndYearsPayStatus>();
double sumOfOldBonuses = 0;
for (var startDate = startPeriod; startDate <= endPeriod; startDate = startDate.AddMonths(1))
{
var searchStart = ($"{startDate}").ToGeorgianDateTime();
var searchEnd = (($"{startDate}").FindeEndOfMonth()).ToGeorgianDateTime();
var foundCheckout = checkoutList.FirstOrDefault(x =>
x.ContractStart >= searchStart && x.ContractEnd <= searchEnd);
if (foundCheckout == null)
{
nullDateList.Add(new BunosesAndYearsPayStatus()
{
ContractStart = startDate == startPeriodGr ? startComputeDay : searchStart,
ContractEnd = searchEnd
});
finalResult.NotCompleted = true;
}
else
{
double foundMonthlySalary = foundCheckout.MonthlySalary;
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
double foundDayliWage = foundMonthlySalary / foundTotaldays;
double foundBonuses = ((foundDayliWage * 60) / 365) * foundTotaldays;
sumOfOldBonuses += foundBonuses;
}
}
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
finalResult.Bunoses = lastMonthBonuses + sumOfOldBonuses;
finalResult.BunosesStatusList = nullDateList;
}
#endregion
}
}
break;
//case "EndOfContract1402LeftWork1403": //پایان قرارداد قبل 403 پایان همکاری بعد 403
// if (contractStart >= start1403 && contractEnd > start1403)// بعد از 1403
// {
// if (hasleft && leftWorkDate <= separationEndDate)
// {
// //بدست آوردن اولین روز سال
// var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
// var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
// // اگر تاریخ شروع بکار بزرگتر مساوی روز اول همین سال بود از تازیخ شوع بکار استفاده میشود در غیر اینصورت از روز اول سال استفاده میشود
// var startComputeDay = startWorkDate >= startDayOfYearGr ? startWorkDate : startDayOfYearGr;
// var totalDays = (separationEndDate - startComputeDay).TotalDays + 1;
// result = (daylyWage * 60) / 365 * totalDays;
// }
// }
// else if (contractStart < start1403)// قبل از 1403
// {
// var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
// finalResult.Bunoses = (daylyWage * 60) / 365 * totalDays;
// //if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd || checkoutMonth == "12")
// //{
// // //بدست آوردن اولین روز سال
// // var startDayOfYear = $"{startDateFa.Substring(0, 4)}/01/01";
// // var startDayOfYearGr = startDayOfYear.ToGeorgianDateTime();
// // var startComputeDay = contractStart >= startDayOfYearGr ? contractStart : startDayOfYearGr;
// //}
// }
// break;
default:
finalResult.Bunoses = 0;
break;
}
return finalResult;
}
#endregion
}