using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain._Common; using GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities; using GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Enums; using GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Repositories; namespace GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Commands.CreateSalarySettings; public class CreateSalarySettingsCommandHandler : IBaseCommandHandler { readonly ISalaryPaymentSettingRepository _salaryPaymentSettingRepository; readonly IUnitOfWork _unitOfWork; public CreateSalarySettingsCommandHandler(ISalaryPaymentSettingRepository salaryPaymentSettingRepository, IUnitOfWork unitOfWork) { _salaryPaymentSettingRepository = salaryPaymentSettingRepository; _unitOfWork = unitOfWork; } public async Task Handle(CreateSalarySettingsCommand request, CancellationToken cancellationToken) { if(_salaryPaymentSettingRepository.Exists(x=>x.UserId == request.UserId)) return OperationResult.Failure(" برای این پرسنل قبلا تنظیمات ایجاد شده است"); if (string.IsNullOrWhiteSpace(request.SalaryPerMinute)) return OperationResult.Failure("حقوق ماهانه وارد نشده اشت"); double monthlySalary = 0; try { monthlySalary = request.SalaryPerMinute.MoneyToDouble(); } catch (Exception e) { return OperationResult.Failure("مبلغ حقوق به درستی وارد نشده است"); } if (monthlySalary == 0) return OperationResult.Failure("مبلغ حقوق به درستی وارد نشده است"); var workingHoursList = new List(); foreach (var workingHours in request.WorkingHoursList) { var startShiftOne = new TimeSpan(); var endShiftOne = new TimeSpan(); var startShiftTwo = new TimeSpan(); var endShiftTwo = new TimeSpan(); var restTime = new TimeSpan(); workingHours.HasShiftOne = false; workingHours.HasRestTime = false; workingHours.HasShiftTow = false; try { if (!string.IsNullOrWhiteSpace(workingHours.StartShiftOne) && !string.IsNullOrWhiteSpace(workingHours.EndShiftOne)) { startShiftOne = TimeSpan.ParseExact(workingHours.StartShiftOne, @"hh\:mm", null); endShiftOne = TimeSpan.ParseExact(workingHours.EndShiftOne, @"hh\:mm", null); workingHours.HasShiftOne = true; if (!string.IsNullOrWhiteSpace(workingHours.RestTime)) { try { restTime = TimeSpan.ParseExact(workingHours.RestTime, @"hh\:mm", null); workingHours.HasRestTime = true; } catch (Exception e) { return OperationResult.Failure("فرمت ساعت استراحت اشتباه وارد شده است"); } } } if (!string.IsNullOrWhiteSpace(workingHours.StartShiftTwo) && !string.IsNullOrWhiteSpace(workingHours.EndShiftTwo)) { workingHours.HasRestTime = false; workingHours.HasShiftTow = true; startShiftTwo = TimeSpan.ParseExact(workingHours.StartShiftTwo, @"hh\:mm", null); endShiftTwo = TimeSpan.ParseExact(workingHours.EndShiftTwo, @"hh\:mm", null); } } catch (Exception) { return OperationResult.Failure("فرمت ساعت اشتباه وارد شده است"); } workingHoursList.Add(new WorkingHours(startShiftOne,endShiftOne,startShiftTwo, endShiftTwo,restTime,workingHours.HasShiftOne,workingHours.HasShiftTow,workingHours.HasRestTime, workingHours.PersianDayOfWeek, workingHours.IsActiveDay)); } if(workingHoursList.Count < 7) return OperationResult.Failure("خطا در تعداد روز های ارسال شده"); var salarySetting = new SalaryPaymentSetting(request.HolidayWorking, request.UserId,monthlySalary, workingHoursList); await _salaryPaymentSettingRepository.CreateAsync(salarySetting); await _unitOfWork.SaveChangesAsync(); return OperationResult.Success(); } } public record CreateSalarySettingsCommand(bool HolidayWorking, long UserId, string? SalaryPerMinute, List WorkingHoursList) : IBaseCommand; public record WorkingHoursListDto { /// /// ساعت شروع شیفت کاری /// public string? StartShiftOne { get; set; } /// /// ساعت پایان شیفت کاری /// public string? EndShiftOne { get; set; } /// /// ساعت شروع شیفت دوم کاری /// public string? StartShiftTwo { get; set; } /// /// ساعت پایان شیفت دوم کاری /// public string? EndShiftTwo { get; set; } /// /// مدت استراحت /// public string? RestTime { get; set; } /// /// آیا مقطع مار اول دارد /// public bool HasShiftOne { get; set; } /// /// آیا مقطع کار دوم دارد /// public bool HasShiftTow { get; set; } /// /// آیا ساعت استراحت دارد /// public bool HasRestTime { get; set; } /// /// عدد روز از ماه /// public PersianDayOfWeek PersianDayOfWeek { get; set; } /// /// آیا این روز هفته /// فعال است /// public bool IsActiveDay { get; set; } }