feat : add 0.6.10.11 , add shift plan date filter , fix reporting

master
Amir Hossein Khademi 2024-05-06 14:08:15 +03:30
parent 60366045bf
commit 1cac63112e
19 changed files with 748 additions and 586 deletions

View File

@ -1 +1 @@
0.5.9.10
0.6.10.11

View File

@ -13,7 +13,7 @@
}
},
"SiteSettings": {
"BaseUrl": "http://192.168.88.251:32769",
"BaseUrl": "http://192.168.1.12:32767",
"KaveNegarApiKey": "3735494B4143727A794346457461576A2B4B6668414973424E333561505A694B",
"UserSetting": {
"Username": "root",

View File

@ -6,8 +6,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
<AssemblyVersion>0.5.9.10</AssemblyVersion>
<FileVersion>0.5.9.10</FileVersion>
<AssemblyVersion>0.6.10.11</AssemblyVersion>
<FileVersion>0.6.10.11</FileVersion>
</PropertyGroup>
<ItemGroup>

View File

@ -1,5 +1,4 @@
using Brizco.Core.CoreServices.ReportServices.Commands;
using MediatR;
namespace Brizco.Api.Controllers;

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>10</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
@ -12,9 +12,9 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
</ItemGroup>
</ItemGroup>-->
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>10</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
@ -25,7 +25,7 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.3" />
</ItemGroup>-->
</ItemGroup>
<ItemGroup>
<Using Include="MD.PersianDateTime.Standard" />

View File

@ -50,7 +50,14 @@ public class PageService : IPageService
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;
@ -61,8 +68,8 @@ public class PageService : IPageService
totalStepCount++;
var hasRoutine = await _repositoryWrapper.SetRepository<Routine>()
.TableNoTracking
.AnyAsync(r=>r.ComplexId== complexId, cancellationToken);
if(hasRoutine)
.AnyAsync(r => r.ComplexId == complexId, cancellationToken);
if (hasRoutine)
completeStepCount++;
else
{

View File

@ -1,5 +1,6 @@
using Brizco.Domain.Entities.Shift;
using Brizco.Domain.Entities.Task;
using MD.PersianDateTime.Standard;
namespace Brizco.Core.CoreServices.ReportServices;
public class ShiftPlanReportCommandHandler : IRequestHandler<ShiftPlanReportCommand, byte[]>
@ -52,11 +53,16 @@ public class ShiftPlanReportCommandHandler : IRequestHandler<ShiftPlanReportComm
var statusCell = row.CreateCell(2);
statusCell.CellStyle = style;
statusCell.SetCellValue(activity.Status.ToDisplay());
if (activity.Status is ActivityStatus.Done or ActivityStatus.Complete)
statusCell.SetCellValue("✅");
else if (activity.Status is ActivityStatus.UnDone or ActivityStatus.InProgress)
statusCell.SetCellValue("❌");
else
statusCell.SetCellValue(activity.Status.ToDisplay());
var doneAtCell = row.CreateCell(3);
doneAtCell.CellStyle = style;
doneAtCell.SetCellValue(activity.Title);
doneAtCell.SetCellValue((new PersianDateTime(activity.DoneAt)).ToLongTimeString());
var unDoneReasonCell = row.CreateCell(4);
unDoneReasonCell.CellStyle = style;

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@ -13,10 +13,10 @@
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.4" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0" />
</ItemGroup>
</ItemGroup>-->
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>10</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
@ -32,7 +32,7 @@
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0" />
</ItemGroup>-->
</ItemGroup>
<Target Name="Mapster">

View File

@ -8,6 +8,9 @@ public class AppDashboardPageDto
public int TotalShiftToday { get; set; }
public int TotalStaffToday { get; set; }
public List<string> TodayStaffNames { get; set; } = new();
public string CurrentPosition { get; set; } = string.Empty;
public string CurrentShift { get; set; } = string.Empty;
public string CurrentSignUpStep { get; set; } = string.Empty;
public int SignUpCompletePercent { get; set; }

View File

@ -1,6 +1,4 @@
using Brizco.Domain.Entities.Task;
namespace Brizco.Domain.Dtos.SmallDtos;
namespace Brizco.Domain.Dtos.SmallDtos;
public class ActivitySDto : BaseDto<ActivitySDto , Activity>
{

View File

@ -13,6 +13,8 @@ public class ShiftPlanSDto : BaseDto<ShiftPlanSDto,ShiftPlan>
public string CompleteDescription { get; set; } = string.Empty;
public Guid ShiftId { get; set; }
public string ShiftTitle { get; set; } = string.Empty;
public TimeSpan StartAt { get; set; }
public TimeSpan EndAt { get; set; }
public List<ShiftPlanUserSDto> Users { get; set; } = new();
}

View File

@ -1,6 +1,4 @@
using Brizco.Domain.Entities.Shift;
namespace Brizco.Domain.Dtos.SmallDtos;
namespace Brizco.Domain.Dtos.SmallDtos;
public class ShiftPlanUserSDto : BaseDto<ShiftPlanUserSDto,ShiftPlanUser>
{

View File

@ -14,6 +14,7 @@ public class TaskSDto : BaseDto<TaskSDto,Entities.Task.Task>
public List<string> Shifts { get; set; } = new();
public List<string> Routines { get; set; } = new();
public List<string> Positions { get; set; } = new();
public List<string> Days { get; set; } = new();
public int Amount { get; set; }
public PurchaseAmountType AmountType { get; set; }

View File

@ -7,6 +7,8 @@ public enum DateTimeQueryFilter
Yesterday = 2,
PastWeek = 10,
NextWeek = 11,
ThisWeek = 12,
PastMonth = 20,
NextMonth = 21
NextMonth = 21,
ThisMonth = 22,
}

View File

@ -90,6 +90,8 @@ namespace Brizco.Domain.Mappers
CompleteDescription = p11.CompleteDescription,
ShiftId = p11.ShiftId,
ShiftTitle = p11.Shift == null ? null : p11.Shift.Title,
StartAt = p11.Shift != null ? p11.Shift.StartAt : TimeSpan.MinValue,
EndAt = p11.Shift != null ? p11.Shift.EndAt : TimeSpan.MinValue,
Users = funcMain4(p11.Users),
Id = p11.Id
};
@ -109,6 +111,8 @@ namespace Brizco.Domain.Mappers
result.CompleteDescription = p13.CompleteDescription;
result.ShiftId = p13.ShiftId;
result.ShiftTitle = p13.Shift == null ? null : p13.Shift.Title;
result.StartAt = p13.Shift != null ? p13.Shift.StartAt : TimeSpan.MinValue;
result.EndAt = p13.Shift != null ? p13.Shift.EndAt : TimeSpan.MinValue;
result.Users = funcMain5(p13.Users, result.Users);
result.Id = p13.Id;
return result;
@ -123,6 +127,8 @@ namespace Brizco.Domain.Mappers
CompleteDescription = p17.CompleteDescription,
ShiftId = p17.ShiftId,
ShiftTitle = p17.Shift.Title,
StartAt = p17.Shift != null ? p17.Shift.StartAt : TimeSpan.MinValue,
EndAt = p17.Shift != null ? p17.Shift.EndAt : TimeSpan.MinValue,
Users = p17.Users.Select<ShiftPlanUser, ShiftPlanUserSDto>(p18 => new ShiftPlanUserSDto()
{
ShiftPlanId = p18.ShiftPlanId,

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
using Task = Brizco.Domain.Entities.Task.Task;
using MD.PersianDateTime.Standard;
using Task = Brizco.Domain.Entities.Task.Task;
namespace Brizco.Domain;
@ -11,6 +12,7 @@ public class MapsterRegister : IRegister
.Map("Shifts", o => o.Shifts.Select(d => d.Shift != null ? d.Shift.Title : string.Empty))
.Map("Routines", o => o.Routines.Select(d => d.Routine != null ? d.Routine.Name : string.Empty))
.Map("Positions", o => o.Positions.Select(d => d.Position != null ? d.Position.Name : string.Empty))
.Map(s=>s.Days,o=>o.Days.Select(d=> d.DayOfWeek.GetPersianDayOfWeek()).ToList())
.TwoWays();
config.NewConfig<TaskShift, TaskShiftSDto>()
@ -46,6 +48,8 @@ public class MapsterRegister : IRegister
config.NewConfig<ShiftPlan, ShiftPlanSDto>()
.Map("SupervisorFullName", o => o.Supervisor != null ? o.Supervisor.FirstName + " " + o.Supervisor.LastName : string.Empty)
.Map(s=>s.StartAt , o=>o.Shift != null ? o.Shift.StartAt : TimeSpan.MinValue)
.Map(s=>s.EndAt , o=>o.Shift != null ? o.Shift.EndAt : TimeSpan.MinValue)
.TwoWays();
config.NewConfig<ShiftPlanUser, ShiftPlanUserSDto>()

View File

@ -24,7 +24,7 @@ public class GetActivitiesQueryHandler : IRequestHandler<GetActivitiesQuery, Lis
IQueryable<Domain.Entities.Task.Activity> activities = _repositoryWrapper.SetRepository<Domain.Entities.Task.Activity>().TableNoTracking
.Where(a=>a.IsActivity);
.Where(a=>a.IsActivity && a.ComplexId == complexId);
if (_currentUserService is { Permissions: not null, RoleName: not null })
{
if (_currentUserService.Permissions.Contains(ApplicationPermission.ViewMineActivities) && _currentUserService.RoleName == ApplicationRoles.Staff)
@ -52,12 +52,11 @@ public class GetActivitiesQueryHandler : IRequestHandler<GetActivitiesQuery, Lis
if (request.SelectedDate > 0)
{
var selectedDate = DateTimeExtensions.UnixTimeStampToDateTime(request.SelectedDate);
activities = activities.Where(a => a.ComplexId == complexId && a.SetFor.Date == selectedDate.Date);
activities = activities.Where(a => a.SetFor.Date == selectedDate.Date);
}
if (request.SelectedShift != default)
activities = activities.Where(a => a.ComplexId == complexId && a.ShiftId == request.SelectedShift);
activities = activities.Where(a => a.ShiftId == request.SelectedShift);
var response= await activities.OrderByDescending(s => s.UserId)

View File

@ -1,4 +1,5 @@
using Brizco.Domain.Entities.Shift;
using MD.PersianDateTime.Standard;
namespace Brizco.Repository.Handlers.ShiftPlan;
@ -25,10 +26,11 @@ public class GetShiftPlansQueryHandler : IRequestHandler<GetShiftPlansQuery, Lis
.Where(s => s.ComplexId == complexId);
List<ShiftPlanSDto> shiftPlans = new List<ShiftPlanSDto>();
bool setActiviesCount = false;
if (request.SelectedDate == 0)
{
return await baseQuery
shiftPlans = await baseQuery
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
@ -36,64 +38,104 @@ public class GetShiftPlansQueryHandler : IRequestHandler<GetShiftPlansQuery, Lis
}
else if (request.SelectedDate > 0)
{
if (request.SelectedDate > 0)
var selectedDate = DateTimeExtensions.UnixTimeStampToDateTime(request.SelectedDate);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == selectedDate.Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
setActiviesCount = true;
}
if (request.DateTimeQueryFilter != null)
{
setActiviesCount = true;
switch (request.DateTimeQueryFilter)
{
var selectedDate = DateTimeExtensions.UnixTimeStampToDateTime(request.SelectedDate);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == selectedDate.Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
}
else
{
switch (request.DateTimeQueryFilter)
{
case DateTimeQueryFilter.Today:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == DateTime.Now.Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.Yesterday:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == DateTime.Now.AddDays(-1).Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.PastWeek:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= DateTime.Now.AddDays(-7).Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.NextWeek:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= DateTime.Now.Date && s.PlanFor.Date <= DateTime.Today.AddDays(+7))
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.PastMonth:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= DateTime.Now.AddDays(-31).Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.NextMonth:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= DateTime.Now.Date && s.PlanFor.Date <= DateTime.Today.AddDays(+31))
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case null:
break;
default:
throw new ArgumentOutOfRangeException();
}
case DateTimeQueryFilter.Today:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == DateTime.Now.Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.Yesterday:
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date == DateTime.Now.AddDays(-1).Date)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.PastWeek:
DateTime pastWeekToday = DateTime.Today;
int pastWeekDelta = DayOfWeek.Saturday - pastWeekToday.DayOfWeek;
if (pastWeekDelta > 0) pastWeekDelta -= 7;
DateTime startOfPastWeek = DateTime.Today.AddDays(pastWeekDelta).AddDays(-7);
DateTime endOfPastWeek = startOfPastWeek.AddDays(6);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfPastWeek.Date && s.PlanFor.Date <= endOfPastWeek.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.NextWeek:
DateTime startOfNextWeek = DateTime.Today.AddDays(7 - (int)DateTime.Today.DayOfWeek + 1);
DateTime endOfNextWeek = startOfNextWeek.AddDays(5);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfNextWeek.Date && s.PlanFor.Date <= endOfNextWeek.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.ThisWeek:
DateTime today = DateTime.Today;
int delta = DayOfWeek.Saturday - today.DayOfWeek;
if (delta > 0) delta -= 7;
DateTime startOfWeek = today.AddDays(delta);
DateTime endOfWeek = startOfWeek.AddDays(6);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfWeek.Date && s.PlanFor.Date <= endOfWeek.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.PastMonth:
DateTime startOfPastMonth = new PersianDateTime(PersianDateTime.Today.AddMonths(-1).Year, PersianDateTime.Today.AddMonths(-1).Month, 1).ToDateTime();
DateTime endOfPastMonth = startOfPastMonth.AddMonths(1);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfPastMonth.Date && s.PlanFor.Date < endOfPastMonth.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.NextMonth:
DateTime startOfNextMonth = new PersianDateTime(PersianDateTime.Today.AddMonths(1).Year, PersianDateTime.Today.AddMonths(1).Month, 1).ToDateTime();
DateTime endOfNextMonth = startOfNextMonth.AddMonths(1);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfNextMonth.Date && s.PlanFor.Date < endOfNextMonth.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case DateTimeQueryFilter.ThisMonth:
DateTime startOfThisMonth = new PersianDateTime(PersianDateTime.Today.Year, PersianDateTime.Today.Month, 1).ToDateTime();
DateTime endOfThisMonth = startOfThisMonth.AddMonths(1);
shiftPlans = await baseQuery.Where(s => s.PlanFor.Date >= startOfThisMonth.Date && s.PlanFor.Date < endOfThisMonth.Date)
.OrderByDescending(s => s.CreatedAt)
.Skip(request.Page * 15).Take(15)
.Select(ShiftPlanMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
break;
case null:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
if (setActiviesCount)
{
foreach (var shiftPlan in shiftPlans)
{