diff --git a/CompanyManagment.App.Contracts/Leave/ILeaveApplication.cs b/CompanyManagment.App.Contracts/Leave/ILeaveApplication.cs index 4a08358d..4185d007 100644 --- a/CompanyManagment.App.Contracts/Leave/ILeaveApplication.cs +++ b/CompanyManagment.App.Contracts/Leave/ILeaveApplication.cs @@ -47,7 +47,27 @@ public interface ILeaveApplication /// Task> GetList( LeaveListSearchModel searchModel); - + + /// + /// دریافت لیست گروه بندی شده + /// + /// + /// + Task> GetGroupList(LeaveListSearchModel searchModel); + + /// + /// دریافت مجکوع مرخصی پرسنل + /// اگر آی دی پرسنل، سال و ماه خالی نباشد + /// + /// + /// + /// + /// + /// + /// + TimeSpan SumOfEmployeeLeaveTimeSpanInDates(long workshopId, long employeeId, string yearStr, string monthStr, + LeaveType leaveType); + Task> PrintAllAsync(List ids, long workshopId); Task PrintOneAsync(long id, long workshopId); diff --git a/CompanyManagment.App.Contracts/Leave/LeaveListMultipleDto.cs b/CompanyManagment.App.Contracts/Leave/LeaveListMultipleDto.cs new file mode 100644 index 00000000..00b8c5e9 --- /dev/null +++ b/CompanyManagment.App.Contracts/Leave/LeaveListMultipleDto.cs @@ -0,0 +1,24 @@ +using _0_Framework.Application; +using System.Collections.Generic; + +namespace CompanyManagment.App.Contracts.Leave; + +public class LeaveListMultipleDto +{ + /// + /// لیست گروهبندی شده بر اساس سال و ماه + /// اگر در جستجو پرسنل انتخاب شود + /// + public List? GroupLeaveListDto { get; set; } + + /// + /// لیست نرمال PageResult + /// + public PagedResult? leaveListDto { get; set; } + + /// + /// مجموع مرخصی پرسنل + /// اگر پرسنل انتخاب شده باشد + /// + public string? SumOfEmployeeleaves { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.Application/LeaveApplication.cs b/CompanyManagment.Application/LeaveApplication.cs index 6dd28650..63c50d32 100644 --- a/CompanyManagment.Application/LeaveApplication.cs +++ b/CompanyManagment.Application/LeaveApplication.cs @@ -609,6 +609,59 @@ public class LeaveApplication : ILeaveApplication return await _leaveRepository.GetList(searchModel); } + public async Task> GetGroupList(LeaveListSearchModel searchModel) + { + return await _leaveRepository.GetGroupList(searchModel); + } + + public TimeSpan SumOfEmployeeLeaveTimeSpanInDates(long workshopId, long employeeId, string yearStr, string monthStr, LeaveType leaveType) + { + + + var startFa = $"{yearStr}/{monthStr:00}/01"; + var endFa = startFa.FindeEndOfMonth(); + + if (startFa.TryToGeorgianDateTime(out var start) == false || endFa.TryToGeorgianDateTime(out var end) == false) + return TimeSpan.Zero; + + var leaveTotalTimeSpan = TimeSpan.Zero; + + var leaves = _leaveRepository.GetByWorkshopIdEmployeeIdInDates(workshopId, employeeId, start, end); + //var timeSpanHourlyLeave = new TimeSpan(leaves.Where(x => x.PaidLeaveType != "روزانه").Sum(x => (x.EndLeaveGr - x.StartLeaveGr).Ticks)); + //var dailyLeaveCount = leaves.Count(x => x.PaidLeaveType == "روزانه") * new TimeSpan(1, 0, 0, 0); + + if (leaveType == LeaveType.PaidLeave) + { + var timeSpanHourlyLeave = new TimeSpan(leaves.Where(x => x.PaidLeaveType == "ساعتی" && x.LeaveType == "استحقاقی") + .Sum(x => TimeOnly.Parse(x.LeaveHourses).Ticks)); + var dailyLeaveTime = leaves.Where(x => x.PaidLeaveType == "روزانه" && x.LeaveType == "استحقاقی") + .Sum(x => Convert.ToInt32(x.LeaveHourses)) * TimeSpan.FromDays(1); + + leaveTotalTimeSpan = timeSpanHourlyLeave + dailyLeaveTime; + } + else if (leaveType == LeaveType.SickLeave) + { + var timeSpanHourlyLeave = new TimeSpan(leaves.Where(x => x.PaidLeaveType == "ساعتی" && x.LeaveType == "استعلاجی") + .Sum(x => TimeOnly.Parse(x.LeaveHourses).Ticks)); + + var dailyLeaveTime = leaves.Where(x => x.PaidLeaveType == "روزانه" && x.LeaveType == "استعلاجی") + .Sum(x => Convert.ToInt32(x.LeaveHourses)) * TimeSpan.FromDays(1); + + leaveTotalTimeSpan = timeSpanHourlyLeave + dailyLeaveTime; + } + else + { + var timeSpanHourlyLeave = new TimeSpan(leaves.Where(x => x.PaidLeaveType == "ساعتی").Sum(x => TimeOnly.Parse(x.LeaveHourses).Ticks)); + var dailyLeaveTime = leaves.Where(x => x.PaidLeaveType == "روزانه").Sum(x => Convert.ToInt32(x.LeaveHourses)) * TimeSpan.FromDays(1); + leaveTotalTimeSpan = timeSpanHourlyLeave + dailyLeaveTime; + } + + + + + return leaveTotalTimeSpan; + } + public async Task> PrintAllAsync(List ids,long workshopId) { return await _leaveRepository.PrintAllAsync(ids,workshopId); diff --git a/ServiceHost/Areas/Client/Controllers/LeaveController.cs b/ServiceHost/Areas/Client/Controllers/LeaveController.cs index acb423af..8e94d7e1 100644 --- a/ServiceHost/Areas/Client/Controllers/LeaveController.cs +++ b/ServiceHost/Areas/Client/Controllers/LeaveController.cs @@ -1,8 +1,10 @@ using _0_Framework.Application; +using Company.Domain.EmployeeAgg; using CompanyManagment.App.Contracts.InsuranceList; using CompanyManagment.App.Contracts.Leave; using Microsoft.AspNetCore.Mvc; using ServiceHost.BaseControllers; +using System.Security.Cryptography; namespace ServiceHost.Areas.Client.Controllers; @@ -22,13 +24,31 @@ public class LeaveController : ClientBaseController /// /// [HttpGet("GetLeaveList")] - public async Task>> GetLeaveList(LeaveListSearchModel searchModel) + public async Task> GetLeaveList(LeaveListSearchModel searchModel) { + var result = new LeaveListMultipleDto(); searchModel.WorkshopId = _workshopId; - - var leaveList = await _leaveApplication.GetList(searchModel); - return Ok(leaveList); + if (searchModel.EmployeeId > 0) + { + //لیست گروه بندی شده + result.GroupLeaveListDto = await _leaveApplication.GetGroupList(searchModel); + + if (!string.IsNullOrWhiteSpace(searchModel.YearStr) && !string.IsNullOrWhiteSpace(searchModel.MonthStr)) + { + TimeSpan timeSpan = _leaveApplication.SumOfEmployeeLeaveTimeSpanInDates(_workshopId, searchModel.EmployeeId, searchModel.YearStr, searchModel.MonthStr, searchModel.LeaveType); + //مجموع مرخصی پرسنل + result.SumOfEmployeeleaves = timeSpan.ToFarsiDaysAndHoursAndMinutes(); + } + + return Ok(result); + } + //لیست نرمال PageResult + result.leaveListDto = await _leaveApplication.GetList(searchModel); + return Ok(result); } + + + [HttpGet("print/{id}")] public async Task> PrintOneAsync(long id) {