using DNTPersianUtils.Core; using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Application.Modules.SalaryPaymentSettings.Queries.GetUserListWhoHaveSettings; using GozareshgirProgramManager.Domain._Common; using GozareshgirProgramManager.Domain.CheckoutAgg.Enums; using Microsoft.EntityFrameworkCore; using PersianDateTime = PersianTools.Core.PersianDateTime; namespace GozareshgirProgramManager.Application.Modules.Checkouts.Queries.GetUserToGropCreate; /// /// دریافت کاربران برای ایجاد گروهی فیش حقوقی با سال و ماه /// public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler { private readonly IProgramManagerDbContext _context; public GetUserToGroupCreatingQueryHandler(IProgramManagerDbContext context) { _context = context; } public async Task> Handle(GetUserToGroupCreatingQuery request, CancellationToken cancellationToken) { //سال و ماه انتخاب شده از فرانت var selectedDate = new DateTime(); try { int year = Convert.ToInt32(request.Year); int month = Convert.ToInt32(request.Month); selectedDate = ($"{new PersianDateTime(year,month,1)}").ToGeorgianDateTime(); } catch (Exception) { return OperationResult.Failure( "خطا در ورود سال و ماه"); } //آخرین تاریخ مجاز برای ایجاد فیش var lastMonth = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1); if (selectedDate > lastMonth) return OperationResult.Failure( "ایجاد فیش فقط برای ماه های گذشته امکان پذیر است"); //var lastMonthStart = lastMonth; var lastMonthEnd = ((selectedDate.ToFarsi().FindeEndOfMonth())).ToGeorgianDateTime(); var query = await (from u in _context.Users // LEFT JOIN // تنظیمات حقوق join s in _context.SalaryPaymentSettings on u.Id equals s.UserId into sJoin from s in sJoin.DefaultIfEmpty() // LEFT JOIN //فیش join ch in _context.Checkouts .Where(x => x.CheckoutStartDate < lastMonthEnd && x.CheckoutEndDate > selectedDate) on u.Id equals ch.UserId into chJoin from ch in chJoin.DefaultIfEmpty() group new { s, ch } by new { u.Id, u.FullName } into g select new GetUserWhoHaveSettingsAndCheckoutDto { UserId = g.Key.Id, FullName = g.Key.FullName, HasSalarySettings = g.Any(x => x.s != null), HasCheckout = g.Any(x => x.ch != null) }) .ToListAsync(cancellationToken); var responseList = query.Select(x => { bool validToCreate = x.HasSalarySettings && !x.HasCheckout; string message = "آماده تنظیم"; CreateCheckoutStatus createCheckoutStatus = CreateCheckoutStatus.ReadyToCreate; if (x.HasCheckout) { message = "موجود است"; createCheckoutStatus = CreateCheckoutStatus.AlreadyCreated; } if (!x.HasSalarySettings) { message = "فاقد تنظیمات"; createCheckoutStatus = CreateCheckoutStatus.NotSetSalaryPaymentSettings; } return new GetUserToGroupCreatingDto { UserId = x.UserId, FullName = x.FullName, IsValidToCreate = validToCreate, StatusMessage = message, CreateCheckoutStatus = createCheckoutStatus }; }).OrderByDescending(x=>x.IsValidToCreate).ToList(); var response = new GetUserToGroupCreatingResponse(responseList); return OperationResult.Success(response); } } public record GetUserToGroupCreatingQuery(string Year, string Month) : IBaseQuery; public record GetUserToGroupCreatingResponse(List GetUserToGroupCreatingDtoList); public record GetUserToGroupCreatingDto { /// /// آی دی کاربر /// public long UserId { get; set; } /// /// نام کامل پرسنل /// public string FullName { get; set; } /// /// پیام وضعیت ایجاد فیش /// public string StatusMessage { get; set; } /// /// آیا مجاز به ایجاد فیش می باشد /// public bool IsValidToCreate { get; set; } public CreateCheckoutStatus CreateCheckoutStatus { get; set; } } public record GetUserWhoHaveSettingsAndCheckoutDto { /// /// آی دی کاربر /// public long UserId { get; set; } /// /// نام کامل پرسنل /// public string FullName { get; set; } /// /// داشتن تنظیمات /// public bool HasSalarySettings { get; set; } public bool HasCheckout { get; set; } }