using PARR.Domain.Entities.JobEntities; using PARR.Domain.Entities.JobGroupEntities; namespace PARR.TemplateMatcher.Services.Implementations { /// /// Определяет начальные статусы шаблона и расписания на основе типа группы работ. /// Если IsJobGroupAutoControl == true → берём из JobGroup.AutoControl. /// Иначе → берём из Job.AutoControl. /// 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 ); } } }