3772 lines
180 KiB
C#
3772 lines
180 KiB
C#
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 CompanyManagment.EFCore.Migrations;
|
||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Newtonsoft.Json;
|
||
using PersianTools.Core;
|
||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||
|
||
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));
|
||
|
||
PersianDateTime endDate = new PersianDateTime(y, m, d);
|
||
|
||
if (m == 12)
|
||
endDate.AddYears(1);
|
||
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, bool hasRollCall, bool holidaysWorking, string shiftWork)
|
||
{
|
||
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;
|
||
////اگر حضورغیاب داشت
|
||
//if (hasRollCall)
|
||
var MandatoryDays = TotalDays - fridayStartToEnd - officialholiday;
|
||
|
||
if (!hasRollCall && shiftWork != "4")
|
||
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
|
||
|
||
public void TestDayliFeeCompute()
|
||
{
|
||
//مقادیر سالانه
|
||
var salary = _context.YearlySalaries.Include(i => i.YearlySalaryItemsList).OrderBy(x => x.StartDate).ToList();
|
||
|
||
// یافتن مزد روزانه سال قبل از اولین شروع بکار
|
||
var DayliSalaryStep1 = salary.FirstOrDefault(x => x.Year == "1370")!
|
||
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
|
||
var DayliSalaryStep1Fa = DayliSalaryStep1.ToMoney();
|
||
double firstDayliSalary = DayliSalaryStep1Fa.MoneyToDouble();
|
||
|
||
string firstYear = "1370";
|
||
int counter = 0;
|
||
foreach (var item in salary)
|
||
{
|
||
Console.WriteLine($"{item.Year} - {item.ConnectionId}");
|
||
var currentDayliFee = item!
|
||
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
|
||
var fixFeePercentage = item!
|
||
.YearlySalaryItemsList.Where(x => x.ItemName == "درصد مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
|
||
// مبلغ مزد ثابت سال جاری
|
||
var fixFeePrice = item!.YearlySalaryItemsList
|
||
.Where(x => x.ItemName == "مبلغ مزد ثابت").Select(x => x.ItemValue).FirstOrDefault();
|
||
|
||
if (counter > 0)
|
||
{
|
||
if (firstYear == item.Year)
|
||
{
|
||
int currentYear = Convert.ToInt32(item.Year);
|
||
string lastYear = $"{currentYear - 1}";
|
||
firstDayliSalary = salary.Where(x => x.Year == lastYear).MaxBy(x=>x.StartDate)!
|
||
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
|
||
|
||
}
|
||
// مزد روزانه سال قبل ضربدر درصد مزد ثابت تقسیم بر صد
|
||
var percntSumDaylifee = (firstDayliSalary * fixFeePercentage) / 100;
|
||
// نتیجه عملیات بالا بعلاوه مزد سال قبل
|
||
var Sum = firstDayliSalary + percntSumDaylifee;
|
||
|
||
//مزد پایه
|
||
var BaseResult = Sum + fixFeePrice;
|
||
var baseResultFa = BaseResult.ToMoney();
|
||
var res = GetCurrectFirstDailyFee(BaseResult,item.Year);
|
||
|
||
if (currentDayliFee != res)
|
||
{
|
||
Console.BackgroundColor = ConsoleColor.DarkRed;
|
||
Console.WriteLine($" lastYear : {firstDayliSalary} thisYearOriginal : {currentDayliFee} GetCurrect : {res} falseResut : {BaseResult} ");
|
||
Console.ResetColor();
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine($" lastYear : {firstDayliSalary} thisYearOriginal : {currentDayliFee} GetCurrect : {res} falseResut : {BaseResult} ");
|
||
}
|
||
|
||
//Console.WriteLine($"{item.Year} defualtFa : {currentDayliFee.ToMoney()} dailFeeFa : {BaseResult.ToMoney()} ");
|
||
firstDayliSalary = res;
|
||
firstYear = item.Year;
|
||
|
||
|
||
}
|
||
|
||
counter++;
|
||
}
|
||
|
||
//مقدار اولیه مزد روزانه
|
||
|
||
}
|
||
|
||
private double GetCurrectFirstDailyFee(double value,string year)
|
||
{
|
||
double currected = 0;
|
||
switch (year)
|
||
{
|
||
case "1370": currected = value;
|
||
break;
|
||
case "1371": currected = value;
|
||
break;
|
||
case "1372":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1373":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1374":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1375":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1376":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1377":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1378":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1379":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1380":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1381":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1382":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1383":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1384":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1385":
|
||
currected = value == 49950.4 ? 50000 : value;
|
||
break;
|
||
case "1386":
|
||
currected = value < 61000 ? 61000 : value;
|
||
break;
|
||
case "1387":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1388":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1389":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1390":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1391":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1392":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1393":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1394":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1395":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1396":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1397":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1398":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1399":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1400":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1401":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
case "1402":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1403":
|
||
currected = Math.Round(value, MidpointRounding.ToNegativeInfinity);
|
||
break;
|
||
case "1404":
|
||
currected = Math.Round(value, MidpointRounding.ToPositiveInfinity);
|
||
break;
|
||
default: currected = value;
|
||
break;
|
||
|
||
|
||
}
|
||
|
||
return currected;
|
||
|
||
}
|
||
//محاسبه حقوق روزانه
|
||
#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 = 366;
|
||
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();
|
||
|
||
//مقدار اولیه مزد روزانه
|
||
var DayliSalaryStep1Fa = DayliSalaryStep1.ToMoney();
|
||
double firstDayliSalary = DayliSalaryStep1Fa.MoneyToDouble();
|
||
|
||
DateTime baseYearDate = new DateTime();
|
||
|
||
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 = loopdateFa.YearTotalDays();
|
||
}
|
||
// یک روز به شمارنده روزها اضافه کن
|
||
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;
|
||
BaseResult = GetCurrectFirstDailyFee(BaseResult, test);
|
||
//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();
|
||
var resDouble = salary.FirstOrDefault(x => x.Year == oldYearString)
|
||
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
|
||
var resFa = resDouble.ToMoney();
|
||
BaseResult = resFa.MoneyToDouble();
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
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);
|
||
BaseResult = GetCurrectFirstDailyFee(BaseResult, test);
|
||
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;
|
||
BaseResult = GetCurrectFirstDailyFee(BaseResult, test);
|
||
//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 startContract, DateTime endContract)
|
||
{
|
||
//DateTime zeroTime = new DateTime(1, 1, 1);
|
||
//TimeSpan Age = new TimeSpan();
|
||
|
||
|
||
var endDateInput = _context.YearlySalaries
|
||
.SingleOrDefault(x => x.StartDate <= endContract && x.EndDate >= endContract);
|
||
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "مزد روزانه");
|
||
var dayliSalary = FirstItems.ItemValue;
|
||
var familyAllowance = dayliSalary * 3;
|
||
double sumOfFamilyAllowance = 0;
|
||
DateTime firstDayOFContract = endContract.FindFirstDayOfMonthGr();
|
||
if (startContract < firstDayOFContract)
|
||
startContract = firstDayOFContract;
|
||
var totalContractDays = Convert.ToInt32((endContract - startContract).TotalDays + 1);
|
||
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 < endContract)
|
||
{
|
||
//Age = (endContract - item.DateOfBirth);
|
||
//var ageUp18 = (zeroTime + Age).Year - 1;
|
||
|
||
var childAge = Tools.GetAge(item.DateOfBirth, endContract);
|
||
|
||
if (childAge.yearCount < 18 && insurancHistoey >= 720)
|
||
{
|
||
sumOfFamilyAllowance += familyAllowance;
|
||
|
||
}
|
||
else if (childAge.yearCount == 18 && childAge.monthCount == 0 && insurancHistoey >= 720)
|
||
{
|
||
|
||
if (childAge.dayCount > 0)
|
||
{
|
||
//به دست آوردن روزهای مجاز قبل از 18 سال
|
||
var daysToPay = totalContractDays - childAge.dayCount;
|
||
|
||
if (daysToPay > 0)
|
||
{
|
||
//محاسبه مبلغ بر اساس تعداد روزهای مجاز
|
||
var payPerDay = (familyAllowance / 30) * daysToPay;
|
||
sumOfFamilyAllowance += payPerDay;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
sumOfFamilyAllowance += familyAllowance;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
sumOfFamilyAllowance = 0;
|
||
}
|
||
|
||
//var ress = dayliSalar3 * childeNumber;
|
||
|
||
var result = sumOfFamilyAllowance.ToMoney();
|
||
|
||
|
||
return result;
|
||
}
|
||
|
||
public string FamilyAllowanceAutoExtention(long personelID, DateTime startContract)
|
||
{
|
||
var endDateInput = _context.YearlySalaries
|
||
.SingleOrDefault(x => x.StartDate <= startContract && x.EndDate >= startContract);
|
||
var FirstItems = _context.YearlySalaryItems.SingleOrDefault(x => x.YearlySalaryId == endDateInput.id && x.ItemName == "مزد روزانه");
|
||
var dayliSalary = FirstItems.ItemValue;
|
||
var familyAllowance = dayliSalary * 3;
|
||
double sumOfFamilyAllowance = 0;
|
||
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 < startContract)
|
||
{
|
||
|
||
|
||
var childAge = Tools.GetAge(item.DateOfBirth, startContract);
|
||
|
||
if (childAge.yearCount < 18 && insurancHistoey >= 720)
|
||
{
|
||
sumOfFamilyAllowance += familyAllowance;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
sumOfFamilyAllowance = 0;
|
||
}
|
||
|
||
|
||
|
||
var result = sumOfFamilyAllowance.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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalCheckoutDays);
|
||
break;
|
||
//محاسبه در پایان سال به شرطی که قرارداد منتهی به پایان سال باشد
|
||
case "OnEndOfYear"://درپایان سال
|
||
|
||
if (isOldContract && contractEnd < start1403)
|
||
{
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
var oldTotaldays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundYearsPay = ((foundDayliWage * 30) / 365) * foundTotaldays;
|
||
oldTotaldays += foundTotaldays;
|
||
sumOfOldYearsPay += foundYearsPay;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthYearsPay = ((daylyWage * 30) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotaldays);
|
||
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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
var oldTotaldays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundYearsPay = ((foundDayliWage * 30) / 365) * foundTotaldays;
|
||
oldTotaldays += foundTotaldays;
|
||
sumOfOldYearsPay += foundYearsPay;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthYearsPay = ((daylyWage * 30) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotaldays);
|
||
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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays);
|
||
}
|
||
}
|
||
else if (!isOldContract)
|
||
{
|
||
if ((hasleft && leftWorkDate <= separationEndDate))
|
||
{
|
||
|
||
var totalDays = (separationEndDate - startWorkDate).TotalDays + 1;
|
||
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays);
|
||
}
|
||
else if (isOldContract && contractEnd > start1403)
|
||
{
|
||
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
|
||
{
|
||
var totalDays = (separationEndDate - contractStart).TotalDays + 1;
|
||
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays);
|
||
}
|
||
|
||
}
|
||
else if (!isOldContract)
|
||
{
|
||
if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)
|
||
{
|
||
var totalDays = (separationEndDate - contractStart).TotalDays + 1;
|
||
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays);
|
||
}
|
||
}
|
||
else if (contractStart < start1403 && contractEnd < start1403)// قبل از 1403
|
||
{
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
finalResult.YearsPay = (daylyWage * 30) / 365 * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays);
|
||
//if ((hasleft && leftWorkDate <= separationEndDate) || separationEndDate == contractEnd)// اگر ترک کار کرده بود یا فیش آخر قراداد بود
|
||
//{
|
||
// var totalDays = (separationEndDate - contractStart).TotalDays + 1;
|
||
// result = (daylyWage * 30) / 365 * totalDays;
|
||
//}
|
||
}
|
||
break;
|
||
default:
|
||
finalResult.YearsPay = 0;
|
||
finalResult.TotalDayCompute = 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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{(separationEndDate - separationStartDate).TotalDays + 1}";
|
||
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{resEndOfYear.CountChekoutDays}";
|
||
|
||
}
|
||
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;
|
||
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{endOfYearRes.CountChekoutDays}";
|
||
|
||
}
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = "0";
|
||
|
||
}
|
||
}
|
||
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.TotalDayOfLeaveCompute = $"{endOfYearRes.CountChekoutDays}";
|
||
|
||
//مزد مرخصی
|
||
//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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = "0";
|
||
|
||
}
|
||
}
|
||
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{res.CountChekoutDays}";
|
||
}
|
||
else
|
||
{
|
||
//وضعیت تصفیه مزد مرخصی
|
||
result.LeaveCheckout = false;
|
||
//مدت طلب مرخصی
|
||
result.CreditLeaves = res.CanToLeave;
|
||
//مزد مرخصی
|
||
result.LeavPay = 0;
|
||
//مدت غیبت
|
||
result.AbsencePeriod = res.PeriodOfAbsence;
|
||
//کسری غیبت
|
||
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
|
||
//میانگین ساعت کار در یک روز
|
||
result.AverageHoursPerDay = res.WorkingPerDayHourses;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"0";
|
||
|
||
}
|
||
|
||
}
|
||
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;
|
||
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{res.CountChekoutDays}";
|
||
}
|
||
else
|
||
{
|
||
//وضعیت تصفیه مزد مرخصی
|
||
result.LeaveCheckout = false;
|
||
//مدت طلب مرخصی
|
||
result.CreditLeaves = res.CanToLeave;
|
||
//مزد مرخصی
|
||
result.LeavPay = 0;
|
||
//مدت غیبت
|
||
result.AbsencePeriod = res.PeriodOfAbsence;
|
||
//کسری غیبت
|
||
result.AbsenceDeduction = res.PeriodOfAbsence * absenceDeductionPerHourses;
|
||
//میانگین ساعت کار در یک روز
|
||
result.AverageHoursPerDay = res.WorkingPerDayHourses;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"0";
|
||
|
||
}
|
||
}
|
||
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{(separationEndDate - separationEndDate).TotalDays + 1}";
|
||
|
||
}
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{resEndOfContract.CountChekoutDays}";
|
||
}
|
||
else
|
||
{
|
||
//وضعیت تصفیه مزد مرخصی
|
||
result.LeaveCheckout = false;
|
||
//مدت طلب مرخصی
|
||
result.CreditLeaves = resEndOfContract.CanToLeave;
|
||
//مزد مرخصی
|
||
result.LeavPay = 0;
|
||
//مدت غیبت
|
||
result.AbsencePeriod = resEndOfContract.PeriodOfAbsence;
|
||
//کسری غیبت
|
||
result.AbsenceDeduction = resEndOfContract.PeriodOfAbsence * absenceDeductionPerHourses;
|
||
//میانگین ساعت کار در یک روز
|
||
result.AverageHoursPerDay = resEndOfContract.WorkingPerDayHourses;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"0";
|
||
|
||
}
|
||
}
|
||
}
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{ress.CountChekoutDays}";
|
||
|
||
}
|
||
else
|
||
{
|
||
//وضعیت تصفیه مزد مرخصی
|
||
result.LeaveCheckout = false;
|
||
//مدت طلب مرخصی
|
||
result.CreditLeaves = ress.CanToLeave;
|
||
//مزد مرخصی
|
||
result.LeavPay = 0;
|
||
//مدت غیبت
|
||
result.AbsencePeriod = ress.PeriodOfAbsence;
|
||
//کسری غیبت
|
||
result.AbsenceDeduction = ress.PeriodOfAbsence * absenceDeductionPerHourses;
|
||
//میانگین ساعت کار در یک روز
|
||
result.AverageHoursPerDay = ress.WorkingPerDayHourses;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"0";
|
||
|
||
}
|
||
}
|
||
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;
|
||
// تعداد روزهایی که برای پرسنل مرخصی حساب شده
|
||
result.TotalDayOfLeaveCompute = $"{totalChekoutDays}";
|
||
|
||
}
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * workingHoursePerDay;
|
||
usedLeaves += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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 == "روزانه" && !item.HasShiftDuration)
|
||
{
|
||
var leaveSpan = (end - start).TotalDays + 1;
|
||
var usedLeave = leaveSpan * hoursePerDay;
|
||
usedLeavesChekout += usedLeave;
|
||
}
|
||
else if (item.PaidLeaveType == "روزانه" && item.HasShiftDuration)
|
||
{
|
||
var usedLeave = (item.ShiftDuration.TotalMinutes) / 60;
|
||
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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalCheckoutDays);
|
||
|
||
break;
|
||
case "OnEndOfYear"://درپایان سال
|
||
|
||
if (isOldContract && contractEnd < start1403)
|
||
{
|
||
var totaltDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
finalResult.Bunoses = ((daylyWage * 60) / 365) * totaltDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
var oldTotalDays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundYearsPay = ((foundDayliWage * 60) / 365) * foundTotaldays;
|
||
oldTotalDays += foundTotaldays;
|
||
sumOfOldBonuses += foundYearsPay;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotalDays);
|
||
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;
|
||
var oldTotalDays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundYearsPay = ((foundDayliWage * 60) / 365) * foundTotaldays;
|
||
oldTotalDays += foundTotaldays;
|
||
sumOfOldBonuses += foundYearsPay;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotalDays);
|
||
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;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(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;
|
||
var oldTotalDays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundBonuses = ((foundDayliWage * 60) / 365) * foundTotaldays;
|
||
oldTotalDays += foundTotaldays;
|
||
sumOfOldBonuses += foundBonuses;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotalDays);
|
||
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;
|
||
var oldTotalDays = 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 + foundCheckout.BaseYearsPay;
|
||
int foundTotaldays = Convert.ToInt32(foundCheckout.SumOfWorkingDays);
|
||
double foundDayliWage = foundMonthlySalary / foundTotaldays;
|
||
double foundBonuses = ((foundDayliWage * 60) / 365) * foundTotaldays;
|
||
oldTotalDays += foundTotaldays;
|
||
sumOfOldBonuses += foundBonuses;
|
||
}
|
||
|
||
}
|
||
|
||
var totalDays = (separationEndDate - separationStartDate).TotalDays + 1;
|
||
double lastMonthBonuses = ((daylyWage * 60) / 365) * totalDays;
|
||
finalResult.TotalDayCompute = Convert.ToInt32(totalDays + oldTotalDays);
|
||
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;
|
||
finalResult.TotalDayCompute = 0;
|
||
break;
|
||
}
|
||
|
||
return finalResult;
|
||
}
|
||
|
||
|
||
|
||
#endregion
|
||
|
||
|
||
#region Insurance
|
||
|
||
public InsuranceYearlySalaryModel GetInsuranceItems(DateTime startDate, DateTime endDate, string year)
|
||
{
|
||
var query = _context.YearlySalaries
|
||
.Where(x => x.StartDate <= startDate && x.EndDate >= endDate && x.Year == year)
|
||
.Include(x => x.YearlySalaryItemsList)
|
||
.Select(x => new InsuranceYearlySalaryModel
|
||
{
|
||
DayliWage = x.YearlySalaryItemsList.FirstOrDefault(item => item.ItemName == "مزد روزانه").ItemValue,
|
||
ConsumableItems = x.YearlySalaryItemsList.FirstOrDefault(item => item.ItemName == "کمک هزینه اقلام").ItemValue,
|
||
HousingAllowance = x.YearlySalaryItemsList.FirstOrDefault(item => item.ItemName == "کمک هزینه مسکن").ItemValue,
|
||
MarriedAllowance = x.YearlySalaryItemsList.Any(item => item.ItemName == "حق تاهل") ? x.YearlySalaryItemsList.FirstOrDefault(item => item.ItemName == "حق تاهل").ItemValue : 0,
|
||
|
||
}).FirstOrDefault();
|
||
|
||
return query;
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
private double GetRoundValue(double value)
|
||
{
|
||
string strValue = value.ToString();
|
||
if (strValue.IndexOf('.') > -1)
|
||
{
|
||
|
||
|
||
string a = strValue.Substring(strValue.IndexOf('.') + 1, 1);
|
||
if (int.Parse(a) > 3)
|
||
{
|
||
return (Math.Round(value, MidpointRounding.ToPositiveInfinity));
|
||
}
|
||
else
|
||
{
|
||
return (Math.Round(value, MidpointRounding.ToNegativeInfinity));
|
||
}
|
||
}
|
||
|
||
return value;
|
||
}
|
||
}
|
||
|