Files
Backend-Api/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Checkouts/Queries/GetUserToGropCreate/GetUserToGroupCreatingQueryHandler.cs
2026-01-14 14:39:51 +03:30

175 lines
5.8 KiB
C#

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;
/// <summary>
/// دریافت کاربران برای ایجاد گروهی فیش حقوقی با سال و ماه
/// </summary>
public class GetUserToGroupCreatingQueryHandler : IBaseQueryHandler<GetUserToGroupCreatingQuery, GetUserToGroupCreatingResponse>
{
private readonly IProgramManagerDbContext _context;
public GetUserToGroupCreatingQueryHandler(IProgramManagerDbContext context)
{
_context = context;
}
public async Task<OperationResult<GetUserToGroupCreatingResponse>> 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<GetUserToGroupCreatingResponse>.Failure(
"خطا در ورود سال و ماه");
}
//آخرین تاریخ مجاز برای ایجاد فیش
var lastMonth = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
if (selectedDate > lastMonth)
return OperationResult<GetUserToGroupCreatingResponse>.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<GetUserToGroupCreatingResponse>.Success(response);
}
}
public record GetUserToGroupCreatingQuery(string Year, string Month) : IBaseQuery<GetUserToGroupCreatingResponse>;
public record GetUserToGroupCreatingResponse(List<GetUserToGroupCreatingDto> GetUserToGroupCreatingDtoList);
public record GetUserToGroupCreatingDto
{
/// <summary>
/// آی دی کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// نام کامل پرسنل
/// </summary>
public string FullName { get; set; }
/// <summary>
/// پیام وضعیت ایجاد فیش
/// </summary>
public string StatusMessage { get; set; }
/// <summary>
/// آیا مجاز به ایجاد فیش می باشد
/// </summary>
public bool IsValidToCreate { get; set; }
public CreateCheckoutStatus CreateCheckoutStatus { get; set; }
}
public record GetUserWhoHaveSettingsAndCheckoutDto
{
/// <summary>
/// آی دی کاربر
/// </summary>
public long UserId { get; set; }
/// <summary>
/// نام کامل پرسنل
/// </summary>
public string FullName { get; set; }
/// <summary>
/// داشتن تنظیمات
/// </summary>
public bool HasSalarySettings { get; set; }
public bool HasCheckout { get; set; }
}