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; }
}