Files
Backend-Api/AccountManagement.Application/TaskScheduleApplication.cs
2025-04-09 19:12:45 +03:30

358 lines
15 KiB
C#

using _0_Framework.Application;
using AccountManagement.Application.Contracts.Task;
using AccountManagement.Application.Contracts.TaskSchedule;
using AccountManagement.Domain.TaskScheduleAgg;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Transactions;
using AccountManagement.Domain.TaskAgg;
using Company.Domain.HolidayItemAgg;
namespace AccountManagement.Application;
public class TaskScheduleApplication : ITaskScheduleApplication
{
private readonly ITaskApplication _taskApplication;
private readonly ITaskScheduleRepository _taskScheduleRepository;
private readonly IHolidayItemRepository _holidayItemRepository;
private readonly ITaskRepository _taskRepository;
public TaskScheduleApplication(ITaskApplication taskApplication, ITaskScheduleRepository taskScheduleRepository, IHolidayItemRepository holidayItemRepository, ITaskRepository taskRepository)
{
_taskApplication = taskApplication;
_taskScheduleRepository = taskScheduleRepository;
_holidayItemRepository = holidayItemRepository;
_taskRepository = taskRepository;
}
public OperationResult Create(CreateTask command)
{
OperationResult operation = new OperationResult();
if (command.HasSchedule)
{
switch (command.ScheduleType)
{
case TaskScheduleType.Limited:
if (Convert.ToInt32(command.ScheduleCount) > 60)
{
return operation.Failed("تعداد وارد شده بیشتر از حد مجاز است");
}
return CreateLimitedTasks(command);
break;
case TaskScheduleType.Unlimited:
return CreateUnlimitedTasks(command);
break;
default:
return operation.Failed("نوع وظیفه محول شده مشخص نمیباشد");
}
}
else
{
return operation.Failed("این تسک بصورت دوره ای نمیباشد");
}
}
public async Task<TaskScheduleDetailsViewModel> GetDetails(long id)
{
return await _taskScheduleRepository.GetDetails(id);
}
public OperationResult Remove(long taskScheduleId)
{
var op = new OperationResult();
var taskSchedule = _taskScheduleRepository.Get(taskScheduleId);
if (taskSchedule == null)
return op.Failed("وظیفه مورد نظر یافت نشد");
var tasks = _taskRepository.GetTasksByTaskScheduleId(taskScheduleId);
var assigns = tasks.SelectMany(x => x.Assigns);
if (assigns.Any(x => x.IsCanceledRequest || x.IsDone || x.IsCancel || x.TimeRequest || x.AcceptedTimeRequest > 0))
{
taskSchedule.DeActive();
var removableTask = tasks.Where(x=>x.Assigns.All(a=>a.IsDone==false && a.IsCancel == false)).ToList();
_taskRepository.RemoveRange(removableTask);
}
else
{
_taskScheduleRepository.Remove(taskSchedule);
_taskRepository.RemoveRange(tasks);
}
_taskRepository.SaveChanges();
return op.Succcedded();
}
private OperationResult CreateLimitedTasks(CreateTask command)
{
OperationResult operation = new OperationResult();
if (Convert.ToInt32(command.ScheduleCount) < 1 || string.IsNullOrWhiteSpace(command.ScheduleCount))
{
return operation.Failed("تعداد وارد شده باید بیشتر از 2 باشد");
}
if (string.IsNullOrWhiteSpace(command.ScheduleUnitNumber))
{
return operation.Failed("لطفا تعداد بازه خود را مشخص کنید");
}
switch (command.ScheduleUnitType)
{
case TaskScheduleUnitType.Year:
if (Convert.ToInt32(command.ScheduleCount) != 1)
{
return operation.Failed("دوره نمیتواند بیشتر از 1 سال باشد");
}
break;
case TaskScheduleUnitType.Month:
if (Convert.ToInt32(command.ScheduleUnitNumber) is > 12 or < 1)
{
return operation.Failed("بازه وارد شده نا معتبر است");
}
if (Convert.ToInt32(command.ScheduleCount) is > 60 or < 1)
{
return operation.Failed("تعداد دفعات وارد شده نامعتبر است");
}
break;
case TaskScheduleUnitType.Week:
if (command.ScheduleUnitNumber != "first" && command.ScheduleUnitNumber != "last")
{
return operation.Failed("بازه وارد شده نا معتبر است");
}
break;
case TaskScheduleUnitType.Day:
if (Convert.ToInt32(command.ScheduleUnitNumber) is > 29 or < 1)
{
return operation.Failed("بازه وارد شده نا معتبر است");
}
break;
default:
return operation.Failed("نوع بازه مشخص نمیباشد");
break;
}
try
{
//using var transaction = new TransactionScope();
DateTime previousDateRaw = command.EndTaskDate.ToEndDayOfGeorgianDateTime();
DateTime previousDateEdited = command.EndTaskDate.ToEndDayOfGeorgianDateTime();
var day = Convert.ToInt32(command.EndTaskDate.Substring(8, 2));
var month = Convert.ToInt32(command.EndTaskDate.Substring(5, 2));
var year = Convert.ToInt32(command.EndTaskDate.Substring(0, 4));
int count = Convert.ToInt32(command.ScheduleCount);
bool isInt = int.TryParse(command.ScheduleUnitNumber, out int unitNumber);
string kindOfWeekUnit = isInt ? "" : command.ScheduleUnitNumber;
var taskSchedule = new TaskSchedule(command.ScheduleCount, command.ScheduleType, command.ScheduleUnitType,
command.ScheduleUnitNumber, previousDateEdited);
_taskScheduleRepository.Create(taskSchedule);
_taskScheduleRepository.SaveChanges();
command.TaskScheduleId = taskSchedule.id;
switch (command.ScheduleUnitType)
{
case TaskScheduleUnitType.Year:
for (int i = 1; i <= count; i++)
{
command.EndTaskDate = previousDateEdited.ToFarsi();
operation = _taskApplication.CreateTask(command);
taskSchedule.SetLastEndTaskDate(previousDateEdited);
bool isHoliday = _holidayItemRepository.GetHoliday(previousDateRaw);
while (isHoliday || previousDateEdited.DayOfWeek == DayOfWeek.Friday)
{
previousDateEdited = previousDateRaw.AddDays(1);
isHoliday = _holidayItemRepository.GetHoliday(previousDateEdited);
}
previousDateRaw = previousDateRaw.AddYears(unitNumber);
previousDateEdited = previousDateRaw;
}
break;
case TaskScheduleUnitType.Month:
bool endOfMonth = day == 31;
if (endOfMonth)
{
for (int i = 1; i <= count; i++)
{
command.EndTaskDate = previousDateEdited.ToFarsi();
operation = _taskApplication.CreateTask(command);
taskSchedule.SetLastEndTaskDate(previousDateEdited);
if (month >= 12)
{
var extra = month - 12;
year++;
month = extra + unitNumber;
}
else
{
month = unitNumber + month;
}
previousDateRaw = $"{year:0000}/{month:00}/01".FindeEndOfMonth().ToGeorgianDateTime();
bool isHoliday = _holidayItemRepository.GetHoliday(previousDateRaw);
while (isHoliday || previousDateEdited.DayOfWeek == DayOfWeek.Friday)
{
previousDateEdited = previousDateRaw.AddDays(1);
isHoliday = _holidayItemRepository.GetHoliday(previousDateEdited);
}
previousDateEdited = previousDateRaw;
}
}
else
{
for (int i = 1; i < count; i++)
{
command.EndTaskDate = previousDateEdited.ToFarsi();
operation = _taskApplication.CreateTask(command);
taskSchedule.SetLastEndTaskDate(previousDateEdited);
var endDay = 0;
if (month >= 12)
{
var extra = month - 12;
year++;
month = extra + unitNumber;
}
else
{
month = unitNumber + month;
}
if (day == 30)
{
if (month == 12)
{
var lastYearDay = Convert.ToInt32($"{year:0000}/{month:00}/1".FindeEndOfMonth()
.Substring(8, 2));
endDay = lastYearDay == 30 ? lastYearDay : 29;
}
}
previousDateEdited = endDay == 0
? $"{year:0000}/{month:00}/{day:00}".ToGeorgianDateTime()
: $"{year:0000}/{month:00}/{endDay:00}".ToGeorgianDateTime();
}
//for (int i = 1; i <= count; i++)
//{
// command.EndTaskDate = previousDateEdited.ToFarsi();
// operation = _taskApplication.CreateTask(command);
// taskSchedule.SetLastEndTaskDate(previousDateEdited);
// previousDateRaw = $"{year:0000}/{month:00}/01".FindeEndOfMonth().ToGeorgianDateTime();
// bool isHoliday = _holidayItemRepository.GetHoliday(previousDateRaw);
// while (isHoliday || previousDateEdited.DayOfWeek == DayOfWeek.Friday)
// {
// previousDateEdited = previousDateRaw.AddDays(1);
// isHoliday = _holidayItemRepository.GetHoliday(previousDateEdited);
// }
// previousDateEdited = previousDateRaw;
//}
}
break;
case TaskScheduleUnitType.Week:
for (int i = 1; i <= count; i++)
{
if (string.IsNullOrWhiteSpace(kindOfWeekUnit))
{
throw new InvalidDataException();
}
command.EndTaskDate = kindOfWeekUnit switch
{
"first" => previousDateRaw.GetNextDayOfWeek(DayOfWeek.Saturday).ToFarsi(),
"last" => previousDateRaw.GetNextDayOfWeek(DayOfWeek.Thursday).ToFarsi(),
_ => throw new InvalidDataException()
};
operation = _taskApplication.CreateTask(command);
taskSchedule.SetLastEndTaskDate(previousDateEdited);
bool isHoliday = _holidayItemRepository.GetHoliday(previousDateRaw);
while (isHoliday || previousDateEdited.DayOfWeek == DayOfWeek.Friday)
{
previousDateEdited = previousDateRaw.AddDays(1);
isHoliday = _holidayItemRepository.GetHoliday(previousDateEdited);
}
previousDateRaw = command.EndTaskDate.ToGeorgianDateTime();
previousDateEdited = previousDateRaw;
}
break;
case TaskScheduleUnitType.Day:
for (int i = 1; i <= count; i++)
{
command.EndTaskDate = previousDateEdited.ToFarsi();
operation = _taskApplication.CreateTask(command);
taskSchedule.SetLastEndTaskDate(previousDateEdited);
previousDateRaw = previousDateRaw.AddDays(unitNumber);
bool isHoliday = _holidayItemRepository.GetHoliday(previousDateRaw);
while (isHoliday || previousDateEdited.DayOfWeek == DayOfWeek.Friday)
{
previousDateEdited = previousDateRaw.AddDays(1);
isHoliday = _holidayItemRepository.GetHoliday(previousDateEdited);
}
previousDateEdited = previousDateRaw;
}
break;
}
_taskScheduleRepository.SaveChanges();
//transaction.Complete();
operation = operation.Succcedded();
return operation;
}
catch (Exception e)
{
return operation.Failed(e.ToString());
}
}
private OperationResult CreateUnlimitedTasks(CreateTask command)
{
using var transaction = new TransactionScope();
var lastDate = command.EndTaskDate.ToGeorgianDateTime();
var taskSchedule = new TaskSchedule(command.ScheduleCount, command.ScheduleType, command.ScheduleUnitType,
command.ScheduleUnitNumber, lastDate);
_taskScheduleRepository.Create(taskSchedule);
_taskScheduleRepository.SaveChanges();
command.TaskScheduleId = taskSchedule.id;
var operation = _taskApplication.CreateTask(command);
if (!operation.IsSuccedded)
return operation;
_taskScheduleRepository.SaveChanges();
transaction.Complete();
return operation.Succcedded();
}
}