Api/Brizco.Core/CoreServices/PageService.cs

210 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Brizco.Domain.Entities.Task;
using Brizco.Domain.Entities.Routine;
using Brizco.Domain.Entities.Shift;
using Task = Brizco.Domain.Entities.Task.Task;
namespace Brizco.Core.CoreServices;
public class PageService : IPageService
{
private readonly ICurrentUserService _currentUserService;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly RoleManager<ApplicationRole> _roleManager;
private readonly IMediator _mediator;
public PageService(
ICurrentUserService currentUserService,
IRepositoryWrapper repositoryWrapper,
RoleManager<ApplicationRole> roleManager,
IMediator mediator)
{
_currentUserService = currentUserService;
_repositoryWrapper = repositoryWrapper;
_roleManager = roleManager;
_mediator = mediator;
}
public async Task<AppDashboardPageDto> GetAppDashboardAsync(CancellationToken cancellationToken)
{
if (_currentUserService.UserId == null)
throw new AppException("User id is null ");
if (!Guid.TryParse(_currentUserService.UserId, out Guid userId))
throw new AppException("User id is wrong");
if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
throw new AppException("Complex id is wrong");
var todayTasks = await _repositoryWrapper.SetRepository<Activity>()
.TableNoTracking
.Where(a => a.ComplexId == complexId && a.SetFor.Date == DateTime.Today.Date)
.ToListAsync(cancellationToken);
var todayShiftPlans = await _repositoryWrapper.SetRepository<ShiftPlan>()
.TableNoTracking
.Where(a => a.PlanFor.Date == DateTime.Today.Date && a.ComplexId == complexId)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
var names = new List<string>();
names.AddRange(todayShiftPlans.SelectMany(sp => sp.Users).Select(s => s.UserFullName).ToList());
var page = new AppDashboardPageDto
{
DoneActivitiesToday = todayTasks.Count(t => t.IsDone),
TotalActivitiesToday = todayTasks.Count,
UnDoneActivitiesToday = todayTasks.Count(t => t.IsDone!),
TotalShiftToday = todayShiftPlans.Count,
TodayStaffNames = names,
TotalStaffToday = todayShiftPlans.SelectMany(sp => sp.Users).Count()
};
var currentShift = todayShiftPlans.FirstOrDefault(s => s.EndAt >= DateTime.Now.TimeOfDay && s.StartAt <= DateTime.Now.TimeOfDay);
if (currentShift != null)
{
page.CurrentShift = currentShift.ShiftTitle;
page.CurrentPosition = currentShift.Users.FirstOrDefault(f => f.UserId == userId)?.PositionName ?? string.Empty;
}
if (_currentUserService.Permissions != null)
{
int totalStepCount = 0;
int completeStepCount = 0;
string currentStep = string.Empty;
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageRoutines))
{
totalStepCount++;
var hasRoutine = await _repositoryWrapper.SetRepository<Routine>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasRoutine)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش روتین ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageSections))
{
totalStepCount++;
var hasSection = await _repositoryWrapper.SetRepository<Section>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasSection)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش سکشن ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManagePositions))
{
totalStepCount++;
var hasPosition = await _repositoryWrapper.SetRepository<Position>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasPosition)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش پوزیشن ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageStaffs))
{
totalStepCount++;
var hasStaff = await _repositoryWrapper.SetRepository<ComplexUser>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasStaff)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش کاربر ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageShifts))
{
totalStepCount++;
var hasShift = await _repositoryWrapper.SetRepository<Shift>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasShift)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش شیفت ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageTasks))
{
totalStepCount++;
var hasTask = await _repositoryWrapper.SetRepository<Task>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasTask)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش تسک ها";
}
}
if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageShiftPlans))
{
totalStepCount++;
var hasStaff = await _repositoryWrapper.SetRepository<ShiftPlan>()
.TableNoTracking
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasStaff)
completeStepCount++;
else
{
if (currentStep.IsNullOrEmpty())
currentStep = "تکمیل بخش شیفت بندی ها";
}
}
page.SignUpCompletePercent = ((totalStepCount * 100) / completeStepCount);
page.CurrentSignUpStep = currentStep;
}
return page;
}
public async Task<List<AppShiftingPageDayDto>> GetShiftingPageAsync(Guid routineId,CancellationToken cancellationToken)
{
if (_currentUserService.ComplexId == null)
throw new AppException("ComplexId is null", ApiResultStatusCode.NotFound);
if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
throw new AppException("ComplexId is wrong", ApiResultStatusCode.NotFound);
var days = new List<AppShiftingPageDayDto>();
DateTime day = DateTime.Today;
var shifts = await _mediator.Send(new GetRoutineShiftsQuery(routineId, 0),
cancellationToken);
for (int i = 0 ; i < 15; i++ , day = day.AddDays(i))
{
var item = new AppShiftingPageDayDto
{
DateTime = DateTimeExtensions.DateTimeToUnixTimeStamp(day)
};
shifts.Where(s=>s.Day == day.DayOfWeek).SelectMany(s=>s.Shifts).ToList().ForEach(s=>item.Shifts.Add(s.Clone()));
foreach (var shift in item.Shifts)
{
var existedShiftPlan = await _repositoryWrapper.SetRepository<Domain.Entities.Shift.ShiftPlan>()
.TableNoTracking
.FirstOrDefaultAsync(s => s.ShiftId == shift.Id && s.PlanFor.Date == day.Date, cancellationToken);
shift.CurrentShiftPlanId = existedShiftPlan?.Id ?? default;
shift.HasCurrentShiftPlan = shift.CurrentShiftPlanId != default;
}
item.TotalShifts = item.Shifts.Count;
item.TotalShiftPlans = item.Shifts.Count(s => s.CurrentShiftPlanId != default);
days.Add(item);
}
return days;
}
}