using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; using _0_Framework.Application.Enums; using Company.Domain.ClassificationSchemeAgg; using CompanyManagment.App.Contracts.ClassificationScheme; using CompanyManagment.App.Contracts.YearlySalary; using Microsoft.EntityFrameworkCore; namespace CompanyManagment.Application; public class ClassificationSchemeApplication : IClassificationSchemeApplication { private readonly IClassificationSchemeRepository _classificationSchemeRepository; private readonly IClassificationGroupRepository _classificationGroupRepository; private readonly IClassificationGroupSalariesRepository _classificationGroupSalariesRepository; private readonly IClassificationRialCoefficientRepository _classificationRialCoefficientRepository; private readonly IClassificationEmployeeRepository _classificationEmployeeRepository; public ClassificationSchemeApplication(IClassificationSchemeRepository classificationSchemeRepository, IClassificationGroupRepository classificationGroupRepository, IClassificationGroupSalariesRepository classificationGroupSalariesRepository, IClassificationRialCoefficientRepository classificationRialCoefficientRepository, IClassificationEmployeeRepository classificationEmployeeRepository) { _classificationSchemeRepository = classificationSchemeRepository; _classificationGroupRepository = classificationGroupRepository; _classificationGroupSalariesRepository = classificationGroupSalariesRepository; _classificationRialCoefficientRepository = classificationRialCoefficientRepository; _classificationEmployeeRepository = classificationEmployeeRepository; } public Task ClassificationSchemePartialModel(long workshopId) { return _classificationSchemeRepository.ClassificationSchemePartialModel(workshopId); } public async Task CreateClassificationScheme(CreateClassificationScheme command) { var op = new OperationResult(); #region Validation if (!command.ExecutionDateFa.TryToGeorgianDateTime(out var executionDateGr)) { return op.Failed("تاریخ اجرا صحیح نمی باشد"); } if (!command.IncludingDateFa.TryToGeorgianDateTime(out var includingDateGr)) { return op.Failed("تاریخ شمول صحیح نمی باشد"); } #endregion //ایجاد طرح var create = new ClassificationScheme(includingDateGr, executionDateGr, command.DesignerFullName, command.DesignerPhone, command.WorkshopId, command.TypeOfCoefficient); _classificationSchemeRepository.Create(create); await _classificationSchemeRepository.SaveChangesAsync(); //ایجاد گروه های طرح var groups = new List() { new ClassificationGroup("1",command.WorkshopId,create.id), new ClassificationGroup("2",command.WorkshopId,create.id), new ClassificationGroup("3",command.WorkshopId,create.id), new ClassificationGroup("4",command.WorkshopId,create.id), new ClassificationGroup("5",command.WorkshopId,create.id), new ClassificationGroup("6",command.WorkshopId,create.id), new ClassificationGroup("7",command.WorkshopId,create.id), new ClassificationGroup("8",command.WorkshopId,create.id), new ClassificationGroup("9",command.WorkshopId,create.id), new ClassificationGroup("10",command.WorkshopId,create.id), new ClassificationGroup("11",command.WorkshopId,create.id), new ClassificationGroup("12",command.WorkshopId,create.id), new ClassificationGroup("13",command.WorkshopId,create.id), new ClassificationGroup("14",command.WorkshopId,create.id), new ClassificationGroup("15",command.WorkshopId,create.id), new ClassificationGroup("16",command.WorkshopId,create.id), new ClassificationGroup("17",command.WorkshopId,create.id), new ClassificationGroup("18",command.WorkshopId,create.id), new ClassificationGroup("19",command.WorkshopId,create.id), new ClassificationGroup("20",command.WorkshopId,create.id), }; await _classificationGroupRepository.CreateGroups(groups); return op.Succcedded(); } public Task GetClassificationScheme(long id) { return _classificationSchemeRepository.GetClassificationScheme(id); } public async Task EditClassificationScheme(EditClassificationScheme command) { var op = new OperationResult(); #region Validation if (!command.ExecutionDateFa.TryToGeorgianDateTime(out var executionDateGr)) { return op.Failed("تاریخ اجرا صحیح نمی باشد"); } if (!command.IncludingDateFa.TryToGeorgianDateTime(out var includingDateGr)) { return op.Failed("تاریخ شمول صحیح نمی باشد"); } var scheme = _classificationSchemeRepository.Get(command.Id); if (scheme == null) return op.Failed("رکورد مورد نظر وجود ندارد"); #endregion scheme.Edit(includingDateGr, executionDateGr, command.DesignerFullName,command.DesignerPhone,command.TypeOfCoefficient); await _classificationSchemeRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task> GetGroupAndJobs(long schemeId) { return await _classificationGroupRepository.GetGroupAndJobs(schemeId); } public async Task> GetGroupJobs(long groupId) { return await _classificationGroupRepository.GetGroupJobs(groupId); } public async Task CheckEmployeeHasThisJob(long id, long groupId) { return await _classificationGroupRepository.CheckEmployeeHasThisJob(id, groupId); } public async Task CreateGroupJobs(List createClassificationGroupJob, List deleteJobList) { var newJoblist = new List(); if (createClassificationGroupJob.Count > 0) { foreach (var item in createClassificationGroupJob) { var newJob = new ClassificationGroupJob(item.JobId, item.JobName, item.JobCode, item.ClassificationGroupId, item.GroupNo); newJoblist.Add(newJob); } } return await _classificationGroupRepository.CreateJobs(newJoblist, deleteJobList); } public async Task GetSalariesTabData(long schemeId) { return await _classificationGroupSalariesRepository.GetSalariesTabData(schemeId); } public async Task GetGroupToCreateSalariesModal(long schemeId) { return await _classificationGroupRepository.GetGroupToCreateSalariesModal(schemeId); } public async Task CreateGroupSalaryAndCoefficient(SalaryAndRialCoefficientModel command) { var op = new OperationResult(); #region Validation if (string.IsNullOrWhiteSpace(command.StartDateFa) || string.IsNullOrWhiteSpace(command.StartDateFa)) return op.Failed("تاریخ شروع و پایان نمی توانند خالی باشند"); if (command.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient && command.RialCoefficient == 0) return op.Failed("ضریب ریالی وارد نشده است"); if (command.SalariesAndCoefficientList.Any(x=> string.IsNullOrWhiteSpace(x.GroupSalaryStr) || x.GroupSalaryStr =="0")) return op.Failed("دستمزد تمامی گروه ها می بایست تعیین شود"); if (!command.StartDateFa.TryToGeorgianDateTime(out var startDate)) { return op.Failed("تاریخ شروع وارد شده صحیح نمی باشد"); } if (!command.EndDateFa.TryToGeorgianDateTime(out var endDate)) { return op.Failed("تاریخ پایان وارد شده صحیح نمی باشد"); } if (_classificationGroupSalariesRepository.Exists(x => x.StartDate <= endDate && x.EndDate >= startDate && x.SchemeId == command.SchemeId)) { return op.Failed("بازه تاریخ وارد شده با داده های ذخیره شده قبل تداخل دارد"); } var year = Convert.ToInt32(command.StartDateFa.Substring(0, 4)); var endDateYear = Convert.ToInt32(command.EndDateFa.Substring(0, 4)); if(year != endDateYear) return op.Failed("سال تاریخ شروع از سال تاریخ پایان متفاوت است"); #endregion var createSalaries = new List(); foreach (var item in command.SalariesAndCoefficientList) { item.GroupSalary = item.GroupSalaryStr.MoneyToDouble(); var create = new ClassificationGroupSalary(item.ClassificationGroupId,item.GroupNo,item.GroupSalary,startDate, endDate, year, command.SchemeId); createSalaries.Add(create); } await _classificationGroupSalariesRepository.CreateSalaries(createSalaries); if (command.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient) { try { command.RialCoefficient = command.RialCoefficient; await _classificationRialCoefficientRepository.CreateAsync(new ClassificationRialCoefficient(command.SchemeId, command.RialCoefficient, startDate, endDate, year)); await _classificationRialCoefficientRepository.SaveChangesAsync(); } catch (Exception e) { return op.Failed("فرمت مبلغ ضریب ریالی اشتباه است"); } } op.SendId = command.SchemeId; return op.Succcedded(); } public async Task GetEditSalariesData(long schemeId, string startDate, string endDate) { return await _classificationGroupSalariesRepository.GetEditSalariesData(schemeId, startDate, endDate); } public async Task EditGroupSalaryAndCoefficient(SalaryAndRialCoefficientModel command) { var op = new OperationResult(); #region Validation if (string.IsNullOrWhiteSpace(command.StartDateFa) || string.IsNullOrWhiteSpace(command.StartDateFa)) return op.Failed("تاریخ شروع و پایان نمی توانند خالی باشند"); if (command.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient && command.RialCoefficient == 0) return op.Failed("ضریب ریالی وارد نشده است"); if (command.SalariesAndCoefficientList.Any(x => string.IsNullOrWhiteSpace(x.GroupSalaryStr) || x.GroupSalaryStr == "0")) return op.Failed("دستمزد تمامی گروه ها می بایست تعیین شود"); if (!command.StartDateFa.TryToGeorgianDateTime(out var startDate)) { return op.Failed("تاریخ شروع وارد شده صحیح نمی باشد"); } if (!command.EndDateFa.TryToGeorgianDateTime(out var endDate)) { return op.Failed("تاریخ پایان وارد شده صحیح نمی باشد"); } var salariesId = command.SalariesAndCoefficientList.Select(x => x.Id).ToList(); if (_classificationGroupSalariesRepository.Exists(x => x.StartDate <= endDate && x.EndDate >= startDate && x.SchemeId == command.SchemeId && !salariesId.Contains(x.id))) { return op.Failed("بازه تاریخ وارد شده با داده های ذخیره شده قبل تداخل دارد"); } var year = Convert.ToInt32(command.StartDateFa.Substring(0, 4)); var endDateYear = Convert.ToInt32(command.EndDateFa.Substring(0, 4)); if (year != endDateYear) return op.Failed("سال تاریخ شروع از سال تاریخ پایان متفاوت است"); #endregion foreach (var item in command.SalariesAndCoefficientList) { var editSalary = _classificationGroupSalariesRepository.Get(item.Id); item.GroupSalary = item.GroupSalaryStr.MoneyToDouble(); editSalary.Edit(item.GroupSalary, startDate, endDate, year); await _classificationGroupSalariesRepository.SaveChangesAsync(); } if (command.TypeOfCoefficient == TypeOfCoefficient.RialCoefficient) { var editRialCoefficient = _classificationRialCoefficientRepository.Get(command.CoefficientId); editRialCoefficient.Edit(command.RialCoefficient, startDate, endDate, year); await _classificationRialCoefficientRepository.SaveChangesAsync(); } return op.Succcedded(); } public async Task GetEmployeeDataTab(EmployeeInfoTab command) { var employeeInfoTab = new EmployeeInfoTab(); var employeeInfoList = _classificationEmployeeRepository.GetEmployeeListData(command.SchemeId).GetAwaiter().GetResult(); if (employeeInfoList.Any()) { if (!string.IsNullOrWhiteSpace(command.FullName)) employeeInfoList = employeeInfoList.Where(x => x.FullName.Contains(command.FullName)).ToList(); employeeInfoTab.EmployeeInfoList = employeeInfoList; employeeInfoTab.FullName = command.FullName; } return employeeInfoTab; } public async Task> GetGroups(long schemeId) { return await _classificationGroupRepository.GetGroups(schemeId); } public async Task AddEmployeeToGroup(AddEmployeeToGroup command) { var op = new OperationResult(); #region Validation if (command.GroupId == 0) return op.Failed("لطفا گروه را انتخاب کنید"); if (command.JobId == 0) return op.Failed("لطفا سمت را انتخاب کنید"); #endregion var scheme = _classificationSchemeRepository.GetClassificationScheme(command.SchemeId).GetAwaiter().GetResult(); var create = new ClassificationEmployee(scheme.WorkshopId, command.EmployeeId, command.SchemeId, command.GroupId, command.JobId); await _classificationEmployeeRepository.CreateAsync(create); await _classificationEmployeeRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task EditGroupMember(AddEmployeeToGroup command) { var op = new OperationResult(); #region Validation if (command.GroupId == 0) return op.Failed("لطفا گروه را انتخاب کنید"); if (command.JobId == 0) return op.Failed("لطفا سمت را انتخاب کنید"); #endregion var editGroup = _classificationEmployeeRepository.Get(command.Id); editGroup.Edit(command.GroupId, command.JobId); await _classificationEmployeeRepository.SaveChangesAsync(); return op.Succcedded(); } public async Task EditMultipleGroupMember(List command) { var op = new OperationResult(); foreach (var item in command) { #region Validation if (item.ClassificationGroupId == 0) return op.Failed("لطفا گروه را انتخاب کنید"); if (item.ClassificationGroupJobId == 0) return op.Failed("لطفا سمت را انتخاب کنید"); if (!item.StartGroupDateFa.TryToGeorgianDateTime(out var startDate)) { string startDateFaild = "تاریخ شروع" + item.StartGroupDateFa + "صحیح نمیباشد"; return op.Failed(startDateFaild); } if (!string.IsNullOrWhiteSpace(item.EndGroupDateFa)) { if (!item.EndGroupDateFa.TryToGeorgianDateTime(out var endDate)) { string endDateFaild = "تاریخ پایان" + item.EndGroupDateFa + "صحیح نمیباشد"; return op.Failed(endDateFaild); } } #endregion } foreach (var item in command) { var edit = _classificationEmployeeRepository.Get(item.Id); if(string.IsNullOrWhiteSpace(item.EndGroupDateFa)) { edit.EditMultipleGroupMember(item.ClassificationGroupId, item.ClassificationGroupJobId, item.StartGroupDateFa.ToGeorgianDateTime(), null); } else { edit.EditMultipleGroupMember(item.ClassificationGroupId, item.ClassificationGroupJobId, item.StartGroupDateFa.ToGeorgianDateTime(), item.EndGroupDateFa.ToGeorgianDateTime()); } await _classificationEmployeeRepository.SaveChangesAsync(); } return op.Succcedded(); } /// /// دریافت اطلاعات عضویتی پرسنل در گروه /// /// /// public async Task GetEmployeeMemberizeData(long employeeId) { var result = new EditEmployeeGroup(); var res = await _classificationEmployeeRepository.GetEmployeeMemberizeData(employeeId); if (res.Any()) { result.HasMultipleGroup = res.Count > 1; result.EditEmployeeGroupLists = res; } return result; } public async Task BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd, DateTime contractStart, DateTime contractEnd, string groupNo, long employeeId, long workshopId) { return await _classificationSchemeRepository.BaseYearComputeOneGroup(schemeStart, schemeEnd, contractStart, contractEnd, groupNo, employeeId, workshopId); } }