diff --git a/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs b/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs
new file mode 100644
index 00000000..e3d5c6c9
--- /dev/null
+++ b/CompanyManagment.App.Contracts/Checkout/Dto/ContractsListToCreateCheckoutDto.cs
@@ -0,0 +1,53 @@
+namespace CompanyManagment.App.Contracts.Checkout.Dto;
+
+public class ContractsListToCreateCheckoutDto
+{
+ ///
+ /// آی دی قراداد
+ ///
+ public long Id { get; set; }
+
+ ///
+ /// کد پرسنلی
+ ///
+ public long PersonnelCode { get; set; }
+
+ ///
+ /// شماره قرارداد
+ ///
+ public string ContractNo { get; set; }
+
+ //نام کارگاه
+ public string WorkshopName { get; set; }
+
+ ///
+ /// نام پرسنل
+ ///
+ public string EmployeeName { get; set; }
+
+ ///
+ /// تاریخ شوع فیش
+ ///
+ public string ContractStart { get; set; }
+ ///
+ /// تاریخ پایان فیش
+ ///
+ public string ContractEnd { get; set; }
+
+ ///
+ /// تاریخ ترک کار
+ ///
+ public string LeftWorkDate { get; set; }
+
+ ///
+ /// وضعیت ایجاد فیش
+ ///
+ public CreateCheckoutStatus CreateCheckoutStatus { get; set; }
+
+
+ ///
+ /// توضیحات
+ ///
+ public string Description { get; set; }
+
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs b/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs
new file mode 100644
index 00000000..f63a750c
--- /dev/null
+++ b/CompanyManagment.App.Contracts/Checkout/Dto/CreateCheckoutStatus.cs
@@ -0,0 +1,22 @@
+namespace CompanyManagment.App.Contracts.Checkout.Dto;
+
+///
+/// وضعیت ایجاد فیش
+///
+public enum CreateCheckoutStatus
+{
+ ///
+ /// آماده ایجاد
+ ///
+ ReadyToCreate,
+
+ ///
+ /// غیر مجاز
+ ///
+ NotValid,
+
+ ///
+ /// دارای فیش حقوقی
+ ///
+ HasCheckout,
+}
\ No newline at end of file
diff --git a/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs b/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs
index 93208f9d..5b938ead 100644
--- a/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs
+++ b/CompanyManagment.App.Contracts/Checkout/ICheckoutApplication.cs
@@ -95,6 +95,18 @@ public interface ICheckoutApplication
///
///
Task> CheckoutPrint(List ids);
+
+ ///
+ /// دریافت لیست قراردادها برای ایجاد فیش حقوقی
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task>> GetContractToCreateCheckout(long workshopId,
+ string year, string month, long employeeId);
+
#endregion
}
diff --git a/CompanyManagment.Application/CheckoutApplication.cs b/CompanyManagment.Application/CheckoutApplication.cs
index 37ac1a18..705ee241 100644
--- a/CompanyManagment.Application/CheckoutApplication.cs
+++ b/CompanyManagment.Application/CheckoutApplication.cs
@@ -34,135 +34,136 @@ namespace CompanyManagment.Application;
public class CheckoutApplication : ICheckoutApplication
{
- private readonly ICheckoutRepository _checkoutRepository;
- private readonly IYearlySalaryRepository _yearlySalaryRepository;
- private readonly ILeftWorkRepository _leftWorkRepository;
- private readonly IEmployerRepository _employerRepository;
- private readonly IPersonalContractingPartyApp _contractingPartyApp;
- private readonly ILeaveApplication _leaveApplication;
- private readonly IMandatoryHoursApplication _mandatoryHoursApplication;
- private readonly IRollCallMandatoryRepository _rollCallMandatoryRepository;
- private readonly IRollCallRepository _rollCallRepository;
- private readonly IHolidayItemApplication _holidayItemApplication;
- private readonly IWorkingHoursTempRepository _workingHoursTempRepository;
- private readonly IWorkshopRepository _workshopRepository;
+ private readonly ICheckoutRepository _checkoutRepository;
+ private readonly IYearlySalaryRepository _yearlySalaryRepository;
+ private readonly ILeftWorkRepository _leftWorkRepository;
+ private readonly IEmployerRepository _employerRepository;
+ private readonly IPersonalContractingPartyApp _contractingPartyApp;
+ private readonly ILeaveApplication _leaveApplication;
+ private readonly IMandatoryHoursApplication _mandatoryHoursApplication;
+ private readonly IRollCallMandatoryRepository _rollCallMandatoryRepository;
+ private readonly IRollCallRepository _rollCallRepository;
+ private readonly IHolidayItemApplication _holidayItemApplication;
+ private readonly IWorkingHoursTempRepository _workingHoursTempRepository;
+ private readonly IWorkshopRepository _workshopRepository;
+
public CheckoutApplication(ICheckoutRepository checkoutRepository, IYearlySalaryRepository yearlySalaryRepository,
- ILeftWorkRepository leftWorkRepository,
- IEmployerRepository employerRepository, IPersonalContractingPartyApp contractingPartyApp, ILeaveApplication leaveApplication, IMandatoryHoursApplication mandatoryHoursApplication, IRollCallMandatoryRepository rollCallMandatoryRepository, IRollCallRepository rollCallRepository, IHolidayItemApplication holidayItemApplication, IWorkingHoursTempRepository workingHoursTempRepository, IWorkshopRepository workshopRepository)
- {
- _checkoutRepository = checkoutRepository;
- _yearlySalaryRepository = yearlySalaryRepository;
- _leftWorkRepository = leftWorkRepository;
- _employerRepository = employerRepository;
- _contractingPartyApp = contractingPartyApp;
- _leaveApplication = leaveApplication;
- _mandatoryHoursApplication = mandatoryHoursApplication;
- _rollCallMandatoryRepository = rollCallMandatoryRepository;
- _rollCallRepository = rollCallRepository;
- _holidayItemApplication = holidayItemApplication;
+ ILeftWorkRepository leftWorkRepository,
+ IEmployerRepository employerRepository, IPersonalContractingPartyApp contractingPartyApp, ILeaveApplication leaveApplication, IMandatoryHoursApplication mandatoryHoursApplication, IRollCallMandatoryRepository rollCallMandatoryRepository, IRollCallRepository rollCallRepository, IHolidayItemApplication holidayItemApplication, IWorkingHoursTempRepository workingHoursTempRepository, IWorkshopRepository workshopRepository)
+ {
+ _checkoutRepository = checkoutRepository;
+ _yearlySalaryRepository = yearlySalaryRepository;
+ _leftWorkRepository = leftWorkRepository;
+ _employerRepository = employerRepository;
+ _contractingPartyApp = contractingPartyApp;
+ _leaveApplication = leaveApplication;
+ _mandatoryHoursApplication = mandatoryHoursApplication;
+ _rollCallMandatoryRepository = rollCallMandatoryRepository;
+ _rollCallRepository = rollCallRepository;
+ _holidayItemApplication = holidayItemApplication;
_workingHoursTempRepository = workingHoursTempRepository;
_workshopRepository = workshopRepository;
}
- [SuppressMessage("ReSharper.DPA", "DPA0007: Large number of DB records", MessageId = "count: 241")]
- public void Create(CreateCheckout command)
- {
- var operation = new OperationResult();
- var syear = Convert.ToInt32(command.ContractStart.Substring(0, 4));
- var smonth = Convert.ToInt32(command.ContractStart.Substring(5, 2));
- string month = string.Empty;
- switch (smonth)
- {
- case 1:
- month = "فروردین";
- break;
- case 2:
- month = "اردیبهشت";
- break;
- case 3:
- month = "خرداد";
- break;
- case 4:
- month = "تیر";
- break;
- case 5:
- month = "مرداد";
- break;
- case 6:
- month = "شهریور";
- break;
- case 7:
- month = "مهر";
- break;
- case 8:
- month = "آبان";
- break;
- case 9:
- month = "آذر";
- break;
- case 10:
- month = "دی";
- break;
- case 11:
- month = "بهمن";
- break;
- case 12:
- month = "اسفند";
- break;
- }
- var year = syear.ToString();
+ [SuppressMessage("ReSharper.DPA", "DPA0007: Large number of DB records", MessageId = "count: 241")]
+ public void Create(CreateCheckout command)
+ {
+ var operation = new OperationResult();
+ var syear = Convert.ToInt32(command.ContractStart.Substring(0, 4));
+ var smonth = Convert.ToInt32(command.ContractStart.Substring(5, 2));
+ string month = string.Empty;
+ switch (smonth)
+ {
+ case 1:
+ month = "فروردین";
+ break;
+ case 2:
+ month = "اردیبهشت";
+ break;
+ case 3:
+ month = "خرداد";
+ break;
+ case 4:
+ month = "تیر";
+ break;
+ case 5:
+ month = "مرداد";
+ break;
+ case 6:
+ month = "شهریور";
+ break;
+ case 7:
+ month = "مهر";
+ break;
+ case 8:
+ month = "آبان";
+ break;
+ case 9:
+ month = "آذر";
+ break;
+ case 10:
+ month = "دی";
+ break;
+ case 11:
+ month = "بهمن";
+ break;
+ case 12:
+ month = "اسفند";
+ break;
+ }
+ var year = syear.ToString();
- #region SickLeav
+ #region SickLeav
- //var serachModel = new LeaveSearchModel()
- //{
- // EmployeeId = command.EmployeeId,
- // WorkshopId = command.WorkshopId,
- // LeaveType = "استعلاجی",
- // StartLeave = command.ContractStart,
- // EndLeave = command.ContractEnd,
- // IsAccepted = true,
- //};
- //var leavList = _leaveApplication.search(serachModel);
- // int sickLeaveCount = 0;
- //if (leavList.Count > 0)
- //{
+ //var serachModel = new LeaveSearchModel()
+ //{
+ // EmployeeId = command.EmployeeId,
+ // WorkshopId = command.WorkshopId,
+ // LeaveType = "استعلاجی",
+ // StartLeave = command.ContractStart,
+ // EndLeave = command.ContractEnd,
+ // IsAccepted = true,
+ //};
+ //var leavList = _leaveApplication.search(serachModel);
+ // int sickLeaveCount = 0;
+ //if (leavList.Count > 0)
+ //{
- // foreach (var leave in leavList)
- // {
- // if (leave.StartLeaveGr < command.ContractStartGr && leave.EndLeaveGr <= command.ContractEndGr)
- // {
- // int res = (int)((leave.EndLeaveGr - command.ContractStartGr).TotalDays +1);
- // sickLeaveCount += res;
- // }
- // else if (leave.StartLeaveGr >= command.ContractStartGr && leave.EndLeaveGr > command.ContractEndGr)
- // {
- // int res = (int)((command.ContractEndGr - leave.StartLeaveGr).TotalDays + 1);
- // sickLeaveCount += res;
- // }
- // else
- // {
- // int res = (int)((leave.EndLeaveGr - leave.StartLeaveGr).TotalDays + 1);
- // sickLeaveCount += res;
- // }
+ // foreach (var leave in leavList)
+ // {
+ // if (leave.StartLeaveGr < command.ContractStartGr && leave.EndLeaveGr <= command.ContractEndGr)
+ // {
+ // int res = (int)((leave.EndLeaveGr - command.ContractStartGr).TotalDays +1);
+ // sickLeaveCount += res;
+ // }
+ // else if (leave.StartLeaveGr >= command.ContractStartGr && leave.EndLeaveGr > command.ContractEndGr)
+ // {
+ // int res = (int)((command.ContractEndGr - leave.StartLeaveGr).TotalDays + 1);
+ // sickLeaveCount += res;
+ // }
+ // else
+ // {
+ // int res = (int)((leave.EndLeaveGr - leave.StartLeaveGr).TotalDays + 1);
+ // sickLeaveCount += res;
+ // }
- // }
- //}
+ // }
+ //}
- #endregion
+ #endregion
- var dayliWage = command.DayliWage.MoneyToDouble();
- // کمک هزینه اقلام
- var consumableItem = command.ConsumableItems.MoneyToDouble();
- //حق اولاد
- var familyAllowance = command.FamilyAllowance.MoneyToDouble();
- //کمک هزینه مسکن
- var housingAllowance = command.HousingAllowance.MoneyToDouble();
- //حق تاهل
- var marriedAllowance = command.MarriedAllowance.MoneyToDouble();
+ var dayliWage = command.DayliWage.MoneyToDouble();
+ // کمک هزینه اقلام
+ var consumableItem = command.ConsumableItems.MoneyToDouble();
+ //حق اولاد
+ var familyAllowance = command.FamilyAllowance.MoneyToDouble();
+ //کمک هزینه مسکن
+ var housingAllowance = command.HousingAllowance.MoneyToDouble();
+ //حق تاهل
+ var marriedAllowance = command.MarriedAllowance.MoneyToDouble();
//var MontlyYearsBunos =
//_yearlySalaryRepository.GetMontlyBunosYears(command.WeeklyTime, command.ContractStartGr, command.ContractEndGr, dayliWage, command.WorkingWeeklyTime, command.officialholiday, command.friday, command.TotalHolidaysAndNotH, command.TotalHolidaysAndNotM, command.Basic, command.FridayStarttoEnd, command.DailFeeComplete, command.HasRollCall, command.HolidayWorking, command.ShiftWork);
//دستمزد ماهانه
@@ -183,8 +184,8 @@ public class CheckoutApplication : ICheckoutApplication
//سنوات
var years = command.YearsPay;
- //عیدی و پاداش
- var bunos = command.BonusesPay;
+ //عیدی و پاداش
+ var bunos = command.BonusesPay;
//فاطمه احمدژاد === موقت عیدی و پاداش و سنوات حساب نشه
if (command.EmployeeId == 45104 && command.WorkshopId == 315)
@@ -195,12 +196,12 @@ public class CheckoutApplication : ICheckoutApplication
}
var sumOfWorkingDays = $"{totalDays}";
- if (command.friday > 0)
- {
- var fridayPercent = dayliWage * 40 / 100;
- //فوق العاده جمعه کاری
- command.FridayPay = fridayPercent * command.friday;
- }
+ if (command.friday > 0)
+ {
+ var fridayPercent = dayliWage * 40 / 100;
+ //فوق العاده جمعه کاری
+ command.FridayPay = fridayPercent * command.friday;
+ }
//حق بیمه سهم کارگر
#region InsuranceDeduction
@@ -208,7 +209,7 @@ public class CheckoutApplication : ICheckoutApplication
bool hasInsuranceShareTheSameAsList = false;
if (command.InsuranceDeduction == 0)
{
- var insuranceOverTime = command.HasInsuranceChekoutOverTime ? command.OvertimePay : 0;
+ var insuranceOverTime = command.HasInsuranceChekoutOverTime ? command.OvertimePay : 0;
insuranceDeduction = (monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + insuranceOverTime) * 7 / 100;
}
else
@@ -222,213 +223,213 @@ public class CheckoutApplication : ICheckoutApplication
if (command.OvertimePay > 0 && command.AbsenceDeduction > 0)
- {
- if (command.AbsenceDeduction >= command.OvertimePay)
- {
- command.AbsenceDeduction = command.AbsenceDeduction - command.OvertimePay;
- command.OvertimePay = 0;
+ {
+ if (command.AbsenceDeduction >= command.OvertimePay)
+ {
+ command.AbsenceDeduction = command.AbsenceDeduction - command.OvertimePay;
+ command.OvertimePay = 0;
command.OverTimeWorkValue = "00:00";
}
- else
- {
- command.OvertimePay = command.OvertimePay - command.AbsenceDeduction;
- command.AbsenceDeduction = 0;
- }
+ else
+ {
+ command.OvertimePay = command.OvertimePay - command.AbsenceDeduction;
+ command.AbsenceDeduction = 0;
+ }
- }
- var checkoutStart = $"{command.Year}/{command.Month}/01";
- var checkoutEnd = checkoutStart.FindeEndOfMonth();
- var salaryAids =
- _rollCallMandatoryRepository.SalaryAidsForCheckout(command.EmployeeId, command.WorkshopId, checkoutStart.ToGeorgianDateTime(), checkoutEnd.ToGeorgianDateTime())
- .Select(x => new CheckoutSalaryAid(x.Amount, x.SalaryAidDateTimeGe, x.SalaryAidDateTimeFa, x.CalculationDateTimeGe, x.CalculationDateTimeFa, x.Id)).ToList();
+ }
+ var checkoutStart = $"{command.Year}/{command.Month}/01";
+ var checkoutEnd = checkoutStart.FindeEndOfMonth();
+ var salaryAids =
+ _rollCallMandatoryRepository.SalaryAidsForCheckout(command.EmployeeId, command.WorkshopId, checkoutStart.ToGeorgianDateTime(), checkoutEnd.ToGeorgianDateTime())
+ .Select(x => new CheckoutSalaryAid(x.Amount, x.SalaryAidDateTimeGe, x.SalaryAidDateTimeFa, x.CalculationDateTimeGe, x.CalculationDateTimeFa, x.Id)).ToList();
- command.SalaryAidDeduction = salaryAids.Sum(x => x.Amount.MoneyToDouble());
-
- var loanInstallments = _rollCallMandatoryRepository.LoanInstallmentForCheckout(command.EmployeeId,
- command.WorkshopId, command.ContractStartGr, command.HasLeft ? DateTime.MaxValue : command.ContractEndGr)
- .Select(x =>
- new CheckoutLoanInstallment(x.Amount, x.Month, x.Year, x.IsActive, x.RemainingAmount, x.LoanAmount, x.Id)).ToList();
+ command.SalaryAidDeduction = salaryAids.Sum(x => x.Amount.MoneyToDouble());
- command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
+ var loanInstallments = _rollCallMandatoryRepository.LoanInstallmentForCheckout(command.EmployeeId,
+ command.WorkshopId, command.ContractStartGr, command.HasLeft ? DateTime.MaxValue : command.ContractEndGr)
+ .Select(x =>
+ new CheckoutLoanInstallment(x.Amount, x.Month, x.Year, x.IsActive, x.RemainingAmount, x.LoanAmount, x.Id)).ToList();
-
-
-
- var firstDayOfMonth = $"{command.ContractStart.Substring(0, 8)}01".ToGeorgianDateTime();
- var firstDayOfCurrentMonth = new DateTime(syear, smonth, 1, new PersianCalendar());
-
- LeaveSearchModel sickLeaveSearch = new LeaveSearchModel()
- {
- EmployeeId = command.EmployeeId,
- WorkshopId = command.WorkshopId,
- StartLeaveGr = command.ContractStartGr,
- EndLeaveGr = command.ContractEndGr,
- IsAccepted = true,
- };
- var leaves = _leaveApplication.search(sickLeaveSearch);
-
- firstDayOfMonth.AddMonthsFa(1, out var lastDayOfCurrentMonth);
-
- lastDayOfCurrentMonth = lastDayOfCurrentMonth.AddDays(-1);
-
- int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1;
-
- var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel()
- {
- HolidayYear = command.ContractStartGr.ToFarsiYear()
- });
- //all the dates from start to end, to be compared with present days to get absent dates
- var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => firstDayOfCurrentMonth.AddDays(offset).Date).ToList();
-
- var absentRecords = completeDaysList
- .ExceptBy(command.GroupedRollCalls.Select(x => x.CreationDate.Date), y => y.Date)
- .Select(x =>
- {
- var leave = leaves.FirstOrDefault(y =>
- y.EmployeeId == command.EmployeeId && y.EndLeaveGr.Date >= x.Date && y.StartLeaveGr.Date <= x.Date);
- var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date);
- var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday;
- var isNormalWorkingDay = isHoliday == false && isFriday == false;
- return new CheckoutDailyRollCallViewModel()
- {
- StartDate1 = null,
- EndDate1 = null,
- DateTimeGr = x.Date,
- DayOfWeek = x.Date.DayOfWeek.ToString(),
- RollCallDateFa = x.Date.ToFarsi(),
- LeaveType = leave != null ? leave.LeaveType : "",
- IsAbsent = leave == null && isNormalWorkingDay
- };
- });
-
- var presentDays = command.GroupedRollCalls.Select(x =>
- {
-
- var orderedRollcalls = x.ShiftList.OrderBy(y => y.Start);
-
- var rollCallTimeSpanPerDay = x.SumOneDaySpan;
- TimeSpan breakTimePerDay = x.BreakTime;
-
- return new CheckoutDailyRollCallViewModel()
- {
- StartDate1 = orderedRollcalls.FirstOrDefault().Start.ToString("HH:mm"),
- EndDate1 = orderedRollcalls.FirstOrDefault().EndWithOutResTime.ToString("HH:mm"),
-
- StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.Start.ToString("HH:mm") ?? "",
- EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndWithOutResTime.ToString("HH:mm") ?? "",
-
- TotalhourseSpan = rollCallTimeSpanPerDay,
-
- BreakTimeTimeSpan = breakTimePerDay,
-
- DayOfWeek = x.CreationDate.DayOfWeek.DayOfWeeKToPersian(),
- RollCallDateFa = x.CreationDate.Date.ToFarsi(),
- DateTimeGr = x.CreationDate.Date,
- IsSliced = x.ShiftList.Count() > 2,
- IsAbsent = false
- };
- });
-
-
- presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel
- {
- StartDate1 = x.StartDate1,
- EndDate1 = x.EndDate1,
- EndDate2 = x.EndDate2,
- StartDate2 = x.StartDate2,
- TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes:00}",
- BreakTimeString = $"{(int)(x.BreakTimeTimeSpan.TotalHours)}:{x.BreakTimeTimeSpan.Minutes:00}",
- TotalhourseSpan = x.TotalhourseSpan,
- BreakTimeTimeSpan = x.BreakTimeTimeSpan,
- DayOfWeek = x.DayOfWeek,
- RollCallDateFa = x.RollCallDateFa,
- DateTimeGr = x.DateTimeGr,
- IsSliced = x.IsSliced,
- IsAbsent = false
- });
-
- var result = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList();
- result.ForEach(x =>
- {
- x.IsHoliday = holidays.Any(y => x.DateTimeGr.Date == y.HolidaydateGr.Date);
- x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday;
- });
-
- var checkoutRollCallDays = result.Select(x => new CheckoutRollCallDay(x.DateTimeGr,
- x.StartDate1, x.EndDate1, x.StartDate2, x.EndDate2,
- x.BreakTimeTimeSpan, x.IsSliced, x.TotalhourseSpan, x.IsAbsent, x.IsFriday, x.IsHoliday, x.LeaveType))
- .ToList();
-
-
- double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(syear, smonth);
- int mandatoryWholeHours = (int)mandatoryHours;
- int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
-
- var totalMandatoryHours = TimeSpan.FromHours(mandatoryWholeHours).Add(TimeSpan.FromMinutes(mandatoryMinutes));
- var checkoutRollCall = new CheckoutRollCall(totalMandatoryHours, command.TotalPresentTimeSpan, command.TotalBreakTimeSpan,
- command.TotalWorkingTimeSpan, command.TotalPaidLeave, command.TotalSickLeave, checkoutRollCallDays);
+ command.InstallmentDeduction = loanInstallments.Sum(x => x.AmountForMonth.MoneyToDouble());
- var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
- command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay;
- var totalClaims = totalClaimsDouble.ToMoney();
- var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
- var totalDeductions = totalDeductionDouble.ToMoney();
- var totalPayment = totalClaimsDouble - totalDeductionDouble;
+ var firstDayOfMonth = $"{command.ContractStart.Substring(0, 8)}01".ToGeorgianDateTime();
+ var firstDayOfCurrentMonth = new DateTime(syear, smonth, 1, new PersianCalendar());
- if (_checkoutRepository.Exists(x =>
- x.Month == command.Month && x.Year == command.Year && x.ContractNo == command.ContractNo))
- {
- operation.Failed("امکان ثبت رکورد تکراری وجود ندارد");
- }
- else
- {
- if (string.IsNullOrWhiteSpace(command.Signature))
- {
- command.Signature = "0";
- }
-
+ LeaveSearchModel sickLeaveSearch = new LeaveSearchModel()
+ {
+ EmployeeId = command.EmployeeId,
+ WorkshopId = command.WorkshopId,
+ StartLeaveGr = command.ContractStartGr,
+ EndLeaveGr = command.ContractEndGr,
+ IsAccepted = true,
+ };
+ var leaves = _leaveApplication.search(sickLeaveSearch);
- var checkout = new Checkout(command.EmployeeFullName, command.FathersName, command.NationalCode
- , command.DateOfBirth, command.EmployeeId, command.WorkshopName, command.WorkshopId, command.ContractNo, command.ContractStartGr, command.ContractEndGr, month, year,
- command.ContractId, command.WorkingHoursId, monthlyWage, bacicYears, consumableItem, housingAllowance
- , command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
- command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
- , command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
- loanInstallments, salaryAids,checkoutRollCall,command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList);
+ firstDayOfMonth.AddMonthsFa(1, out var lastDayOfCurrentMonth);
- _checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
- //_checkoutRepository.SaveChanges();
+ lastDayOfCurrentMonth = lastDayOfCurrentMonth.AddDays(-1);
- //var employeeFullName = new SqlParameter("@EmployeeFullName", SqlDbType.NVarChar, 50);
- //employeeFullName.Value = command.EmployeeFullName;
- //var fathersName = new SqlParameter("@FathersName", SqlDbType.NVarChar, 20);
- //fathersName.Value = command.EmployeeFullName;
+ int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1;
- }
+ var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel()
+ {
+ HolidayYear = command.ContractStartGr.ToFarsiYear()
+ });
+ //all the dates from start to end, to be compared with present days to get absent dates
+ var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => firstDayOfCurrentMonth.AddDays(offset).Date).ToList();
+
+ var absentRecords = completeDaysList
+ .ExceptBy(command.GroupedRollCalls.Select(x => x.CreationDate.Date), y => y.Date)
+ .Select(x =>
+ {
+ var leave = leaves.FirstOrDefault(y =>
+ y.EmployeeId == command.EmployeeId && y.EndLeaveGr.Date >= x.Date && y.StartLeaveGr.Date <= x.Date);
+ var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date);
+ var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday;
+ var isNormalWorkingDay = isHoliday == false && isFriday == false;
+ return new CheckoutDailyRollCallViewModel()
+ {
+ StartDate1 = null,
+ EndDate1 = null,
+ DateTimeGr = x.Date,
+ DayOfWeek = x.Date.DayOfWeek.ToString(),
+ RollCallDateFa = x.Date.ToFarsi(),
+ LeaveType = leave != null ? leave.LeaveType : "",
+ IsAbsent = leave == null && isNormalWorkingDay
+ };
+ });
+
+ var presentDays = command.GroupedRollCalls.Select(x =>
+ {
+
+ var orderedRollcalls = x.ShiftList.OrderBy(y => y.Start);
+
+ var rollCallTimeSpanPerDay = x.SumOneDaySpan;
+ TimeSpan breakTimePerDay = x.BreakTime;
+
+ return new CheckoutDailyRollCallViewModel()
+ {
+ StartDate1 = orderedRollcalls.FirstOrDefault().Start.ToString("HH:mm"),
+ EndDate1 = orderedRollcalls.FirstOrDefault().EndWithOutResTime.ToString("HH:mm"),
+
+ StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.Start.ToString("HH:mm") ?? "",
+ EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndWithOutResTime.ToString("HH:mm") ?? "",
+
+ TotalhourseSpan = rollCallTimeSpanPerDay,
+
+ BreakTimeTimeSpan = breakTimePerDay,
+
+ DayOfWeek = x.CreationDate.DayOfWeek.DayOfWeeKToPersian(),
+ RollCallDateFa = x.CreationDate.Date.ToFarsi(),
+ DateTimeGr = x.CreationDate.Date,
+ IsSliced = x.ShiftList.Count() > 2,
+ IsAbsent = false
+ };
+ });
- }
+ presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel
+ {
+ StartDate1 = x.StartDate1,
+ EndDate1 = x.EndDate1,
+ EndDate2 = x.EndDate2,
+ StartDate2 = x.StartDate2,
+ TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes:00}",
+ BreakTimeString = $"{(int)(x.BreakTimeTimeSpan.TotalHours)}:{x.BreakTimeTimeSpan.Minutes:00}",
+ TotalhourseSpan = x.TotalhourseSpan,
+ BreakTimeTimeSpan = x.BreakTimeTimeSpan,
+ DayOfWeek = x.DayOfWeek,
+ RollCallDateFa = x.RollCallDateFa,
+ DateTimeGr = x.DateTimeGr,
+ IsSliced = x.IsSliced,
+ IsAbsent = false
+ });
- public OperationResult Edit(EditCheckout command)
- {
- throw new NotImplementedException();
- }
+ var result = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList();
+ result.ForEach(x =>
+ {
+ x.IsHoliday = holidays.Any(y => x.DateTimeGr.Date == y.HolidaydateGr.Date);
+ x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday;
+ });
- public EditCheckout GetDetails(long id)
- {
- return _checkoutRepository.GetDetails(id);
- }
+ var checkoutRollCallDays = result.Select(x => new CheckoutRollCallDay(x.DateTimeGr,
+ x.StartDate1, x.EndDate1, x.StartDate2, x.EndDate2,
+ x.BreakTimeTimeSpan, x.IsSliced, x.TotalhourseSpan, x.IsAbsent, x.IsFriday, x.IsHoliday, x.LeaveType))
+ .ToList();
- public async Task GetContractResultToCreateCheckout(long workshopId, long employeeId, string year, string month,
- string contractStart, string contractEnd)
- {
- return await _checkoutRepository.GetContractResultToCreateCheckout(workshopId, employeeId, year, month, contractStart,
- contractEnd);
- }
+ double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(syear, smonth);
+ int mandatoryWholeHours = (int)mandatoryHours;
+ int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
+
+ var totalMandatoryHours = TimeSpan.FromHours(mandatoryWholeHours).Add(TimeSpan.FromMinutes(mandatoryMinutes));
+ var checkoutRollCall = new CheckoutRollCall(totalMandatoryHours, command.TotalPresentTimeSpan, command.TotalBreakTimeSpan,
+ command.TotalWorkingTimeSpan, command.TotalPaidLeave, command.TotalSickLeave, checkoutRollCallDays);
+
+
+
+
+ var totalClaimsDouble = monthlyWage + bacicYears + consumableItem + housingAllowance + marriedAllowance + command.OvertimePay +
+ command.NightworkPay + familyAllowance + bunos + years + command.LeavePay + command.FridayPay + command.ShiftPay;
+ var totalClaims = totalClaimsDouble.ToMoney();
+ var totalDeductionDouble = insuranceDeduction + command.AbsenceDeduction + command.InstallmentDeduction + command.SalaryAidDeduction;
+ var totalDeductions = totalDeductionDouble.ToMoney();
+ var totalPayment = totalClaimsDouble - totalDeductionDouble;
+
+ if (_checkoutRepository.Exists(x =>
+ x.Month == command.Month && x.Year == command.Year && x.ContractNo == command.ContractNo))
+ {
+ operation.Failed("امکان ثبت رکورد تکراری وجود ندارد");
+ }
+ else
+ {
+ if (string.IsNullOrWhiteSpace(command.Signature))
+ {
+ command.Signature = "0";
+ }
+
+
+ var checkout = new Checkout(command.EmployeeFullName, command.FathersName, command.NationalCode
+ , command.DateOfBirth, command.EmployeeId, command.WorkshopName, command.WorkshopId, command.ContractNo, command.ContractStartGr, command.ContractEndGr, month, year,
+ command.ContractId, command.WorkingHoursId, monthlyWage, bacicYears, consumableItem, housingAllowance
+ , command.OvertimePay, command.NightworkPay, command.FridayPay, 0, command.ShiftPay, familyAllowance, bunos, years, command.LeavePay, insuranceDeduction, 0, command.InstallmentDeduction, command.SalaryAidDeduction, command.AbsenceDeduction, sumOfWorkingDays,
+ command.ArchiveCode, command.PersonnelCode, totalClaims, totalDeductions, totalPayment, command.Signature, marriedAllowance, command.LeaveCheckout, command.CreditLeaves, command.AbsencePeriod, command.AverageHoursPerDay, command.HasRollCall, command.OverTimeWorkValue, command.OverNightWorkValue
+ , command.FridayWorkValue, command.RotatingShiftValue, command.AbsenceValue, command.TotalDayOfLeaveCompute, command.TotalDayOfYearsCompute, command.TotalDayOfBunosesCompute,
+ loanInstallments, salaryAids, checkoutRollCall, command.EmployeeMandatoryHours, hasInsuranceShareTheSameAsList);
+
+ _checkoutRepository.CreateCkeckout(checkout).GetAwaiter().GetResult();
+ //_checkoutRepository.SaveChanges();
+
+ //var employeeFullName = new SqlParameter("@EmployeeFullName", SqlDbType.NVarChar, 50);
+ //employeeFullName.Value = command.EmployeeFullName;
+ //var fathersName = new SqlParameter("@FathersName", SqlDbType.NVarChar, 20);
+ //fathersName.Value = command.EmployeeFullName;
+
+ }
+
+
+ }
+
+ public OperationResult Edit(EditCheckout command)
+ {
+ throw new NotImplementedException();
+ }
+
+ public EditCheckout GetDetails(long id)
+ {
+ return _checkoutRepository.GetDetails(id);
+ }
+
+ public async Task GetContractResultToCreateCheckout(long workshopId, long employeeId, string year, string month,
+ string contractStart, string contractEnd)
+ {
+ return await _checkoutRepository.GetContractResultToCreateCheckout(workshopId, employeeId, year, month, contractStart,
+ contractEnd);
+
+ }
public Task> SearchCheckoutOptimized(CheckoutSearchModel searchModel)
{
@@ -440,32 +441,32 @@ public class CheckoutApplication : ICheckoutApplication
var watch = System.Diagnostics.Stopwatch.StartNew();
watch.Start();
var result = new List();
- var query = await _checkoutRepository.SearchForMainCheckout(searchModel);
- query = query.Select(x => new CheckoutViewModel()
- {
- Id = x.Id,
- EmployeeFullName = x.EmployeeFullName,
- ContractStart = x.ContractStart,
- ContractEnd = x.ContractEnd,
- ContractStartGr = x.ContractStartGr,
- ContractEndGr = x.ContractEndGr,
- PersonnelCode = x.PersonnelCode,
- PersonnelCodeInt = x.PersonnelCodeInt,
- ArchiveCode = x.ArchiveCode,
- SumOfWorkingDays = x.SumOfWorkingDays,
- WorkshopName = x.WorkshopName,
- Month = x.Month,
- Year = x.Year,
- ContractNo = x.ContractNo,
- ContractId = x.ContractId,
- WorkshopId = x.WorkshopId,
- EmployeeId = x.EmployeeId,
- IsActiveString = x.IsActiveString,
- Signature = x.Signature,
- CreationDate = x.CreationDate,
- EmployerName = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.EmployerFullName,
- IsBlockCantracingParty = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.IsBlockContractingParty,
- }).ToList();
+ var query = await _checkoutRepository.SearchForMainCheckout(searchModel);
+ query = query.Select(x => new CheckoutViewModel()
+ {
+ Id = x.Id,
+ EmployeeFullName = x.EmployeeFullName,
+ ContractStart = x.ContractStart,
+ ContractEnd = x.ContractEnd,
+ ContractStartGr = x.ContractStartGr,
+ ContractEndGr = x.ContractEndGr,
+ PersonnelCode = x.PersonnelCode,
+ PersonnelCodeInt = x.PersonnelCodeInt,
+ ArchiveCode = x.ArchiveCode,
+ SumOfWorkingDays = x.SumOfWorkingDays,
+ WorkshopName = x.WorkshopName,
+ Month = x.Month,
+ Year = x.Year,
+ ContractNo = x.ContractNo,
+ ContractId = x.ContractId,
+ WorkshopId = x.WorkshopId,
+ EmployeeId = x.EmployeeId,
+ IsActiveString = x.IsActiveString,
+ Signature = x.Signature,
+ CreationDate = x.CreationDate,
+ EmployerName = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.EmployerFullName,
+ IsBlockCantracingParty = _employerRepository.GetEmployerByWorkshopId(x.WorkshopId).FirstOrDefault()?.IsBlockContractingParty,
+ }).ToList();
//foreach (var items in query)
//{
// var s = _employerRepository.GetEmployerByWorkshopId(items.WorkshopId);
@@ -483,251 +484,300 @@ public class CheckoutApplication : ICheckoutApplication
Console.WriteLine("old : " + watch.Elapsed);
return query;
- }
-
- public List SimpleSearch(CheckoutSearchModel searchModel)
- {
- return _checkoutRepository.SimpleSearch(searchModel);
- }
-
- public List PrintAll(List id)
- {
- var result = _checkoutRepository.PrintAll(id);
- var oneRecord = result.FirstOrDefault();
- if (oneRecord == null)
- return new();
- result.ForEach(x =>
- {
-
-
- int yearFa;
- int monthFa;
- try
- {
- yearFa = int.Parse(oneRecord.Year);
- monthFa = oneRecord.Month.ToMonthByStringValue();
- }
- catch (Exception e)
- {
- return;
- }
- double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa);
- int mandatoryWholeHours = (int)mandatoryHours;
- int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
- var totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(y => y.TotalhourseSpan.Ticks));
- var totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(y => y.BreakTimeTimeSpan.Ticks));
- TimeSpan totalPresent = totalWorking + totalBreakTime;
- if (x.CheckoutRollCall == null)
- {
- if (x.HasRollCall)
- {
- totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) -
- x.TotalHourlyLeave;
- totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
- totalPresent = totalWorking + totalBreakTime;
- }
- else
- {
- totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
- totalPresent = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks));
- totalWorking = totalPresent - totalBreakTime;
- }
-
- x.TotalWorkingTimeStr =
- Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-");
- x.TotalBreakTimeStr =
- Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-");
- x.TotalPresentTimeStr =
- Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-");
- x.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-");
-
- }
- });
-
- return result;
- }
-
- public CheckoutViewModel PrintOne(long id)
- {
- var result = _checkoutRepository.PrintOne(id);
-
- int yearFa;
- int monthFa;
- try
- {
- yearFa = int.Parse(result.Year);
- monthFa = result.Month.ToMonthByStringValue();
- }
- catch (Exception e)
- {
- return new();
- }
- double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa);
- int mandatoryWholeHours = (int)mandatoryHours;
- int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
- TimeSpan totalWorking;
- TimeSpan totalBreakTime;
- TimeSpan totalPresent;
- TimeSpan totalHoursLeave;
- if (result.HasRollCall)
- {
- totalWorking = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - result.TotalHourlyLeave;
- totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
- totalPresent = totalWorking + totalBreakTime;
- }
- else
- {
- totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
- totalPresent = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks));
- totalWorking = totalPresent - totalBreakTime;
- }
-
- result.TotalWorkingTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-");
- result.TotalBreakTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-");
- result.TotalPresentTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-");
- result.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-");
-
- return result;
- }
-
- public CheckoutLeavePrintViewModel LeavePrint(long id)
- {
- return _checkoutRepository.PrintLeave(id);
- }
-
- public OperationResult Sign(long id)
- {
- var opration = new OperationResult();
- var contract = _checkoutRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.Sign();
-
-
- _checkoutRepository.SaveChanges();
- opration.IsSuccedded = true;
- return opration.Succcedded();
- }
-
- public OperationResult UnSign(long id)
- {
- var opration = new OperationResult();
- var contract = _checkoutRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.UnSign();
-
-
- _checkoutRepository.SaveChanges();
- opration.IsSuccedded = true;
- return opration.Succcedded();
- }
-
- public OperationResult Active(long id)
- {
- var opration = new OperationResult();
- var contract = _checkoutRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.Active();
-
- _checkoutRepository.SaveChanges();
- return opration.Succcedded();
- }
-
- public OperationResult DeActive(long id)
- {
- var opration = new OperationResult();
- var contract = _checkoutRepository.Get(id);
- if (contract == null)
- return opration.Failed("رکورد مورد نظر یافت نشد");
-
- contract.DeActive();
-
-
- _checkoutRepository.SaveChanges();
-
- return opration.Succcedded();
- }
-
- public OperationResult RemoveCheckout(long id)
- {
- return _checkoutRepository.RemoveCheckout(id);
- }
-
- public OperationResult CustomSet(long id, double rewardPay, double salaryAidDeduction)
- {
- var opration = new OperationResult();
- var checkout = _checkoutRepository.Get(id);
- var totalClaimsDouble = checkout.TotalClaims.MoneyToDouble();
- var totalDeductionsDouble = checkout.TotalDeductions.MoneyToDouble();
- totalClaimsDouble = (double)(totalClaimsDouble - checkout.RewardPay);
- totalDeductionsDouble = totalDeductionsDouble - checkout.SalaryAidDeduction;
-
- var totalClaims = totalClaimsDouble + rewardPay;
- var totalDeductions = totalDeductionsDouble + salaryAidDeduction;
-
-
-
- var totalClaimsString = totalClaims.ToMoney();
- var totalDeductionsString = totalDeductions.ToMoney();
- var totalPayment = totalClaims - totalDeductions;
-
- checkout.CustomSet(rewardPay, salaryAidDeduction, totalClaimsString, totalDeductionsString, totalPayment);
-
- _checkoutRepository.SaveChanges();
- opration.IsSuccedded = true;
- return opration.Succcedded();
- }
-
- #region Client
-
- public List SearchForClient(CheckoutSearchModel searchModel)
- {
- return _checkoutRepository.SearchForClient(searchModel);
- }
-
- #endregion
- #region NewChangeByHeydari
- public List CheckHasSignature(List ids)
- {
- return _checkoutRepository.CheckHasSignature(ids);
- }
- public OperationResult DeleteAllCheckouts(List ids)
- {
- return _checkoutRepository.DeleteAllCheckouts(ids);
- }
- public OperationResult DeleteCheckout(long id)
- {
- return _checkoutRepository.DeleteCheckout(id);
- }
- public async Task> SearchForMainCheckout(CheckoutSearchModel searchModel)
- {
- return await _checkoutRepository.SearchForMainCheckout(searchModel);
- }
- #endregion
- #region Pooya
-
-
- public List<(long EmployeeId, DateTime CheckoutStart, DateTime CheckoutEnd)> GetLastCheckoutsByWorkshopIdForWorkFlow(long workshopId, DateTime start, DateTime end)
- {
- return _checkoutRepository.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, start, end);
- }
-
- public async Task> GetEmployeeSelectListByWorkshopId(long id)
- {
- return await _checkoutRepository.GetEmployeeSelectListByWorkshopId(id);
}
+ public List SimpleSearch(CheckoutSearchModel searchModel)
+ {
+ return _checkoutRepository.SimpleSearch(searchModel);
+ }
+
+ public List PrintAll(List id)
+ {
+ var result = _checkoutRepository.PrintAll(id);
+ var oneRecord = result.FirstOrDefault();
+ if (oneRecord == null)
+ return new();
+ result.ForEach(x =>
+ {
+
+
+ int yearFa;
+ int monthFa;
+ try
+ {
+ yearFa = int.Parse(oneRecord.Year);
+ monthFa = oneRecord.Month.ToMonthByStringValue();
+ }
+ catch (Exception e)
+ {
+ return;
+ }
+ double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa);
+ int mandatoryWholeHours = (int)mandatoryHours;
+ int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
+ var totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(y => y.TotalhourseSpan.Ticks));
+ var totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(y => y.BreakTimeTimeSpan.Ticks));
+ TimeSpan totalPresent = totalWorking + totalBreakTime;
+ if (x.CheckoutRollCall == null)
+ {
+ if (x.HasRollCall)
+ {
+ totalWorking = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) -
+ x.TotalHourlyLeave;
+ totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
+ totalPresent = totalWorking + totalBreakTime;
+ }
+ else
+ {
+ totalBreakTime = new TimeSpan(x.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
+ totalPresent = new TimeSpan(x.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks));
+ totalWorking = totalPresent - totalBreakTime;
+ }
+
+ x.TotalWorkingTimeStr =
+ Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-");
+ x.TotalBreakTimeStr =
+ Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-");
+ x.TotalPresentTimeStr =
+ Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-");
+ x.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-");
+
+ }
+ });
+
+ return result;
+ }
+
+ public CheckoutViewModel PrintOne(long id)
+ {
+ var result = _checkoutRepository.PrintOne(id);
+
+ int yearFa;
+ int monthFa;
+ try
+ {
+ yearFa = int.Parse(result.Year);
+ monthFa = result.Month.ToMonthByStringValue();
+ }
+ catch (Exception e)
+ {
+ return new();
+ }
+ double mandatoryHours = _mandatoryHoursApplication.GetMandatoryHoursByYearAndMonth(yearFa, monthFa);
+ int mandatoryWholeHours = (int)mandatoryHours;
+ int mandatoryMinutes = (int)((mandatoryHours - mandatoryWholeHours) * 60);
+ TimeSpan totalWorking;
+ TimeSpan totalBreakTime;
+ TimeSpan totalPresent;
+ TimeSpan totalHoursLeave;
+ if (result.HasRollCall)
+ {
+ totalWorking = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks)) - result.TotalHourlyLeave;
+ totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
+ totalPresent = totalWorking + totalBreakTime;
+ }
+ else
+ {
+ totalBreakTime = new TimeSpan(result.MonthlyRollCall.Sum(x => x.BreakTimeTimeSpan.Ticks));
+ totalPresent = new TimeSpan(result.MonthlyRollCall.Sum(x => x.TotalhourseSpan.Ticks));
+ totalWorking = totalPresent - totalBreakTime;
+ }
+
+ result.TotalWorkingTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalWorking.TotalHours, totalWorking.Minutes, "-");
+ result.TotalBreakTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalBreakTime.TotalHours, totalBreakTime.Minutes, "-");
+ result.TotalPresentTimeStr = Tools.ToFarsiHoursAndMinutes((int)totalPresent.TotalHours, totalPresent.Minutes, "-");
+ result.TotalMandatoryTimeStr = Tools.ToFarsiHoursAndMinutes(mandatoryWholeHours, mandatoryMinutes, "-");
+
+ return result;
+ }
+
+ public CheckoutLeavePrintViewModel LeavePrint(long id)
+ {
+ return _checkoutRepository.PrintLeave(id);
+ }
+
+ public OperationResult Sign(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _checkoutRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.Sign();
+
+
+ _checkoutRepository.SaveChanges();
+ opration.IsSuccedded = true;
+ return opration.Succcedded();
+ }
+
+ public OperationResult UnSign(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _checkoutRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.UnSign();
+
+
+ _checkoutRepository.SaveChanges();
+ opration.IsSuccedded = true;
+ return opration.Succcedded();
+ }
+
+ public OperationResult Active(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _checkoutRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.Active();
+
+ _checkoutRepository.SaveChanges();
+ return opration.Succcedded();
+ }
+
+ public OperationResult DeActive(long id)
+ {
+ var opration = new OperationResult();
+ var contract = _checkoutRepository.Get(id);
+ if (contract == null)
+ return opration.Failed("رکورد مورد نظر یافت نشد");
+
+ contract.DeActive();
+
+
+ _checkoutRepository.SaveChanges();
+
+ return opration.Succcedded();
+ }
+
+ public OperationResult RemoveCheckout(long id)
+ {
+ return _checkoutRepository.RemoveCheckout(id);
+ }
+
+ public OperationResult CustomSet(long id, double rewardPay, double salaryAidDeduction)
+ {
+ var opration = new OperationResult();
+ var checkout = _checkoutRepository.Get(id);
+ var totalClaimsDouble = checkout.TotalClaims.MoneyToDouble();
+ var totalDeductionsDouble = checkout.TotalDeductions.MoneyToDouble();
+ totalClaimsDouble = (double)(totalClaimsDouble - checkout.RewardPay);
+ totalDeductionsDouble = totalDeductionsDouble - checkout.SalaryAidDeduction;
+
+ var totalClaims = totalClaimsDouble + rewardPay;
+ var totalDeductions = totalDeductionsDouble + salaryAidDeduction;
+
+
+
+ var totalClaimsString = totalClaims.ToMoney();
+ var totalDeductionsString = totalDeductions.ToMoney();
+ var totalPayment = totalClaims - totalDeductions;
+
+ checkout.CustomSet(rewardPay, salaryAidDeduction, totalClaimsString, totalDeductionsString, totalPayment);
+
+ _checkoutRepository.SaveChanges();
+ opration.IsSuccedded = true;
+ return opration.Succcedded();
+ }
+
+ #region Client
+
+ public List SearchForClient(CheckoutSearchModel searchModel)
+ {
+ return _checkoutRepository.SearchForClient(searchModel);
+ }
+
+ #endregion
+ #region NewChangeByHeydari
+ public List CheckHasSignature(List ids)
+ {
+ return _checkoutRepository.CheckHasSignature(ids);
+ }
+ public OperationResult DeleteAllCheckouts(List ids)
+ {
+ return _checkoutRepository.DeleteAllCheckouts(ids);
+ }
+ public OperationResult DeleteCheckout(long id)
+ {
+ return _checkoutRepository.DeleteCheckout(id);
+ }
+ public async Task> SearchForMainCheckout(CheckoutSearchModel searchModel)
+ {
+ return await _checkoutRepository.SearchForMainCheckout(searchModel);
+ }
+ #endregion
+ #region Pooya
+
+
+ public List<(long EmployeeId, DateTime CheckoutStart, DateTime CheckoutEnd)> GetLastCheckoutsByWorkshopIdForWorkFlow(long workshopId, DateTime start, DateTime end)
+ {
+ return _checkoutRepository.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, start, end);
+ }
+
+
+
#endregion
#region ForApi
+ #region CreateWorkshop
+
+ ///
+ /// دریافت سلکت لیست پرسنل کارگاه
+ ///
+ ///
+ ///
+ public async Task> GetEmployeeSelectListByWorkshopId(long id)
+ {
+ return await _checkoutRepository.GetEmployeeSelectListByWorkshopId(id);
+ }
+
+ ///
+ /// دریافت لیست قراردادها برای ایجاد فیش حقوقی
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task>> GetContractToCreateCheckout(long workshopId, string year, string month, long employeeId)
+ {
+ var op = new OperationResult>();
+ if (workshopId < 1)
+ return op.Failed("کارگاه را انتخاب کنید");
+ if (string.IsNullOrWhiteSpace(year) || string.IsNullOrWhiteSpace(month))
+ return op.Failed("سال و ماه را انتخاب کنید");
+ var result = await GetContractResultToCreateCheckout(workshopId, employeeId, year, month, null,
+ null);
+ if(result.CreateCheckoutList.Count == 0)
+ return op.Failed("موردی یافت نشد");
+ var finalResult = result.CreateCheckoutList.Select(x => new ContractsListToCreateCheckoutDto
+ {
+ Id = x.Id,
+ ContractNo = x.ContractNo,
+ WorkshopName = x.WorkshopName,
+ EmployeeName = x.EmployeeName,
+ ContractStart = x.ContractStart,
+ ContractEnd = x.ContractEnd,
+ PersonnelCode = x.PersonnelCode,
+ Description = x.Description,
+ LeftWorkDate = x.LeftWorkDate,
+ CreateCheckoutStatus = x.HasCheckout ? CreateCheckoutStatus.HasCheckout : x.Extension == false ? CreateCheckoutStatus.NotValid : CreateCheckoutStatus.ReadyToCreate
+
+ }).ToList();
+
+ return op.Succcedded(finalResult);
+ }
+
+ #endregion
+
+
public async Task> GetList(CheckoutSearchModelDto searchModel)
{
return await _checkoutRepository.GetList(searchModel);
@@ -742,8 +792,8 @@ public class CheckoutApplication : ICheckoutApplication
var typeOfWorkingHours = "";
if (checkout.HasRollCall)
{
- result = await _rollCallMandatoryRepository.RotatingShiftReport(checkout.WorkshopId, checkout.EmployeeId, checkout.ContractStartGr, checkout.ContractEndGr, workingHours.ShiftWork, true, workingHours, false);
- typeOfWorkingHours = "دارای حضورغیاب";
+ result = await _rollCallMandatoryRepository.RotatingShiftReport(checkout.WorkshopId, checkout.EmployeeId, checkout.ContractStartGr, checkout.ContractEndGr, workingHours.ShiftWork, true, workingHours, false);
+ typeOfWorkingHours = "دارای حضورغیاب";
}
else
diff --git a/CompanyManagment.EFCore/Repository/CheckoutRepository.cs b/CompanyManagment.EFCore/Repository/CheckoutRepository.cs
index 916e09bc..95cd3c8e 100644
--- a/CompanyManagment.EFCore/Repository/CheckoutRepository.cs
+++ b/CompanyManagment.EFCore/Repository/CheckoutRepository.cs
@@ -2734,22 +2734,42 @@ public class CheckoutRepository : RepositoryBase, ICheckoutRepos
#region ForApi
+ ///ایجاد فیش
+ #region CreateCheckout
+
+
+ ///
+ /// دریافت سلکت لیست پرسنل کارگاه
+ ///
+ ///
+ ///
public async Task> GetEmployeeSelectListByWorkshopId(long id)
{
- var employeesHasLeftworkData =_context.LeftWorkList.Where(x => x.WorkshopId == id).Select(x => x.EmployeeId);
- var employees =await _context.Employees
+ var employeesHasLeftworkData = _context.LeftWorkList.Where(x => x.WorkshopId == id).Select(x => x.EmployeeId);
+ var employees = await _context.Employees
.Where(x => employeesHasLeftworkData.Contains(x.id))
.Select(x =>
- new EmployeeSelectListDto()
- {
- Id = x.id,
- EmployeeFullName = x.FullName
- })
+ new EmployeeSelectListDto()
+ {
+ Id = x.id,
+ EmployeeFullName = x.FullName
+ })
.AsNoTracking()
.ToListAsync();
return employees;
}
+
+
+ #endregion
+
+
+
+ ///
+ /// دریافت لیست فیش حقوقی
+ ///
+ ///
+ ///
public async Task> GetList(CheckoutSearchModelDto searchModel)
{
var acountID = _authHelper.CurrentAccountId();
@@ -3039,7 +3059,12 @@ public class CheckoutRepository : RepositoryBase, ICheckoutRepos
};
}
-
+ ///
+ /// پرینت فیش حقوقی
+ /// Api
+ ///
+ ///
+ ///
public async Task> CheckoutPrint(List ids)
{
if (ids.Count == 0)
diff --git a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs b/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs
index 0cf5f2a1..295d50b7 100644
--- a/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs
+++ b/ServiceHost/Areas/Admin/Controllers/CheckoutController.cs
@@ -7,6 +7,7 @@ using CompanyManagment.App.Contracts.Workshop.DTOs;
using Microsoft.AspNetCore.Mvc;
using NuGet.Packaging.Signing;
using ServiceHost.BaseControllers;
+using WorkFlow.Application.Contracts.WorkFlow;
namespace ServiceHost.Areas.Admin.Controllers;
@@ -14,11 +15,13 @@ public class CheckoutController : AdminBaseController
{
private readonly ICheckoutApplication _checkoutApplication;
private readonly IWorkshopApplication _workshopApplication;
+ private readonly IWorkFlowApplication _workFlowApplication;
- public CheckoutController(ICheckoutApplication checkoutApplication, IWorkshopApplication workshopApplication)
+ public CheckoutController(ICheckoutApplication checkoutApplication, IWorkshopApplication workshopApplication, IWorkFlowApplication workFlowApplication)
{
_checkoutApplication = checkoutApplication;
_workshopApplication = workshopApplication;
+ _workFlowApplication = workFlowApplication;
}
///
@@ -92,6 +95,32 @@ public class CheckoutController : AdminBaseController
var result = await _checkoutApplication.GetEmployeeSelectListByWorkshopId(workshopId);
return result;
}
+
+
+ ///
+ /// دریافت لیست قراردادها برای ایجاد فیش حقوقی
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("GetContractsToCreateCheckout")]
+ public async Task>> GetContractsToCreateCheckout(long workshopId, string year, string month, long employeeId)
+ {
+
+ var result =await _checkoutApplication.GetContractToCreateCheckout(workshopId, year, month, employeeId);
+ if (!result.IsSuccedded)
+ return result;
+
+ var hasWorkFlow =await _workFlowApplication.HasWorkFlow(workshopId, year, month);
+
+ if (hasWorkFlow)
+ return new OperationResult>().Failed(
+ "این کارگاه به دلیل داشتن کارپوشه مجاز به ایجاد تصفیه حساب نمی باشد");
+ return result;
+
+ }
#endregion
}
diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs
index 218871e3..98953155 100644
--- a/ServiceHost/Program.cs
+++ b/ServiceHost/Program.cs
@@ -386,17 +386,17 @@ if (builder.Environment.IsDevelopment())
{
var logConfig = configuration
.ReadFrom.Configuration(context.Configuration)
- .ReadFrom.Services(services)
- .Enrich.FromLogContext();
+ .ReadFrom.Services(services);
+
- logConfig.WriteTo.File(
- path: Path.Combine(logDirectory, "gozareshgir_log.txt"),
- rollingInterval: RollingInterval.Day,
- retainedFileCountLimit: 30,
- shared: true,
- outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
- );
+ //logConfig.WriteTo.File(
+ // path: Path.Combine(logDirectory, "gozareshgir_log.txt"),
+ // rollingInterval: RollingInterval.Day,
+ // retainedFileCountLimit: 30,
+ // shared: true,
+ // outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
+ //);
}, writeToProviders: true); // این باعث میشه کنسول پیشفرض هم کار کنه
}
diff --git a/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs b/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs
index e000f514..6ac9791c 100644
--- a/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs
+++ b/WorkFlow/Application/WorkFlow.Application.Contracts/WorkFlow/IWorkFlowApplication.cs
@@ -73,4 +73,15 @@ public interface IWorkFlowApplication
Task> GetEmployeesWithoutLunchBreak(long workshopId);
Task> GetEmployeesWithoutGroup(long workshopId);
+
+ #region ForApi
+ ///
+ /// در زمان ایجاد فیش کارپوشه کارگاه را چک میکند
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task HasWorkFlow(long workshopId, string year, string month);
+ #endregion
}
\ No newline at end of file
diff --git a/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs b/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs
index d644bb5f..ac28f42f 100644
--- a/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs
+++ b/WorkFlow/Application/WorkFlow.Application/WorkFlowApplication.cs
@@ -781,5 +781,66 @@ public class WorkFlowApplication : IWorkFlowApplication
return _customizedWorkshopSettingsACL.GetEmployeesWithoutGroup(workshopId);
}
+ #region ForApi
+
+
+ public async Task HasWorkFlow(long workshopId, string year, string month)
+ {
+ var workshop = _workshopRepository.GetDetails(workshopId);
+ bool hasWorkFlow = false;
+
+ var skipRollCallByWorkshopId = workshopId is 368 or 610;
+ if (workshop.HasRollCallFreeVip == "true" && !skipRollCallByWorkshopId)
+ {
+ DateTime startSreach;
+ DateTime endSearch;
+
+ if (month == "0" && year == "0")
+ {
+ DateTime now = DateTime.Now;
+ string startStr = $"{now.ToFarsi().Substring(0, 8)}01";
+ startSreach = startStr.ToGeorgianDateTime();
+ endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime();
+ }
+ else if (month == "0" && year != "0")
+ {
+ DateTime now = DateTime.Now;
+
+ string startStr = $"{year}/{now.ToFarsi().Substring(5, 2)}/01";
+ startSreach = startStr.ToGeorgianDateTime();
+ endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime();
+ }
+ else if (month != "0" && year == "0")
+ {
+ DateTime now = DateTime.Now;
+
+ string startStr = $"{now.ToFarsi().Substring(0, 4)}/{month}/01";
+ startSreach = startStr.ToGeorgianDateTime();
+ endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime();
+ }
+ else
+ {
+ string startStr = $"{year}/{month}/01";
+ startSreach = startStr.ToGeorgianDateTime();
+ endSearch = (startStr.FindeEndOfMonth()).ToGeorgianDateTime();
+ }
+
+
+ DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
+ if (lastMonthEnd == endSearch)
+ {
+ var countWorkFlowCut = await CountCutByBgServiceLastMonth(workshopId);
+ var countWorkFlowAbsent = await CountAbsentRollCallLastMonth(workshopId);
+ var countWorkFlowLunchBreak = await CountEmployeesWithoutLunchBreakLastMonth(workshopId);
+ var countUndefinedRollCalls = await CountUndefinedLastMonth(workshopId);
+
+ hasWorkFlow = countWorkFlowCut > 0 || countWorkFlowAbsent > 0 || countWorkFlowLunchBreak > 0 ||
+ countUndefinedRollCalls > 0;
+ }
+ }
+
+ return hasWorkFlow;
+ }
+ #endregion
}
\ No newline at end of file