175 lines
5.8 KiB
C#
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; }
|
|
} |