1761 lines
67 KiB
C#
1761 lines
67 KiB
C#
using _0_Framework.Application;
|
||
using _0_Framework.Domain.CustomizeCheckoutShared.Enums;
|
||
using _0_Framework.Domain.CustomizeCheckoutShared.ValueObjects;
|
||
using AccountManagement.Application.Contracts.CameraAccount;
|
||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg;
|
||
using Company.Domain.CustomizeWorkshopEmployeeSettingsAgg.Entities;
|
||
using Company.Domain.CustomizeWorkshopGroupSettingsAgg;
|
||
using Company.Domain.CustomizeWorkshopGroupSettingsAgg.Entities;
|
||
using Company.Domain.CustomizeWorkshopSettingsAgg;
|
||
using Company.Domain.CustomizeWorkshopSettingsAgg.Entities;
|
||
using Company.Domain.EmployeeAgg;
|
||
using CompanyManagment.App.Contracts.CustomizeWorkshopSettings;
|
||
using CompanyManagment.App.Contracts.Employee;
|
||
using CompanyManagment.App.Contracts.RollCallEmployee;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using System.Transactions;
|
||
using _0_Framework.Domain.CustomizeCheckoutShared.Base;
|
||
using CompanyManagment.App.Contracts.RollCall;
|
||
using Microsoft.EntityFrameworkCore.Query;
|
||
using Company.Domain.CheckoutAgg;
|
||
using Company.Domain.CustomizeCheckoutAgg;
|
||
using Company.Domain.CustomizeCheckoutTempAgg;
|
||
using CompanyManagment.EFCore.Repository;
|
||
|
||
|
||
namespace CompanyManagment.Application;
|
||
|
||
public class CustomizeWorkshopSettingsApplication(ICustomizeWorkshopSettingsRepository customizeWorkshopSettingsRepository,
|
||
IAuthHelper authHelper, IPasswordHasher passwordHasher, ICameraAccountApplication cameraAccountApplication,
|
||
ICustomizeWorkshopGroupSettingsRepository customizeWorkshopGroupSettingsRepository, IEmployeeRepository employeeRepository,
|
||
ICustomizeWorkshopEmployeeSettingsRepository customizeWorkshopEmployeeSettingsRepository,
|
||
IRollCallEmployeeApplication rollCallEmployeeApplication,
|
||
IRollCallApplication rollCallAppllication,
|
||
ICheckoutRepository checkoutRepository,
|
||
ICustomizeCheckoutRepository customizeCheckoutRepository,
|
||
ICustomizeCheckoutTempRepository customizeCheckoutTempRepository)
|
||
: ICustomizeWorkshopSettingsApplication
|
||
{
|
||
private readonly ICustomizeWorkshopSettingsRepository _customizeWorkshopSettingsRepository = customizeWorkshopSettingsRepository;
|
||
private readonly ICustomizeWorkshopGroupSettingsRepository _customizeWorkshopGroupSettingsRepository = customizeWorkshopGroupSettingsRepository;
|
||
private readonly ICustomizeWorkshopEmployeeSettingsRepository _customizeWorkshopEmployeeSettingsRepository = customizeWorkshopEmployeeSettingsRepository;
|
||
private readonly IAuthHelper _authHelper = authHelper;
|
||
private readonly IEmployeeRepository _employeeRepository = employeeRepository;
|
||
private readonly IPasswordHasher _passwordHasher = passwordHasher;
|
||
private readonly ICameraAccountApplication _cameraAccountApplication = cameraAccountApplication;
|
||
private readonly IRollCallEmployeeApplication _rollCallEmployeeApplication = rollCallEmployeeApplication;
|
||
private readonly IRollCallApplication _rollCallApplication = rollCallAppllication;
|
||
private readonly ICheckoutRepository _checkoutRepository = checkoutRepository;
|
||
private readonly ICustomizeCheckoutRepository _customizeCheckoutRepository = customizeCheckoutRepository;
|
||
private readonly ICustomizeCheckoutTempRepository _customizeCheckoutTempRepository = customizeCheckoutTempRepository;
|
||
|
||
#region RollCallShifts
|
||
|
||
//Create workshop settings
|
||
public OperationResult CreateWorkshopSettings(CreateCustomizeWorkshopSettings command)
|
||
{
|
||
OperationResult op = new();
|
||
var workshopId = _passwordHasher.SlugDecrypt(_authHelper.GetWorkshopSlug());
|
||
//تبدیل شیفت های ویو مدل به انتیتی
|
||
List<CustomizeWorkshopSettingsShift> shiftCollection = new List<CustomizeWorkshopSettingsShift>();
|
||
if (command.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
#region Validation
|
||
if (command.ShiftsList.Any(x => string.IsNullOrWhiteSpace(x.StartTime) || string.IsNullOrWhiteSpace(x.EndTime)))
|
||
return op.Failed("ساعات کاری شروع و پایان نمیتواند خالی باشد");
|
||
try
|
||
{
|
||
shiftCollection =
|
||
command.ShiftsList.Select(x =>
|
||
{
|
||
var placement = x.Placement switch
|
||
{
|
||
ShiftPlacement.First => "اول",
|
||
ShiftPlacement.Second => "دوم",
|
||
ShiftPlacement.Third => "سوم"
|
||
};
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException($"فرمت شروع نوبت{placement}نادرست است");
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException($"فرمت پایان نوبت{placement}نادرست است");
|
||
|
||
|
||
return new CustomizeWorkshopSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
}
|
||
catch (InvalidDataException e)
|
||
{
|
||
|
||
return op.Failed(e.Message);
|
||
}
|
||
if (workshopId < 1)
|
||
{
|
||
return op.Failed("خطای سیستمی");
|
||
}
|
||
DateTime day = DateTime.Now;
|
||
DateTime previousEnd = new DateTime();
|
||
var finalShiftList = new List<(DateTime start, DateTime end, ShiftPlacement placement)>();
|
||
|
||
shiftCollection = shiftCollection.OrderBy(x => x.Placement).ToList();
|
||
|
||
foreach (var shift in shiftCollection)
|
||
{
|
||
(DateTime start, DateTime end, ShiftPlacement placement) newShift =
|
||
new()
|
||
{
|
||
placement = shift.Placement,
|
||
start = new DateTime(DateOnly.FromDateTime(day), shift.StartTime),
|
||
end = new DateTime(DateOnly.FromDateTime(day), shift.EndTime)
|
||
|
||
|
||
};
|
||
|
||
if (previousEnd != new DateTime())
|
||
{
|
||
if (newShift.start == previousEnd)
|
||
{
|
||
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
|
||
}
|
||
|
||
if (newShift.start <= previousEnd)
|
||
{
|
||
newShift.start = newShift.start.AddDays(1);
|
||
}
|
||
}
|
||
while (newShift.start >= newShift.end)
|
||
{
|
||
newShift.end = newShift.end.AddDays(1);
|
||
}
|
||
finalShiftList.Add(newShift);
|
||
previousEnd = newShift.end;
|
||
}
|
||
|
||
var firstShiftStart = finalShiftList.FirstOrDefault(x => x.placement == ShiftPlacement.First).start;
|
||
var lastShiftEnd = finalShiftList.OrderByDescending(x => x.placement).FirstOrDefault().end;
|
||
if (firstShiftStart.AddDays(1) < lastShiftEnd)
|
||
return op.Failed("بازه زمانی کارگاه نامعتبر است");
|
||
var total = finalShiftList.Sum(x => (x.end - x.start).TotalHours);
|
||
if (total >= 24)
|
||
{
|
||
return op.Failed("بازه زمانی کارگاه نمیتواند بیشتر از 24 ساعت باشد");
|
||
}
|
||
#endregion
|
||
}
|
||
else
|
||
{
|
||
command.ShiftsList = [];
|
||
shiftCollection = [];
|
||
|
||
}
|
||
|
||
var offDays = command.OffDays?.Select(x => new WeeklyOffDay(x)).ToList()??[];
|
||
|
||
var record = new CustomizeWorkshopSettings(workshopId, shiftCollection, command.LeavePermittedDays,
|
||
command.WorkshopShiftStatus, command.HolidayWork, offDays);
|
||
using (var transaction = new TransactionScope())
|
||
{
|
||
|
||
try
|
||
{
|
||
_customizeWorkshopSettingsRepository.Create(record);
|
||
_customizeWorkshopSettingsRepository.SaveChanges();
|
||
|
||
OperationResult result = new OperationResult();
|
||
|
||
result = command.WorkshopShiftStatus == WorkshopShiftStatus.Regular ? CreateGeneralGroup(record) : result.Succcedded();
|
||
|
||
if (result.IsSuccedded)
|
||
{
|
||
transaction.Complete();
|
||
}
|
||
else
|
||
{
|
||
op = result;
|
||
transaction.Dispose();
|
||
}
|
||
}
|
||
catch
|
||
{
|
||
transaction.Dispose();
|
||
// ignored
|
||
}
|
||
}
|
||
|
||
return string.IsNullOrWhiteSpace(op.Message) ? op.Succcedded() : op;
|
||
|
||
}
|
||
|
||
|
||
//create group settings with workshopSettingsId.
|
||
public OperationResult CreateGroupSettingsByRollCallWorkshopSettingId(CreateCustomizeWorkshopGroupSettings command)
|
||
{
|
||
OperationResult op = new();
|
||
CustomizeWorkshopSettings workshopSettings =
|
||
_customizeWorkshopSettingsRepository.Get(command.CustomizeWorkshopSettingId);
|
||
List<CustomizeWorkshopGroupSettingsShift> shiftCollection = new List<CustomizeWorkshopGroupSettingsShift>();
|
||
|
||
ICollection<CustomizeRotatingShift> customizeRotatingShifts = [];
|
||
|
||
#region validation
|
||
|
||
if (workshopSettings == null)
|
||
return op.Failed("خطای سیستمی");
|
||
|
||
if (string.IsNullOrWhiteSpace(command.Name))
|
||
return op.Failed("لطفا نام گروه را وارد کنید");
|
||
|
||
if (string.IsNullOrWhiteSpace(command.Salary))
|
||
return op.Failed("لطفا حقوق مورد نظر خود را وارد کنید");
|
||
|
||
if (!_customizeWorkshopSettingsRepository.Exists(x => x.id == command.CustomizeWorkshopSettingId))
|
||
return op.Failed("چنین ساعت کاری برای کارگاهی وجود ندارد");
|
||
|
||
if (command.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
if (command.ShiftViewModel.Any(x => string.IsNullOrWhiteSpace(x.StartTime) || string.IsNullOrWhiteSpace(x.EndTime)))
|
||
return op.Failed("ساعات کاری شروع و پایان نمیتواند خالی باشد");
|
||
try
|
||
{
|
||
shiftCollection =
|
||
command.ShiftViewModel.Select(x =>
|
||
{
|
||
var placement = x.Placement switch
|
||
{
|
||
ShiftPlacement.First => "اول",
|
||
ShiftPlacement.Second => "دوم",
|
||
ShiftPlacement.Third => "سوم"
|
||
};
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException($"فرمت شروع نوبت{placement}نادرست است");
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException($"فرمت پایان نوبت{placement}نادرست است");
|
||
|
||
|
||
return new CustomizeWorkshopGroupSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
}
|
||
catch (InvalidDataException e)
|
||
{
|
||
|
||
return op.Failed(e.Message);
|
||
}
|
||
DateTime previousEnd = new DateTime();
|
||
var finalShiftList = new List<(DateTime start, DateTime end, ShiftPlacement placement)>();
|
||
|
||
shiftCollection = shiftCollection.OrderBy(x => x.Placement).ToList();
|
||
|
||
foreach (var shift in shiftCollection)
|
||
{
|
||
(DateTime start, DateTime end, ShiftPlacement placement) newShift =
|
||
new()
|
||
{
|
||
placement = shift.Placement,
|
||
start = new DateTime(DateOnly.MinValue, shift.StartTime),
|
||
end = new DateTime(DateOnly.MinValue, shift.EndTime)
|
||
|
||
|
||
};
|
||
|
||
if (previousEnd != new DateTime())
|
||
{
|
||
if (newShift.start == previousEnd)
|
||
{
|
||
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
|
||
}
|
||
|
||
if (newShift.start <= previousEnd)
|
||
{
|
||
newShift.start = newShift.start.AddDays(1);
|
||
}
|
||
}
|
||
while (newShift.start >= newShift.end)
|
||
{
|
||
newShift.end = newShift.end.AddDays(1);
|
||
}
|
||
finalShiftList.Add(newShift);
|
||
previousEnd = newShift.end;
|
||
}
|
||
//var firstWorkshopTimeShift = workshopSettings.CustomizeWorkshopSettingsShifts.MinBy(x => x.Placement).StartTime;
|
||
//var lastWorkshopTimeShift = workshopSettings.CustomizeWorkshopSettingsShifts.MaxBy(x => x.Placement).EndTime;
|
||
|
||
//var startDateTime = new DateTime(DateOnly.MinValue, firstWorkshopTimeShift);
|
||
//var lastDateTime = new DateTime(DateOnly.MinValue, lastWorkshopTimeShift);
|
||
//if (lastDateTime < startDateTime)
|
||
//{
|
||
// lastDateTime = lastDateTime.AddDays(1);
|
||
//}
|
||
|
||
//var lastGroupShift = finalShiftList.MaxBy(x => x.placement).end;
|
||
//var firstGroupShift = finalShiftList.MinBy(x => x.placement).start;
|
||
//if (lastDateTime < lastGroupShift || firstGroupShift < startDateTime)
|
||
//{
|
||
// return op.Failed("ساعت کاری گروه باید بین ساعت کاری کارگاه باشد");
|
||
//}
|
||
}
|
||
else if (command.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
|
||
{
|
||
var irregularShiftStartTime = new DateTime(DateOnly.MinValue, command.IrregularShift.StartTime);
|
||
|
||
var irregularShiftEndTime = new DateTime(DateOnly.MinValue, command.IrregularShift.EndTime);
|
||
|
||
if (irregularShiftEndTime < irregularShiftStartTime)
|
||
{
|
||
irregularShiftEndTime = irregularShiftEndTime.AddDays(1);
|
||
}
|
||
|
||
switch (command.IrregularShift.WorkshopIrregularShifts)
|
||
{
|
||
case WorkshopIrregularShifts.TwelveThirtySix:
|
||
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
case WorkshopIrregularShifts.TwelveTwentyFour:
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (command.CustomizeRotatingShiftsViewModels.Count == 1)
|
||
{
|
||
return op.Failed("در نوع گردشی میبایست بیشتر از یک شیفت تعریف کنید");
|
||
}
|
||
customizeRotatingShifts = command.CustomizeRotatingShiftsViewModels.Select(x => new CustomizeRotatingShift(TimeOnly.Parse(x.StartTime), TimeOnly.Parse(x.EndTime))).ToList();
|
||
}
|
||
|
||
#endregion
|
||
|
||
var breakTime = new BreakTime(command.BreakTime.HasBreakTimeValue, command.BreakTime.BreakTimeValue);
|
||
|
||
double salary = command.Salary.MoneyToDouble();
|
||
|
||
var weeklyOffDays = command.OffDayOfWeeks?.Select(x => new WeeklyOffDay(x)).ToList()??[];
|
||
|
||
var entity = new CustomizeWorkshopGroupSettings(command.Name, salary, command.CustomizeWorkshopSettingId, shiftCollection, workshopSettings.FridayPay, workshopSettings.OverTimePay,
|
||
workshopSettings.BaseYearsPay, workshopSettings.BonusesPay, workshopSettings.NightWorkPay, workshopSettings.MarriedAllowance,
|
||
workshopSettings.ShiftPay, workshopSettings.FamilyAllowance, workshopSettings.LeavePay, workshopSettings.InsuranceDeduction, workshopSettings.FineAbsenceDeduction,
|
||
workshopSettings.LateToWork, workshopSettings.EarlyExit,
|
||
command.HolidayWork, breakTime, command.WorkshopShiftStatus, command.IrregularShift, command.LeavePermittedDays, customizeRotatingShifts, weeklyOffDays);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.Create(entity);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
return op.Succcedded();
|
||
}
|
||
|
||
//Create Employee Settings with Group data. It will Replace the Group data (such as salary, shifts and ...) on Employee settings On creation.
|
||
public OperationResult CreateEmployeesSettingsAndSetChanges(EditCustomizeEmployeeSettings command)
|
||
{
|
||
var op = new OperationResult();
|
||
var customizeWorkshopGroupSettings = _customizeWorkshopGroupSettingsRepository.Get(command.GroupId);
|
||
if (customizeWorkshopGroupSettings == null)
|
||
{
|
||
return op.Failed("گروه انتخاب شده نا معتبر است");
|
||
}
|
||
|
||
if (_customizeWorkshopEmployeeSettingsRepository
|
||
.Exists(x => x.WorkshopId == command.WorkshopId && command.EmployeeIds.Contains(x.EmployeeId)))
|
||
{
|
||
foreach (var employeeId in command.EmployeeIds)
|
||
{
|
||
_customizeWorkshopEmployeeSettingsRepository.RemoveByWorkshopIdAndEmployeeId(command.WorkshopId, employeeId);
|
||
}
|
||
}
|
||
|
||
if (customizeWorkshopGroupSettings.MainGroup)
|
||
{
|
||
var createDefaultEmployee = CreateEmployeeSettings(command);
|
||
return createDefaultEmployee;
|
||
}
|
||
|
||
|
||
List<CustomizeWorkshopEmployeeSettingsShift> shiftCollection = new List<CustomizeWorkshopEmployeeSettingsShift>();
|
||
List<CustomizeRotatingShift> rotatingShift = [];
|
||
var isChanged = false;
|
||
#region validation
|
||
|
||
//var commandOffDayHashSet = command.WeeklyOffDays.ToHashSet();
|
||
var commandOffDayHashSet = command.WeeklyOffDays?.ToHashSet() ?? [];
|
||
|
||
var groupOffDayHashSet = customizeWorkshopGroupSettings.WeeklyOffDays?.Select(x => x.DayOfWeek).ToHashSet()??[];
|
||
|
||
if (command.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
if (command.ShiftViewModel.Any(x => string.IsNullOrWhiteSpace(x.StartTime) || string.IsNullOrWhiteSpace(x.EndTime)))
|
||
return op.Failed("ساعات کاری شروع و پایان نمیتواند خالی باشد");
|
||
try
|
||
{
|
||
shiftCollection =
|
||
command.ShiftViewModel.Select(x =>
|
||
{
|
||
var placement = x.Placement switch
|
||
{
|
||
ShiftPlacement.First => "اول",
|
||
ShiftPlacement.Second => "دوم",
|
||
ShiftPlacement.Third => "سوم"
|
||
};
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException($"فرمت شروع نوبت{placement}نادرست است");
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException($"فرمت پایان نوبت{placement}نادرست است");
|
||
|
||
|
||
return new CustomizeWorkshopEmployeeSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
}
|
||
catch (InvalidDataException e)
|
||
{
|
||
|
||
return op.Failed(e.Message);
|
||
}
|
||
DateTime previousEnd = new DateTime();
|
||
var finalShiftList = new List<(DateTime start, DateTime end, ShiftPlacement placement)>();
|
||
|
||
shiftCollection = shiftCollection.OrderBy(x => x.Placement).ToList();
|
||
|
||
foreach (var shift in shiftCollection)
|
||
{
|
||
(DateTime start, DateTime end, ShiftPlacement placement) newShift =
|
||
new()
|
||
{
|
||
placement = shift.Placement,
|
||
start = new DateTime(DateOnly.MinValue, shift.StartTime),
|
||
end = new DateTime(DateOnly.MinValue, shift.EndTime)
|
||
|
||
|
||
};
|
||
|
||
if (previousEnd != new DateTime())
|
||
{
|
||
if (newShift.start == previousEnd)
|
||
{
|
||
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
|
||
}
|
||
|
||
if (newShift.start <= previousEnd)
|
||
{
|
||
newShift.start = newShift.start.AddDays(1);
|
||
}
|
||
}
|
||
while (newShift.start >= newShift.end)
|
||
{
|
||
newShift.end = newShift.end.AddDays(1);
|
||
}
|
||
finalShiftList.Add(newShift);
|
||
previousEnd = newShift.end;
|
||
}
|
||
//var firstWorkshopTimeShift = workshopSettings.CustomizeWorkshopSettingsShifts.MinBy(x => x.Placement).StartTime;
|
||
//var lastWorkshopTimeShift = workshopSettings.CustomizeWorkshopSettingsShifts.MaxBy(x => x.Placement).EndTime;
|
||
|
||
//var startDateTime = new DateTime(DateOnly.MinValue, firstWorkshopTimeShift);
|
||
//var lastDateTime = new DateTime(DateOnly.MinValue, lastWorkshopTimeShift);
|
||
//if (lastDateTime < startDateTime)
|
||
//{
|
||
// lastDateTime = lastDateTime.AddDays(1);
|
||
//}
|
||
|
||
//var lastGroupShift = finalShiftList.MaxBy(x => x.placement).end;
|
||
//var firstGroupShift = finalShiftList.MinBy(x => x.placement).start;
|
||
//if (lastDateTime < lastGroupShift || firstGroupShift < startDateTime)
|
||
//{
|
||
// return op.Failed("ساعت کاری گروه باید بین ساعت کاری کارگاه باشد");
|
||
//}
|
||
|
||
|
||
|
||
if (shiftCollection.All(x => customizeWorkshopGroupSettings.CustomizeWorkshopGroupSettingsShifts.Any(y => x.Equals(y)))
|
||
&& command.WorkshopShiftStatus == customizeWorkshopGroupSettings.WorkshopShiftStatus && command.HolidayWork == customizeWorkshopGroupSettings.HolidayWork &&
|
||
command.BreakTime == customizeWorkshopGroupSettings.BreakTime &&commandOffDayHashSet.SetEquals(groupOffDayHashSet))
|
||
{
|
||
isChanged = false;
|
||
}
|
||
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else if (command.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
|
||
{
|
||
var irregularShiftStartTime = new DateTime(DateOnly.MinValue, command.IrregularShift.StartTime);
|
||
|
||
var irregularShiftEndTime = new DateTime(DateOnly.MinValue, command.IrregularShift.EndTime);
|
||
|
||
if (irregularShiftEndTime < irregularShiftStartTime)
|
||
{
|
||
irregularShiftEndTime = irregularShiftEndTime.AddDays(1);
|
||
}
|
||
|
||
switch (command.IrregularShift.WorkshopIrregularShifts)
|
||
{
|
||
case WorkshopIrregularShifts.TwelveThirtySix:
|
||
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
case WorkshopIrregularShifts.TwelveTwentyFour:
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
}
|
||
if (command.WorkshopShiftStatus == customizeWorkshopGroupSettings.WorkshopShiftStatus && command.BreakTime == customizeWorkshopGroupSettings.BreakTime &&
|
||
command.IrregularShift == customizeWorkshopGroupSettings.IrregularShift && commandOffDayHashSet.SetEquals(groupOffDayHashSet) &&
|
||
command.HolidayWork == customizeWorkshopGroupSettings.HolidayWork)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (command.CustomizeRotatingShifts.Count == 1)
|
||
{
|
||
return op.Failed("در نوع گردشی میبایست بیشتر از یک شیفت تعریف کنید");
|
||
}
|
||
rotatingShift = command.CustomizeRotatingShifts
|
||
.Select(x => new CustomizeRotatingShift(TimeOnly.Parse(x.StartTime), TimeOnly.Parse(x.EndTime)))
|
||
.ToList();
|
||
|
||
if (rotatingShift.All(x => customizeWorkshopGroupSettings.CustomizeRotatingShifts.Any(y => x.Equals(y)))
|
||
&& command.WorkshopShiftStatus == customizeWorkshopGroupSettings.WorkshopShiftStatus &&
|
||
commandOffDayHashSet.SetEquals(groupOffDayHashSet) &&
|
||
command.HolidayWork == customizeWorkshopGroupSettings.HolidayWork && command.BreakTime == customizeWorkshopGroupSettings.BreakTime)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
var breakTime = new BreakTime(command.BreakTime.HasBreakTimeValue, command.BreakTime.BreakTimeValue);
|
||
|
||
|
||
var weeklyOffDays = command.WeeklyOffDays?.Select(x => new WeeklyOffDay(x)).ToList() ?? [];
|
||
|
||
var entity = new CustomizeWorkshopEmployeeSettings(customizeWorkshopGroupSettings.FridayPay, customizeWorkshopGroupSettings.OverTimePay,
|
||
customizeWorkshopGroupSettings.BaseYearsPay, customizeWorkshopGroupSettings.BonusesPay, customizeWorkshopGroupSettings.NightWorkPay, customizeWorkshopGroupSettings.MarriedAllowance,
|
||
customizeWorkshopGroupSettings.ShiftPay, customizeWorkshopGroupSettings.FamilyAllowance, customizeWorkshopGroupSettings.LeavePay, customizeWorkshopGroupSettings.InsuranceDeduction, customizeWorkshopGroupSettings.FineAbsenceDeduction,
|
||
customizeWorkshopGroupSettings.LateToWork, customizeWorkshopGroupSettings.EarlyExit, command.EmployeeIds.First(), command.WorkshopId, customizeWorkshopGroupSettings.Salary, command.GroupId,
|
||
shiftCollection, command.HolidayWork, command.IrregularShift, command.WorkshopShiftStatus, breakTime, command.LeavePermittedDays, rotatingShift, weeklyOffDays);
|
||
|
||
_customizeWorkshopEmployeeSettingsRepository.Create(entity);
|
||
|
||
entity.SimpleEdit(shiftCollection, command.IrregularShift, command.WorkshopShiftStatus, command.BreakTime, isChanged, command.HolidayWork, rotatingShift, weeklyOffDays.ToList());
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
return op.Succcedded();
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
public OperationResult EditWorkshopSettingShifts(List<CustomizeWorkshopShiftViewModel> shiftViewModels, long customizeWorkshopSettingsId,
|
||
WorkshopShiftStatus workshopShiftStatus, HolidayWork holidayWork, List<DayOfWeek> weeklyOffDays)
|
||
{
|
||
OperationResult op = new OperationResult();
|
||
var entity = _customizeWorkshopSettingsRepository.Get(customizeWorkshopSettingsId);
|
||
if (entity == null)
|
||
return op.Failed("چنین آیتمی وجود ندارد");
|
||
|
||
//تبدیل شیفت های ویو مدل به انتیتی
|
||
List<CustomizeWorkshopSettingsShift> shiftCollection = [];
|
||
|
||
#region Validation
|
||
if (workshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
try
|
||
{
|
||
shiftCollection =
|
||
shiftViewModels.Select(x =>
|
||
{
|
||
var placement = x.Placement switch
|
||
{
|
||
ShiftPlacement.First => "اول",
|
||
ShiftPlacement.Second => "دوم",
|
||
ShiftPlacement.Third => "سوم",
|
||
_ => throw new ArgumentOutOfRangeException()
|
||
};
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException($"فرمت شروع نوبت{placement}نادرست است");
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException($"فرمت پایان نوبت{placement}نادرست است");
|
||
|
||
|
||
return new CustomizeWorkshopSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
}
|
||
catch (InvalidDataException e)
|
||
{
|
||
|
||
return op.Failed(e.Message);
|
||
}
|
||
|
||
DateTime day = DateTime.Now;
|
||
DateTime previousEnd = new DateTime();
|
||
var finalShiftList = new List<(DateTime start, DateTime end, ShiftPlacement placement)>();
|
||
|
||
shiftCollection = shiftCollection.OrderBy(x => x.Placement).ToList();
|
||
|
||
foreach (var shift in shiftCollection)
|
||
{
|
||
(DateTime start, DateTime end, ShiftPlacement placement) newShift =
|
||
new()
|
||
{
|
||
placement = shift.Placement,
|
||
start = new DateTime(DateOnly.FromDateTime(day), shift.StartTime),
|
||
end = new DateTime(DateOnly.FromDateTime(day), shift.EndTime)
|
||
|
||
|
||
};
|
||
|
||
if (previousEnd != new DateTime())
|
||
{
|
||
if (newShift.start == previousEnd)
|
||
{
|
||
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
|
||
}
|
||
|
||
if (newShift.start <= previousEnd)
|
||
{
|
||
newShift.start = newShift.start.AddDays(1);
|
||
}
|
||
}
|
||
while (newShift.start >= newShift.end)
|
||
{
|
||
newShift.end = newShift.end.AddDays(1);
|
||
}
|
||
finalShiftList.Add(newShift);
|
||
previousEnd = newShift.end;
|
||
}
|
||
|
||
var firstShiftStart = finalShiftList.FirstOrDefault(x => x.placement == ShiftPlacement.First).start;
|
||
var lastShiftEnd = finalShiftList.OrderByDescending(x => x.placement).FirstOrDefault().end;
|
||
if (firstShiftStart.AddDays(1) < lastShiftEnd)
|
||
return op.Failed("بازه زمانی کارگاه نامعتبر است");
|
||
var total = finalShiftList.Sum(x => (x.end - x.start).TotalHours);
|
||
if (total >= 24)
|
||
{
|
||
return op.Failed("بازه زمانی کارگاه نمیتواند بیشتر از 24 ساعت باشد");
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
var offDays = weeklyOffDays?.Select(x => new WeeklyOffDay(x)).ToList()??[];
|
||
|
||
using var transActionScope = new TransactionScope();
|
||
entity.ChangeWorkshopShifts(shiftCollection, workshopShiftStatus, holidayWork, offDays);
|
||
|
||
|
||
//op = ChangeAllGroupsShiftsWithEmployees(entity, replaceChangedGroups);
|
||
//if (!op.IsSuccedded)
|
||
//{
|
||
// return op;
|
||
//}
|
||
_customizeWorkshopSettingsRepository.SaveChanges();
|
||
|
||
if (!(_customizeWorkshopGroupSettingsRepository.Exists(x => x.CustomizeWorkshopSettingId == entity.id && x.MainGroup)) && entity.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
var operationResult = CreateGeneralGroup(entity);
|
||
if (!operationResult.IsSuccedded)
|
||
return operationResult;
|
||
}
|
||
transActionScope.Complete();
|
||
return op.Succcedded();
|
||
}
|
||
public OperationResult EditSimpleRollCallGroupSetting(EditCustomizeWorkshopGroupSettings command,
|
||
List<ReCalculateRollCallValues> reCalculateCommand)
|
||
{
|
||
OperationResult op = new();
|
||
|
||
#region Validation
|
||
|
||
if (string.IsNullOrWhiteSpace(command.Name))
|
||
return op.Failed("لطفا نام گروه را وارد کنید");
|
||
|
||
if (!_customizeWorkshopGroupSettingsRepository.Exists(x => x.id == command.Id))
|
||
return op.Failed("چنین ساعت کاری برای گروه وجود ندارد");
|
||
|
||
#endregion
|
||
|
||
|
||
var entity = _customizeWorkshopGroupSettingsRepository.GetWithEmployees(command.Id);
|
||
|
||
var workshopSettings = _customizeWorkshopSettingsRepository.Get(entity.CustomizeWorkshopSettingId);
|
||
|
||
//var employeeIds = command.IsShiftChanged ? entity.CustomizeWorkshopEmployeeSettingsCollection
|
||
// .Select(x => x.id).ToList() : entity.CustomizeWorkshopEmployeeSettingsCollection.Where(x => !x.IsShiftChanged)
|
||
// .Select(x => x.id).ToList();
|
||
|
||
|
||
var groupSettingsShifts = new List<CustomizeWorkshopGroupSettingsShift>();
|
||
ICollection<CustomizeRotatingShift> rotatingShift = [];
|
||
bool isChanged;
|
||
|
||
//var commandOffDayHashSet = command.OffDayOfWeeks.ToHashSet();
|
||
var commandOffDayHashSet = command.OffDayOfWeeks?.ToHashSet() ?? [];
|
||
|
||
var workshopOffDayHashSet = workshopSettings.WeeklyOffDays?.Select(x => x.DayOfWeek).ToHashSet()??[];
|
||
|
||
if (command.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
|
||
groupSettingsShifts = command.ShiftViewModel.Select(x =>
|
||
{
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException();
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException();
|
||
|
||
return new CustomizeWorkshopGroupSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
|
||
if (groupSettingsShifts.All(x => workshopSettings.CustomizeWorkshopSettingsShifts.Any(y => x.Equals(y)))
|
||
&& command.WorkshopShiftStatus == workshopSettings.WorkshopShiftStatus && commandOffDayHashSet.SetEquals(workshopOffDayHashSet) &&
|
||
command.HolidayWork == workshopSettings.HolidayWork &&
|
||
command.BreakTime == workshopSettings.BreakTime)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else if (command.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
|
||
{
|
||
var irregularShiftStartTime = new DateTime(DateOnly.MinValue, command.IrregularShift.StartTime);
|
||
|
||
var irregularShiftEndTime = new DateTime(DateOnly.MinValue, command.IrregularShift.EndTime);
|
||
|
||
if (irregularShiftEndTime < irregularShiftStartTime)
|
||
{
|
||
irregularShiftEndTime = irregularShiftEndTime.AddDays(1);
|
||
}
|
||
|
||
switch (command.IrregularShift.WorkshopIrregularShifts)
|
||
{
|
||
case WorkshopIrregularShifts.TwelveThirtySix:
|
||
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
case WorkshopIrregularShifts.TwelveTwentyFour:
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
}
|
||
if (command.WorkshopShiftStatus == workshopSettings.WorkshopShiftStatus && command.BreakTime == workshopSettings.BreakTime
|
||
&& commandOffDayHashSet.SetEquals(workshopOffDayHashSet) &&
|
||
command.HolidayWork == workshopSettings.HolidayWork)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (command.CustomizeRotatingShiftsViewModels.Count == 1)
|
||
{
|
||
return op.Failed("در نوع گردشی میبایست بیشتر از یک شیفت تعریف کنید");
|
||
}
|
||
|
||
rotatingShift = command.CustomizeRotatingShiftsViewModels
|
||
.Select(x => new CustomizeRotatingShift(TimeOnly.Parse(x.StartTime), TimeOnly.Parse(x.EndTime))).ToList();
|
||
if (command.WorkshopShiftStatus == workshopSettings.WorkshopShiftStatus && command.BreakTime == workshopSettings.BreakTime
|
||
&& commandOffDayHashSet.SetEquals(workshopOffDayHashSet) &&
|
||
command.HolidayWork == workshopSettings.HolidayWork)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
|
||
var breakTime = new BreakTime(command.BreakTime.HasBreakTimeValue, command.BreakTime.BreakTimeValue);
|
||
|
||
var employeeSettings = entity.CustomizeWorkshopEmployeeSettingsCollection;
|
||
|
||
var employeeSettingIds = employeeSettings.Select(x => x.EmployeeId).ToList();
|
||
|
||
reCalculateCommand = reCalculateCommand.Where(x => employeeSettingIds.Contains(x.EmployeeId)).ToList();
|
||
|
||
var selectedEmployeesIds = reCalculateCommand.Select(x => x.EmployeeId).ToList();
|
||
|
||
var notSelectedEmployeeSettings = employeeSettings.Where(x => !selectedEmployeesIds.Contains(x.EmployeeId));
|
||
|
||
var weeklyOffDays = command.OffDayOfWeeks?.Select(x => new WeeklyOffDay(x)).ToList() ?? [];
|
||
using var transaction = new TransactionScope();
|
||
|
||
entity.EditSimpleAndOverwriteOnEmployee(command.Name, selectedEmployeesIds, groupSettingsShifts, command.WorkshopShiftStatus,
|
||
command.IrregularShift, breakTime, isChanged, command.HolidayWork, rotatingShift, weeklyOffDays);
|
||
if (reCalculateCommand.Count > 0)
|
||
{
|
||
var result = _rollCallApplication.RecalculateValues(workshopSettings.WorkshopId, reCalculateCommand);
|
||
|
||
if (result.IsSuccedded == false)
|
||
{
|
||
return result;
|
||
}
|
||
}
|
||
|
||
foreach (var notSelectedEmployeeSetting in notSelectedEmployeeSettings)
|
||
{
|
||
notSelectedEmployeeSetting.UpdateIsShiftChange();
|
||
}
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
|
||
transaction.Complete();
|
||
return op.Succcedded();
|
||
}
|
||
public OperationResult EditSimpleRollCallEmployeeSetting(EditCustomizeEmployeeSettings command,
|
||
List<ReCalculateRollCallValues> reCalculateCommand)
|
||
{
|
||
OperationResult op = new();
|
||
|
||
var entity = _customizeWorkshopEmployeeSettingsRepository.Get(command.Id);
|
||
|
||
#region Validation
|
||
|
||
if (entity == null)
|
||
return op.Failed("چنین پرسنلی وجود ندارد");
|
||
|
||
#endregion
|
||
|
||
var groupSettings =
|
||
_customizeWorkshopGroupSettingsRepository.GetIncludeWorkshopSettings(
|
||
entity.CustomizeWorkshopGroupSettingId);
|
||
|
||
List<CustomizeWorkshopEmployeeSettingsShift> employeesShifts = [];
|
||
|
||
ICollection<CustomizeRotatingShift> rotatingShift = [];
|
||
bool isChanged = false;
|
||
|
||
var commandOffDayHashSet = command.WeeklyOffDays?.ToHashSet()??[];
|
||
var groupOffDayHashSet = groupSettings.WeeklyOffDays?.Select(x => x.DayOfWeek).ToHashSet()??[];
|
||
|
||
if (command.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
|
||
#region Validation
|
||
if (command.ShiftViewModel.Any(x => string.IsNullOrWhiteSpace(x.StartTime) || string.IsNullOrWhiteSpace(x.EndTime)))
|
||
return op.Failed("ساعات کاری شروع و پایان نمیتواند خالی باشد");
|
||
try
|
||
{
|
||
employeesShifts =
|
||
command.ShiftViewModel.Select(x =>
|
||
{
|
||
var placement = x.Placement switch
|
||
{
|
||
ShiftPlacement.First => "اول",
|
||
ShiftPlacement.Second => "دوم",
|
||
ShiftPlacement.Third => "سوم"
|
||
};
|
||
if (!TimeOnly.TryParseExact(x.StartTime, "HH:mm", out TimeOnly start))
|
||
throw new InvalidDataException($"فرمت شروع نوبت{placement}نادرست است");
|
||
if (!TimeOnly.TryParseExact(x.EndTime, "HH:mm", out TimeOnly end))
|
||
throw new InvalidDataException($"فرمت پایان نوبت{placement}نادرست است");
|
||
|
||
|
||
return new CustomizeWorkshopEmployeeSettingsShift(start, end, x.Placement);
|
||
|
||
}).ToList();
|
||
}
|
||
catch (InvalidDataException e)
|
||
{
|
||
|
||
return op.Failed(e.Message);
|
||
}
|
||
if (command.WorkshopId < 1)
|
||
{
|
||
return op.Failed("خطای سیستمی");
|
||
}
|
||
DateTime day = DateTime.Now;
|
||
DateTime previousEnd = new DateTime();
|
||
var finalShiftList = new List<(DateTime start, DateTime end, ShiftPlacement placement)>();
|
||
|
||
employeesShifts = employeesShifts.OrderBy(x => x.Placement).ToList();
|
||
|
||
foreach (var shift in employeesShifts)
|
||
{
|
||
(DateTime start, DateTime end, ShiftPlacement placement) newShift =
|
||
new()
|
||
{
|
||
placement = shift.Placement,
|
||
start = new DateTime(DateOnly.FromDateTime(day), shift.StartTime),
|
||
end = new DateTime(DateOnly.FromDateTime(day), shift.EndTime)
|
||
|
||
|
||
};
|
||
|
||
if (previousEnd != new DateTime())
|
||
{
|
||
if (newShift.start == previousEnd)
|
||
{
|
||
return op.Failed("در شیفت منظم پایان شیفت نمیتواند با شروع شیفت بعدی برابر باشد");
|
||
}
|
||
|
||
if (newShift.start <= previousEnd)
|
||
{
|
||
newShift.start = newShift.start.AddDays(1);
|
||
}
|
||
}
|
||
while (newShift.start >= newShift.end)
|
||
{
|
||
newShift.end = newShift.end.AddDays(1);
|
||
}
|
||
finalShiftList.Add(newShift);
|
||
previousEnd = newShift.end;
|
||
}
|
||
|
||
var firstShiftStart = finalShiftList.FirstOrDefault(x => x.placement == ShiftPlacement.First).start;
|
||
var lastShiftEnd = finalShiftList.OrderByDescending(x => x.placement).FirstOrDefault().end;
|
||
if (firstShiftStart.AddDays(1) < lastShiftEnd)
|
||
return op.Failed("بازه زمانی کارگاه نامعتبر است");
|
||
var total = finalShiftList.Sum(x => (x.end - x.start).TotalHours);
|
||
if (total >= 24)
|
||
{
|
||
return op.Failed("بازه زمانی کارگاه نمیتواند بیشتر از 24 ساعت باشد");
|
||
}
|
||
#endregion
|
||
|
||
|
||
if (employeesShifts.All(x => groupSettings.CustomizeWorkshopGroupSettingsShifts.Any(y => x.Equals(y)))
|
||
&& command.WorkshopShiftStatus == groupSettings.WorkshopShiftStatus && commandOffDayHashSet.SetEquals(groupOffDayHashSet) &&
|
||
command.HolidayWork == groupSettings.HolidayWork && command.BreakTime == groupSettings.BreakTime)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else if (command.WorkshopShiftStatus == WorkshopShiftStatus.Irregular)
|
||
{
|
||
var irregularShiftStartTime = new DateTime(DateOnly.MinValue, command.IrregularShift.StartTime);
|
||
|
||
var irregularShiftEndTime = new DateTime(DateOnly.MinValue, command.IrregularShift.EndTime);
|
||
|
||
if (irregularShiftEndTime < irregularShiftStartTime)
|
||
{
|
||
irregularShiftEndTime = irregularShiftEndTime.AddDays(1);
|
||
}
|
||
|
||
switch (command.IrregularShift.WorkshopIrregularShifts)
|
||
{
|
||
case WorkshopIrregularShifts.TwelveThirtySix:
|
||
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
case WorkshopIrregularShifts.TwelveTwentyFour:
|
||
if ((irregularShiftEndTime - irregularShiftStartTime).TotalHours > 12)
|
||
{
|
||
return op.Failed("ساعت کاری شما نمیتواند بیشتر از 12 ساعت باشد");
|
||
}
|
||
break;
|
||
}
|
||
|
||
if (command.WorkshopShiftStatus == groupSettings.WorkshopShiftStatus && command.BreakTime == groupSettings.BreakTime &&
|
||
command.IrregularShift == groupSettings.IrregularShift && commandOffDayHashSet.SetEquals(groupOffDayHashSet) &&
|
||
command.HolidayWork == groupSettings.HolidayWork)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (command.CustomizeRotatingShifts.Count == 1)
|
||
{
|
||
return op.Failed("در نوع گردشی میبایست بیشتر از یک شیفت تعریف کنید");
|
||
}
|
||
|
||
rotatingShift = command.CustomizeRotatingShifts
|
||
.Select(x => new CustomizeRotatingShift(TimeOnly.Parse(x.StartTime), TimeOnly.Parse(x.EndTime))).ToList();
|
||
|
||
if (rotatingShift.All(x => groupSettings.CustomizeRotatingShifts.Any(y => x.Equals(y)))
|
||
&& command.WorkshopShiftStatus == groupSettings.WorkshopShiftStatus && commandOffDayHashSet.SetEquals(groupOffDayHashSet) &&
|
||
command.HolidayWork == groupSettings.HolidayWork && command.BreakTime == groupSettings.BreakTime)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
|
||
}
|
||
|
||
var weeklyOffDays = command.WeeklyOffDays?.Select(x => new WeeklyOffDay(x)).ToList()??[];
|
||
using var transaction = new TransactionScope();
|
||
|
||
entity.SimpleEdit(employeesShifts, command.IrregularShift, command.WorkshopShiftStatus, command.BreakTime,
|
||
isChanged, command.HolidayWork, rotatingShift, weeklyOffDays);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
if (reCalculateCommand.Count > 0)
|
||
{
|
||
var result = _rollCallApplication.RecalculateValues(command.WorkshopId, reCalculateCommand);
|
||
|
||
if (result.IsSuccedded == false)
|
||
{
|
||
return result;
|
||
}
|
||
}
|
||
|
||
|
||
transaction.Complete();
|
||
|
||
return op.Succcedded();
|
||
}
|
||
|
||
//Remove the Employee From the Group Settings
|
||
public OperationResult RemoveEmployeeFromRollCallWorkshopGroup(long employeeId, long groupId, long workshopId)
|
||
{
|
||
OperationResult op = new();
|
||
var groupEntity = _customizeWorkshopGroupSettingsRepository.GetWithEmployees(groupId);
|
||
|
||
#region Validation
|
||
|
||
if (groupEntity == null)
|
||
{
|
||
return op.Failed("چنین گروهی وجود ندارد");
|
||
}
|
||
|
||
#endregion
|
||
|
||
using var transaction = new TransactionScope();
|
||
groupEntity.RemoveEmployeeFromGroup(employeeId);
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
var res = AddEmployeeToMainGroupSettings(workshopId, employeeId);
|
||
if (res.IsSuccedded)
|
||
{
|
||
transaction.Complete();
|
||
return op.Succcedded();
|
||
|
||
}
|
||
|
||
return res;
|
||
|
||
}
|
||
|
||
public OperationResult AddEmployeeToMainGroupSettings(long workshopId, long employeeId)
|
||
{
|
||
var op = new OperationResult();
|
||
|
||
var mainGroup = _customizeWorkshopGroupSettingsRepository.GetWorkshopMainGroup(workshopId);
|
||
if (mainGroup == null)
|
||
return op.Succcedded();
|
||
mainGroup.AddEmployeeSettingToGroupWithGroupData(employeeId, workshopId);
|
||
|
||
_customizeWorkshopEmployeeSettingsRepository.SaveChanges();
|
||
|
||
return op.Succcedded();
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region CustomizeCheckoutSettings
|
||
public OperationResult CreateEmployeeSettings(CreateCustomizeEmployeeSettings command)
|
||
{
|
||
OperationResult op = new();
|
||
CustomizeWorkshopGroupSettings mainGroup = new CustomizeWorkshopGroupSettings();
|
||
|
||
#region Validation
|
||
|
||
//if (!_customizeWorkshopGroupSettingsRepository.Exists(x => x.id == command.GroupId))
|
||
// return op.Failed("چنین گروهی وجود ندارد");
|
||
|
||
if (!_employeeRepository.ExistsIgnoreQueryFilter(x => command.EmployeeIds.Any(y => x.id == y)))
|
||
return op.Failed("چنین پرسنلی وجود ندارد");
|
||
|
||
#endregion
|
||
|
||
var groupData = _customizeWorkshopGroupSettingsRepository.GetIncludeWorkshopSettings(command.GroupId);
|
||
if (groupData == null)
|
||
return op.Failed("خطای سیستمی");
|
||
var workshopSettings = _customizeWorkshopSettingsRepository.Get(groupData.CustomizeWorkshopSettingId);
|
||
var employeesInMainGroup = new List<CustomizeWorkshopEmployeeSettings>();
|
||
|
||
mainGroup = _customizeWorkshopGroupSettingsRepository.GetWorkshopMainGroup(command.WorkshopId);
|
||
|
||
if (workshopSettings.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
if (mainGroup != null)
|
||
{
|
||
|
||
employeesInMainGroup = _customizeWorkshopEmployeeSettingsRepository.GetBy(mainGroup.id);
|
||
if (_customizeWorkshopEmployeeSettingsRepository.Exists(x => x.WorkshopId == command.WorkshopId
|
||
&& command.EmployeeIds.Contains(x.EmployeeId) && x.CustomizeWorkshopGroupSettingId != mainGroup.id))
|
||
{
|
||
return op.Failed("این پرسنل در گروه دیگری وجود دارد");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (_customizeWorkshopEmployeeSettingsRepository.Exists(x => x.WorkshopId == command.WorkshopId
|
||
&& command.EmployeeIds.Contains(x.EmployeeId)))
|
||
{
|
||
return op.Failed("این پرسنل در گروه دیگری وجود دارد");
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (mainGroup != null)
|
||
{
|
||
employeesInMainGroup = _customizeWorkshopEmployeeSettingsRepository.GetBy(mainGroup.id);
|
||
if (_customizeWorkshopEmployeeSettingsRepository.Exists(x => x.WorkshopId == command.WorkshopId
|
||
&& command.EmployeeIds.Contains(
|
||
x.EmployeeId) &&
|
||
x.CustomizeWorkshopGroupSettingId !=
|
||
mainGroup.id))
|
||
{
|
||
return op.Failed("این پرسنل در گروه دیگری وجود دارد");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (_customizeWorkshopEmployeeSettingsRepository.Exists(x => x.WorkshopId == command.WorkshopId
|
||
&& command.EmployeeIds.Contains(x.EmployeeId)))
|
||
{
|
||
return op.Failed("این پرسنل در گروه دیگری وجود دارد");
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
var shifts = groupData.CustomizeWorkshopGroupSettingsShifts
|
||
.Select(x => new CustomizeWorkshopEmployeeSettingsShift(x.StartTime, x.EndTime, x.Placement)).ToList();
|
||
|
||
|
||
foreach (var id in command.EmployeeIds)
|
||
{
|
||
var employeeSettings = employeesInMainGroup.FirstOrDefault(x => x.EmployeeId == id);
|
||
if (employeeSettings != null)
|
||
{
|
||
_customizeWorkshopEmployeeSettingsRepository.Remove(employeeSettings.id);
|
||
}
|
||
var entity = new CustomizeWorkshopEmployeeSettings(
|
||
new(groupData.FridayPay.FridayPayType, groupData.FridayPay.Value),
|
||
new(groupData.OverTimePay.OverTimePayType, groupData.OverTimePay.Value),
|
||
new(groupData.BaseYearsPay.BaseYearsPayType, groupData.BaseYearsPay.Value, groupData.BaseYearsPay.PaymentType),
|
||
new(groupData.BonusesPay.BonusesPayType, groupData.BonusesPay.Value, groupData.BonusesPay.PaymentType),
|
||
new(groupData.NightWorkPay.NightWorkingType, groupData.NightWorkPay.Value),
|
||
new(groupData.MarriedAllowance.MarriedAllowanceType, groupData.MarriedAllowance.Value),
|
||
new(groupData.ShiftPay.ShiftType, groupData.ShiftPay.ShiftPayType, groupData.ShiftPay.Value),
|
||
new(groupData.FamilyAllowance.FamilyAllowanceType, groupData.FamilyAllowance.Value),
|
||
new(groupData.LeavePay.LeavePayType, groupData.LeavePay.Value),
|
||
new(groupData.InsuranceDeduction.InsuranceDeductionType, groupData.InsuranceDeduction.Value),
|
||
new(groupData.FineAbsenceDeduction.FineAbsenceDeductionType, groupData.FineAbsenceDeduction.Value,
|
||
groupData.FineAbsenceDeduction.FineAbsenceDayOfWeekCollection
|
||
.Select(x => new FineAbsenceDayOfWeek(x.DayOfWeek)).ToList()),
|
||
new(groupData.LateToWork.LateToWorkType,
|
||
groupData.LateToWork.LateToWorkTimeFines.Select(x => new LateToWorkTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), groupData.LateToWork.Value),
|
||
new(groupData.EarlyExit.EarlyExitType,
|
||
groupData.EarlyExit.EarlyExitTimeFines.Select(x => new EarlyExitTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), groupData.EarlyExit.Value),
|
||
id,
|
||
groupData.CustomizeWorkshopSettings.WorkshopId,
|
||
groupData.Salary,
|
||
groupData.id,
|
||
shifts.Select(x => new CustomizeWorkshopEmployeeSettingsShift(x.StartTime, x.EndTime, x.Placement))
|
||
.ToList(),
|
||
groupData.HolidayWork,
|
||
groupData.IrregularShift,
|
||
groupData.WorkshopShiftStatus,
|
||
new(groupData.BreakTime.HasBreakTimeValue, groupData.BreakTime.BreakTimeValue),
|
||
command.LeavePermittedDays,
|
||
groupData.CustomizeRotatingShifts.Select(x => new CustomizeRotatingShift(x.StartTime, x.EndTime)).ToList(),
|
||
groupData.WeeklyOffDays
|
||
);
|
||
|
||
_customizeWorkshopEmployeeSettingsRepository.Create(entity);
|
||
|
||
}
|
||
_customizeWorkshopEmployeeSettingsRepository.SaveChanges();
|
||
|
||
|
||
return op.Succcedded();
|
||
}
|
||
|
||
//Edit the Workshop Settings Data
|
||
public OperationResult EditWorkshopSetting(EditCustomizeWorkshopSettings command, bool replaceInAllGroups)
|
||
{
|
||
OperationResult op = new();
|
||
|
||
#region Validation
|
||
|
||
if (!_customizeWorkshopSettingsRepository.Exists(x => x.id == command.Id))
|
||
return op.Failed("خطای سیستمی");
|
||
|
||
#endregion
|
||
|
||
|
||
var entity = _customizeWorkshopSettingsRepository.Get(command.Id);
|
||
if (entity == null)
|
||
return op.Failed("چنین آیتمی وجود ندارد");
|
||
|
||
|
||
FridayPay fridayPay = new(command.FridayPay.FridayPayType, command.FridayPay.Value);
|
||
OverTimePay overTimePay = new(command.OverTimePay.OverTimePayType, command.OverTimePay.Value);
|
||
BaseYearsPay baseYearsPay = new(command.BaseYearsPay.BaseYearsPayType, command.BaseYearsPay.Value, command.BaseYearsPay.PaymentType);
|
||
BonusesPay bonusesPay = new(command.BonusesPay.BonusesPayType, command.BonusesPay.Value, command.BonusesPay.PaymentType);
|
||
NightWorkPay nightWorkPay = new(command.NightWorkPay.NightWorkingType, command.NightWorkPay.Value);
|
||
MarriedAllowance marriedAllowance = new(command.MarriedAllowance.MarriedAllowanceType, command.MarriedAllowance.Value);
|
||
ShiftPay shiftPay = new(ShiftType.None, ShiftPayType.None, 0);
|
||
FamilyAllowance familyAllowance = new(command.FamilyAllowance.FamilyAllowanceType, command.FamilyAllowance.Value);
|
||
LeavePay leavePay = new(command.LeavePay.LeavePayType, command.LeavePay.Value);
|
||
InsuranceDeduction insuranceDeduction = new(command.InsuranceDeduction.InsuranceDeductionType, command.InsuranceDeduction.Value);
|
||
FineAbsenceDeduction fineAbsenceDeduction = new(
|
||
command.FineAbsenceDeduction.FineAbsenceDeductionType,
|
||
command.FineAbsenceDeduction.Value,
|
||
command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels?.Select(x => new FineAbsenceDayOfWeek(x.DayOfWeek)).ToList() ?? new List<FineAbsenceDayOfWeek>()
|
||
);
|
||
LateToWork lateToWork = new(
|
||
command.LateToWork.LateToWorkType,
|
||
command.LateToWork.LateToWorkTimeFinesVewModels?.Select(x => new LateToWorkTimeFine(x.Minute, x.FineMoney))
|
||
.ToList() ?? new List<LateToWorkTimeFine>()
|
||
, command.LateToWork.Value
|
||
);
|
||
|
||
EarlyExit earlyExit = new(command.EarlyExit.EarlyExitType,
|
||
command.EarlyExit.EarlyExitTimeFinesViewModels?.Select(x => new EarlyExitTimeFine(x.Minute, x.FineMoney)).ToList() ?? new List<EarlyExitTimeFine>()
|
||
, command.EarlyExit.Value);
|
||
|
||
|
||
var groups = _customizeWorkshopGroupSettingsRepository.GetAllGroupsIncludeEmployeeSettingsByWorkshopSettingsId(entity.id);
|
||
|
||
using (var transaction = new TransactionScope())
|
||
{
|
||
|
||
try
|
||
{
|
||
entity.Edit(fridayPay, overTimePay, baseYearsPay, bonusesPay, nightWorkPay, marriedAllowance, shiftPay,
|
||
familyAllowance, leavePay, insuranceDeduction,
|
||
fineAbsenceDeduction, lateToWork, earlyExit, command.HolidayWork,
|
||
command.BonusesPaysInEndOfMonth, command.LeavePermittedDays, command.BaseYearsPayInEndOfYear,
|
||
command.OverTimeThresholdMinute);
|
||
|
||
_customizeWorkshopSettingsRepository.SaveChanges();
|
||
var editViewModel = new EditCustomizeWorkshopGroupSettings()
|
||
{
|
||
|
||
};
|
||
OperationResult result = new OperationResult();
|
||
if (entity.WorkshopShiftStatus == WorkshopShiftStatus.Regular)
|
||
{
|
||
//foreach (var group in groups)
|
||
//{
|
||
// var employeeIds = group.CustomizeWorkshopEmployeeSettingsCollection.Select(x => x.EmployeeId)
|
||
// .ToList();
|
||
// group.EditAndOverwriteOnEmployees(group.GroupName,group.Salary,employeeIds,group.FridayPay,group.OverTimePay,group.BaseYearsPay,group.BonusesPay,
|
||
// group.ShiftPay,group.NightWorkPay,group.MarriedAllowance,group.FamilyAllowance,group.LeavePay,group.InsuranceDeduction,
|
||
// group.FineAbsenceDeduction,);
|
||
//}
|
||
}
|
||
else
|
||
{
|
||
result = result.Succcedded();
|
||
}
|
||
|
||
ChangeAllSettingsGroups(entity, replaceInAllGroups);
|
||
|
||
result.Succcedded();
|
||
|
||
|
||
transaction.Complete();
|
||
|
||
}
|
||
catch
|
||
{
|
||
// ignored
|
||
}
|
||
}
|
||
|
||
return string.IsNullOrWhiteSpace(op.Message) ? op.Succcedded() : op;
|
||
}
|
||
|
||
|
||
|
||
//Edit the Group Settings Data
|
||
public OperationResult EditRollCallGroupSetting(EditCustomizeWorkshopGroupSettings command)
|
||
{
|
||
OperationResult op = new();
|
||
|
||
#region Validation
|
||
|
||
if (string.IsNullOrWhiteSpace(command.Name))
|
||
return op.Failed("لطفا نام گروه را وارد کنید");
|
||
|
||
if (string.IsNullOrWhiteSpace(command.Salary))
|
||
return op.Failed("لطفا حقوق مورد نظر خود را وارد کنید");
|
||
|
||
if (!_customizeWorkshopGroupSettingsRepository.Exists(x => x.id == command.Id))
|
||
return op.Failed("چنین ساعت کاری برای گروه وجود ندارد");
|
||
|
||
#endregion
|
||
|
||
|
||
var entity = _customizeWorkshopGroupSettingsRepository.GetWithEmployees(command.Id);
|
||
|
||
FridayPay fridayPay = new(command.FridayPay.FridayPayType, command.FridayPay.Value);
|
||
OverTimePay overTimePay = new(command.OverTimePay.OverTimePayType, command.OverTimePay.Value);
|
||
BaseYearsPay baseYearsPay = new(command.BaseYearsPay.BaseYearsPayType, command.BaseYearsPay.Value, command.BaseYearsPay.PaymentType);
|
||
BonusesPay bonusesPay = new(command.BonusesPay.BonusesPayType, command.BonusesPay.Value, command.BonusesPay.PaymentType);
|
||
NightWorkPay nightWorkPay = new(command.NightWorkPay.NightWorkingType, command.NightWorkPay.Value);
|
||
MarriedAllowance marriedAllowance = new(command.MarriedAllowance.MarriedAllowanceType, command.MarriedAllowance.Value);
|
||
//ShiftPay shiftPay = new(command.ShiftPay.ShiftType, command.ShiftPay.ShiftPayType, command.ShiftPay.Value);
|
||
ShiftPay shiftPay = new(ShiftType.None, ShiftPayType.None, 0);
|
||
FamilyAllowance familyAllowance = new(command.FamilyAllowance.FamilyAllowanceType, command.FamilyAllowance.Value);
|
||
LeavePay leavePay = new(command.LeavePay.LeavePayType, command.LeavePay.Value);
|
||
InsuranceDeduction insuranceDeduction = new(command.InsuranceDeduction.InsuranceDeductionType, command.InsuranceDeduction.Value);
|
||
FineAbsenceDeduction fineAbsenceDeduction = new(
|
||
command.FineAbsenceDeduction.FineAbsenceDeductionType, command.FineAbsenceDeduction.Value,
|
||
command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels
|
||
.Select(x => new FineAbsenceDayOfWeek(x.DayOfWeek)).ToList()
|
||
);
|
||
LateToWork lateToWork = new(
|
||
command.LateToWork.LateToWorkType,
|
||
command.LateToWork.LateToWorkTimeFinesVewModels.Select(x => new LateToWorkTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), command.LateToWork.Value
|
||
);
|
||
EarlyExit earlyExit = new(command.EarlyExit.EarlyExitType,
|
||
command.EarlyExit.EarlyExitTimeFinesViewModels.Select(x => new EarlyExitTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), command.EarlyExit.Value);
|
||
|
||
double salary = command.Salary.MoneyToDouble();
|
||
|
||
|
||
bool isChanged;
|
||
if (fridayPay == entity.FridayPay && overTimePay == entity.OverTimePay && baseYearsPay == entity.BaseYearsPay && bonusesPay == entity.BonusesPay
|
||
&& shiftPay == entity.ShiftPay && nightWorkPay == entity.NightWorkPay && marriedAllowance == entity.MarriedAllowance
|
||
&& familyAllowance == entity.FamilyAllowance && leavePay == entity.LeavePay && insuranceDeduction == entity.InsuranceDeduction
|
||
&& fineAbsenceDeduction == entity.FineAbsenceDeduction && lateToWork == entity.LateToWork && earlyExit == entity.EarlyExit
|
||
&& command.HolidayWork == entity.HolidayWork && command.IrregularShift == entity.IrregularShift && command.WorkshopShiftStatus == entity.WorkshopShiftStatus)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
entity.EditAndOverwriteOnEmployees(command.Name, salary, command.EmployeeIds, fridayPay, overTimePay,
|
||
baseYearsPay, bonusesPay, shiftPay, nightWorkPay, marriedAllowance, familyAllowance,
|
||
leavePay, insuranceDeduction, fineAbsenceDeduction, lateToWork, earlyExit, command.HolidayWork, isChanged, command.LeavePermittedDays);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
|
||
return op.Succcedded();
|
||
}
|
||
|
||
//Edit the Employee settings and change the 'IsChanged' bool to true.
|
||
public OperationResult EditRollCallEmployeeSettings(EditCustomizeEmployeeSettings command)
|
||
{
|
||
OperationResult op = new();
|
||
var entity = _customizeWorkshopEmployeeSettingsRepository.Get(command.Id);
|
||
|
||
#region Validation
|
||
|
||
if (entity == null)
|
||
return op.Failed("چنین پرسنلی وجود ندارد");
|
||
|
||
#endregion
|
||
|
||
FridayPay fridayPay = new(command.FridayPay.FridayPayType, command.FridayPay.Value);
|
||
OverTimePay overTimePay = new(command.OverTimePay.OverTimePayType, command.OverTimePay.Value);
|
||
BaseYearsPay baseYearsPay = new(command.BaseYearsPay.BaseYearsPayType, command.BaseYearsPay.Value, command.BaseYearsPay.PaymentType);
|
||
BonusesPay bonusesPay = new(command.BonusesPay.BonusesPayType, command.BonusesPay.Value, command.BonusesPay.PaymentType);
|
||
NightWorkPay nightWorkPay = new(command.NightWorkPay.NightWorkingType, command.NightWorkPay.Value);
|
||
MarriedAllowance marriedAllowance = new(command.MarriedAllowance.MarriedAllowanceType, command.MarriedAllowance.Value);
|
||
// ShiftPay shiftPay = new(command.ShiftPay.ShiftType, command.ShiftPay.ShiftPayType, command.ShiftPay.Value);
|
||
ShiftPay shiftPay = new(ShiftType.None, ShiftPayType.None, 0);
|
||
FamilyAllowance familyAllowance = new(command.FamilyAllowance.FamilyAllowanceType, command.FamilyAllowance.Value);
|
||
LeavePay leavePay = new(command.LeavePay.LeavePayType, command.LeavePay.Value);
|
||
InsuranceDeduction insuranceDeduction = new(command.InsuranceDeduction.InsuranceDeductionType, command.InsuranceDeduction.Value);
|
||
FineAbsenceDeduction fineAbsenceDeduction = new(
|
||
command.FineAbsenceDeduction.FineAbsenceDeductionType, command.FineAbsenceDeduction.Value,
|
||
command.FineAbsenceDeduction.FineAbsenceDayOfWeekViewModels
|
||
.Select(x => new FineAbsenceDayOfWeek(x.DayOfWeek)).ToList()
|
||
);
|
||
LateToWork lateToWork = new(
|
||
command.LateToWork.LateToWorkType,
|
||
command.LateToWork.LateToWorkTimeFinesVewModels.Select(x => new LateToWorkTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), command.LateToWork.Value
|
||
);
|
||
EarlyExit earlyExit = new(command.EarlyExit.EarlyExitType,
|
||
command.EarlyExit.EarlyExitTimeFinesViewModels.Select(x => new EarlyExitTimeFine(x.Minute, x.FineMoney))
|
||
.ToList(), command.EarlyExit.Value);
|
||
|
||
|
||
double salary = command.Salary.MoneyToDouble();
|
||
|
||
var commandOffDayHashSet = command.WeeklyOffDays?.ToHashSet()??[];
|
||
|
||
var entityOffDayHashSet = entity.WeeklyOffDays?.Select(x => x.DayOfWeek).ToHashSet()??[];
|
||
|
||
bool isChanged;
|
||
if (fridayPay == entity.FridayPay && overTimePay == entity.OverTimePay && baseYearsPay == entity.BaseYearsPay && bonusesPay == entity.BonusesPay
|
||
&& shiftPay == entity.ShiftPay && nightWorkPay == entity.NightWorkPay && marriedAllowance == entity.MarriedAllowance
|
||
&& familyAllowance == entity.FamilyAllowance && leavePay == entity.LeavePay && insuranceDeduction == entity.InsuranceDeduction
|
||
&& fineAbsenceDeduction == entity.FineAbsenceDeduction && lateToWork == entity.LateToWork && earlyExit == entity.EarlyExit && commandOffDayHashSet.SetEquals(entityOffDayHashSet)
|
||
&& command.HolidayWork == entity.HolidayWork)
|
||
{
|
||
isChanged = false;
|
||
}
|
||
else
|
||
{
|
||
isChanged = true;
|
||
}
|
||
|
||
//change employee data manually. It changes the 'IsChanged' property to true.
|
||
entity.EditEmployees(salary, fridayPay, overTimePay, baseYearsPay,
|
||
bonusesPay, nightWorkPay, marriedAllowance, shiftPay, familyAllowance, leavePay,
|
||
insuranceDeduction, fineAbsenceDeduction, lateToWork, earlyExit, command.HolidayWork, command.IrregularShift, isChanged, command.LeavePermittedDays);
|
||
|
||
|
||
_customizeWorkshopEmployeeSettingsRepository.SaveChanges();
|
||
return op.Succcedded();
|
||
}
|
||
|
||
public OperationResult RemoveGroupSettings(long groupSettingsId)
|
||
{
|
||
OperationResult op = new OperationResult();
|
||
var entity = _customizeWorkshopGroupSettingsRepository.GetWithEmployees(groupSettingsId);
|
||
if (entity.CustomizeWorkshopEmployeeSettingsCollection.Any())
|
||
return op.Failed("نمیتوانید گروهی که پرسنل در آن وجود دارد را حذف کنید");
|
||
|
||
_customizeWorkshopGroupSettingsRepository.Remove(entity.id);
|
||
return op.Succcedded();
|
||
}
|
||
#endregion
|
||
|
||
#region Queries
|
||
|
||
|
||
public List<CustomizeWorkshopEmployeeSettingsViewModel> GetChangedEmployeeSettingsByGroupSettingsId(long groupSettingsId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.GetShiftChangedEmployeeSettingsByGroupSettingsId(
|
||
groupSettingsId);
|
||
}
|
||
|
||
|
||
// It will Get the Workshop Settings with its groups and the employees of groups.
|
||
public CustomizeWorkshopSettingsViewModel GetWorkshopSettingsByWorkshopId(long workshopId, AuthViewModel auth)
|
||
{
|
||
|
||
|
||
#region Validation
|
||
|
||
if (workshopId is < 1)
|
||
return new();
|
||
|
||
#endregion
|
||
|
||
var record = _customizeWorkshopSettingsRepository.GetWorkshopSettingsByWorkshopId(workshopId, auth);
|
||
|
||
return record;
|
||
}
|
||
|
||
public CustomizeWorkshopEmployeeSettingsViewModel GetByEmployeeIdAndWorkshopIdIncludeGroupSettings(long workshopId, long employeeId)
|
||
{
|
||
var entity =
|
||
_customizeWorkshopEmployeeSettingsRepository.GetByEmployeeIdAndWorkshopIdIncludeGroupSettings(workshopId, employeeId);
|
||
if (entity == null)
|
||
return null;
|
||
|
||
string employeeFullName = _employeeRepository.GetIgnoreQueryFilter(entity.EmployeeId).FullName;
|
||
return new CustomizeWorkshopEmployeeSettingsViewModel()
|
||
{
|
||
EmployeeId = entity.EmployeeId,
|
||
Id = entity.id,
|
||
IsSettingChanged = entity.IsSettingChanged,
|
||
IsShiftChanged = entity.IsShiftChanged,
|
||
Name = entity.CustomizeWorkshopGroupSettings.GroupName,
|
||
EmployeeFullName = employeeFullName,
|
||
Salary = entity.Salary,
|
||
BreakTime = entity.BreakTime,
|
||
WorkshopShiftStatus = entity.WorkshopShiftStatus,
|
||
IrregularShift = entity.IrregularShift,
|
||
RollCallWorkshopShifts = entity.CustomizeWorkshopEmployeeSettingsShifts.Select(x =>
|
||
new CustomizeWorkshopShiftViewModel()
|
||
{
|
||
EndTime = x.EndTime.ToString("HH:mm"),
|
||
Placement = x.Placement,
|
||
StartTime = x.StartTime.ToString("HH:mm")
|
||
}).ToList(),
|
||
//FridayWork = entity.FridayWork,
|
||
HolidayWork = entity.HolidayWork,
|
||
WeeklyOffDays = entity.WeeklyOffDays?.Select(x=>x.DayOfWeek).ToList()??[],
|
||
CustomizeRotatingShiftsViewModels = entity.CustomizeRotatingShifts.Select(x => new CustomizeRotatingShiftsViewModel()
|
||
{
|
||
StartTime = x.StartTime.ToString("HH:mm"),
|
||
EndTime = x.EndTime.ToString("HH:mm")
|
||
}).ToList()
|
||
|
||
};
|
||
}
|
||
|
||
public List<CustomizeWorkshopEmployeeSettingsViewModel> GetEmployeeSettingsByGroupSettingsId(long groupSettingsId)
|
||
{
|
||
|
||
List<CustomizeWorkshopEmployeeSettingsViewModel> result = _customizeWorkshopGroupSettingsRepository.GetEmployeeSettingsByGroupSettingsId(groupSettingsId);
|
||
|
||
if (result == null)
|
||
return new();
|
||
|
||
return result;
|
||
|
||
}
|
||
|
||
public CustomizeWorkshopSettingsViewModel GetWorkshopIncludeGroupsByWorkshopId(long workshopId)
|
||
{
|
||
return _customizeWorkshopSettingsRepository.GetWorkshopIncludeGroupsByWorkshopId(workshopId);
|
||
}
|
||
|
||
|
||
public List<EmployeeViewModel> GetEmployeesWithoutGroup(long rollCallWorkshopSettingId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.GetEmployeesWithoutGroup(rollCallWorkshopSettingId);
|
||
}
|
||
public List<EmployeeViewModel> GetEmployeesWithoutGroupByWorkshopId(long workshopId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.GetEmployeesWithoutGroupByWorkshopId(workshopId);
|
||
}
|
||
|
||
|
||
|
||
public CustomizeWorkshopSettingsViewModel GetWorkshopSettingsByWorkshopIdForAdmin(long workshopId)
|
||
{
|
||
return _customizeWorkshopSettingsRepository.GetWorkshopSettingsByWorkshopIdForAdmin(workshopId);
|
||
|
||
}
|
||
public EditCustomizeWorkshopSettings GetWorkshopSettingsDetails(long workshopId)
|
||
{
|
||
return _customizeWorkshopSettingsRepository.GetWorkshopSettingsDetails(workshopId);
|
||
}
|
||
|
||
public EditCustomizeWorkshopGroupSettings GetCustomizeWorkshopGroupSettingsDetails(long groupId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.GetCustomizeWorkshopGroupSettingsDetails(groupId);
|
||
}
|
||
|
||
public EditCustomizeWorkshopSettings GetSimpleWorkshopSettings(long workshopId)
|
||
{
|
||
return _customizeWorkshopSettingsRepository.GetSimpleWorkshopSettings(workshopId);
|
||
}
|
||
|
||
public EditCustomizeEmployeeSettings GetCustomizeEmployeeSettingsDetails(long customizeEmployeeId)
|
||
{
|
||
return _customizeWorkshopEmployeeSettingsRepository.GetCustomizeEmployeeSettingsDetails(customizeEmployeeId);
|
||
}
|
||
|
||
public List<ChangedGroupedViewModel> GetShiftChangesGroupAndEmployees(long customizeWorkshopSettingsId)
|
||
{
|
||
return _customizeWorkshopSettingsRepository.GetShiftChangesGroupAndEmployees(customizeWorkshopSettingsId);
|
||
}
|
||
|
||
public List<CustomizeWorkshopEmployeeSettingsViewModel> GetEmployeeSettingsByWorkshopId(long workshopId)
|
||
{
|
||
return _customizeWorkshopEmployeeSettingsRepository.GetEmployeeSettingsByWorkshopId(workshopId);
|
||
}
|
||
|
||
public CustomizeWorkshopGroupSettingsViewModel GetEmployeesGroupSettingsByEmployeeId(long employeeId, long workshopId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.GetEmployeesGroupSettingsByEmployeeId(employeeId, workshopId);
|
||
}
|
||
|
||
public bool HasAnyEmployeeWithoutGroup(long workshopId)
|
||
{
|
||
return _customizeWorkshopGroupSettingsRepository.HasAnyEmployeeWithoutGroup(workshopId);
|
||
}
|
||
public OperationResult<List<long>> ValidateReCalculateValueForGroupEdit(List<ReCalculateRollCallValues> commands,
|
||
long workshopId)
|
||
{
|
||
var operationResult = new OperationResult<List<long>>();
|
||
bool isSuccess = true;
|
||
List<long> employeeIdsHasCheckout = [];
|
||
foreach (var command in commands)
|
||
{
|
||
var fromDateGr = command.FromDate.ToGeorgianDateTime();
|
||
if (_checkoutRepository.Exists(x => x.WorkshopId == workshopId && x.EmployeeId == command.EmployeeId && fromDateGr <= x.ContractEnd))
|
||
{
|
||
isSuccess = false;
|
||
employeeIdsHasCheckout.Add(command.EmployeeId);
|
||
}
|
||
|
||
if (_customizeCheckoutRepository.Exists(x => x.WorkshopId == workshopId && x.EmployeeId == command.EmployeeId && fromDateGr <= x.ContractEnd))
|
||
{
|
||
isSuccess = false;
|
||
employeeIdsHasCheckout.Add(command.EmployeeId);
|
||
}
|
||
|
||
if (_customizeCheckoutTempRepository.Exists(x => x.WorkshopId == workshopId && x.EmployeeId == command.EmployeeId && fromDateGr <= x.ContractEnd))
|
||
{
|
||
isSuccess = false;
|
||
employeeIdsHasCheckout.Add(command.EmployeeId);
|
||
}
|
||
}
|
||
|
||
employeeIdsHasCheckout = employeeIdsHasCheckout.Distinct().ToList();
|
||
return isSuccess ?
|
||
operationResult.Succcedded(employeeIdsHasCheckout)
|
||
:
|
||
operationResult.Failed("پرسنل هایی دارای فیش هستند لطفا نسبت به تعیین تکلیف این ها اقدام نمایید", employeeIdsHasCheckout);
|
||
}
|
||
public bool CheckEmployeeShiftHasChanged(EditCustomizeEmployeeSettings command)
|
||
{
|
||
return _customizeWorkshopEmployeeSettingsRepository.CheckEmployeeShiftHasChanged(command);
|
||
}
|
||
|
||
private OperationResult CreateGeneralGroup(CustomizeWorkshopSettings entity)
|
||
{
|
||
var op = new OperationResult();
|
||
|
||
if (_customizeWorkshopGroupSettingsRepository.Exists(x => x.CustomizeWorkshopSettingId == entity.id && x.MainGroup))
|
||
{
|
||
return op.Succcedded();
|
||
}
|
||
|
||
try
|
||
{
|
||
var shifts =
|
||
entity.CustomizeWorkshopSettingsShifts.Select(x =>
|
||
new CustomizeWorkshopGroupSettingsShift(x.StartTime, x.EndTime, x.Placement)).ToList();
|
||
var irregularShift = new IrregularShift(new TimeOnly(), new TimeOnly(), WorkshopIrregularShifts.None);
|
||
|
||
var customizeWorkshopGroupSettings = new CustomizeWorkshopGroupSettings().CreateMainGroup(entity.FridayPay, entity.OverTimePay,
|
||
entity.BaseYearsPay, entity.BonusesPay, entity.ShiftPay, entity.NightWorkPay, entity.MarriedAllowance,
|
||
entity.FamilyAllowance, entity.LeavePay, entity.InsuranceDeduction, entity.FineAbsenceDeduction,
|
||
entity.LateToWork, entity.EarlyExit, shifts, entity.HolidayWork,
|
||
irregularShift, [], entity.WorkshopShiftStatus, entity.id, new BreakTime(false, new TimeOnly()), entity.LeavePermittedDays);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.Create(customizeWorkshopGroupSettings);
|
||
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
|
||
var employeesHasSettings = _customizeWorkshopEmployeeSettingsRepository
|
||
.GetEmployeeSettingNotInMainGroup(entity.WorkshopId).Select(x => x.EmployeeId);
|
||
|
||
var rollCallEmployeeViewModels = _rollCallEmployeeApplication.GetByWorkshopId(entity.WorkshopId).Where(x => !employeesHasSettings.Contains(x.EmployeeId));
|
||
|
||
foreach (var rollCallEmployeeViewModel in rollCallEmployeeViewModels)
|
||
{
|
||
customizeWorkshopGroupSettings.AddEmployeeSettingToGroupWithGroupData(
|
||
rollCallEmployeeViewModel.EmployeeId, entity.WorkshopId);
|
||
}
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
return op.Succcedded();
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return op.Failed(e.Message);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private OperationResult ChangeAllGroupsShiftsWithEmployees(CustomizeWorkshopSettings entity, bool replaceChangedGroups)
|
||
{
|
||
var op = new OperationResult();
|
||
var groupSettings = _customizeWorkshopGroupSettingsRepository.GetAllGroupsIncludeEmployeeSettingsByWorkshopSettingsId(entity.id);
|
||
|
||
if (!replaceChangedGroups)
|
||
{
|
||
groupSettings = groupSettings.Where(x => !x.IsShiftChange).ToList();
|
||
}
|
||
|
||
var groupShifts = entity.CustomizeWorkshopSettingsShifts
|
||
.Select(x => new CustomizeWorkshopGroupSettingsShift(x.StartTime, x.EndTime, x.Placement)).ToList();
|
||
|
||
|
||
|
||
var irregularShift = new IrregularShift(new TimeOnly(), new TimeOnly(), WorkshopIrregularShifts.None);
|
||
foreach (var customizeWorkshopGroupSettings in groupSettings)
|
||
{
|
||
customizeWorkshopGroupSettings.EditSimpleAndOverwriteOnAllEmployees(customizeWorkshopGroupSettings.GroupName,
|
||
groupShifts, entity.WorkshopShiftStatus, irregularShift, new BreakTime(false, new TimeOnly()),
|
||
false, entity.HolidayWork, [], []);
|
||
}
|
||
_customizeWorkshopGroupSettingsRepository.SaveChanges();
|
||
return op.Succcedded();
|
||
}
|
||
private void ChangeAllSettingsGroups(CustomizeWorkshopSettings customizeWorkshopSettings, bool replaceInAllGroups)
|
||
{
|
||
var op = new OperationResult();
|
||
var groupSettings = _customizeWorkshopGroupSettingsRepository.GetAllGroupsIncludeEmployeeSettingsByWorkshopSettingsId(customizeWorkshopSettings.id);
|
||
|
||
if (!replaceInAllGroups)
|
||
{
|
||
groupSettings = groupSettings.Where(x => !x.IsSettingChange).ToList();
|
||
}
|
||
|
||
|
||
|
||
foreach (var groupSetting in groupSettings)
|
||
{
|
||
groupSetting.EditAndOverwriteOnAllEmployees(groupSetting.GroupName, groupSetting.Salary,
|
||
customizeWorkshopSettings.FridayPay,
|
||
customizeWorkshopSettings.OverTimePay, customizeWorkshopSettings.BaseYearsPay,
|
||
customizeWorkshopSettings.BonusesPay, customizeWorkshopSettings.ShiftPay,
|
||
customizeWorkshopSettings.NightWorkPay, customizeWorkshopSettings.MarriedAllowance,
|
||
customizeWorkshopSettings.FamilyAllowance, customizeWorkshopSettings.LeavePay,
|
||
customizeWorkshopSettings.InsuranceDeduction, customizeWorkshopSettings.FineAbsenceDeduction,
|
||
customizeWorkshopSettings.LateToWork, customizeWorkshopSettings.EarlyExit, customizeWorkshopSettings.HolidayWork, replaceInAllGroups,
|
||
customizeWorkshopSettings.LeavePermittedDays);
|
||
}
|
||
_customizeWorkshopSettingsRepository.SaveChanges();
|
||
}
|
||
|
||
#endregion
|
||
} |