Files

69 lines
3.6 KiB
C#
Raw Permalink Normal View History

using PARR.Domain.Entities.JobEntities;
using PARR.Domain.Entities.JobGroupEntities;
namespace PARR.TemplateMatcher.Services.Implementations
{
/// <summary>
/// Определяет начальные статусы шаблона и расписания на основе типа группы работ.
/// Если IsJobGroupAutoControl == true → берём из JobGroup.AutoControl.
/// Иначе → берём из Job.AutoControl.
/// </summary>
public static class AutoControlResolver
{
public static (bool IsActiveTemplate, bool IsActiveSchedule) ResolveInitStates(
Job job,
JobGroup? jobGroup,
bool defaultTemplateState = false,
bool defaultScheduleState = false)
{
// Защита от оптимизации: если группу забыли подгрузить, метод честно падает,
// потому что без GroupType бизнес-логика не может определить уровень управления
if (jobGroup == null)
{
throw new InvalidOperationException(
$"Критическая ошибка бизнес-логики: Для работы '{job.Name}' (ID: {job.Id}) " +
$"не передана группа (null). Нужно добавить '.Include(j => j.Group)'.");
}
// 1. Проверяем, что разработчики подгрузили GroupType из базы данных
if (jobGroup.GroupType == null)
{
throw new InvalidOperationException(
$"Для работы '{job.Name}' (ID: {job.Id}) передана группа, " +
$"но её GroupType = null. Нужно добавить '.ThenInclude(g => g.GroupType)' в запрос.");
}
// Теперь компилятор знает, что jobGroup и GroupType гарантированно не null
var isGroupLevel = jobGroup.GroupType.IsJobGroupAutoControl;
// 2. Сценарий: Управление на уровне Группы Работ
if (isGroupLevel)
{
if (jobGroup.AutoControl == null)
throw new InvalidOperationException(
$"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
$"на уровне ГРУППЫ, но у группы '{jobGroup.GroupName}' (ID: {jobGroup.Id}) " +
$"отсутствуют настройки автоконтроля (JobGroup.AutoControl равен null)!");
return (
jobGroup.AutoControl.InitUsedTemplateState,
jobGroup.AutoControl.InitUsedScheduleState
);
}
// 3. Сценарий: Управление на уровне конкретной Работы
if (job.AutoControl == null)
throw new InvalidOperationException(
$"В типе группы '{jobGroup.GroupType.Id}' указано управление " +
$"на уровне РАБОТЫ, но у работы '{job.Name}' (ID: {job.Id}) " +
$"отсутствуют настройки автоконтроля (Job.AutoControl равен null)!");
return (
job.AutoControl.InitUsedTemplateState,
job.AutoControl.InitUsedScheduleState
);
}
}
}