diff --git a/backend/src/TeleWave.Application/Programming/Templates/Generate/GridPlanner.cs b/backend/src/TeleWave.Application/Programming/Templates/Generate/GridPlanner.cs index c43804b..8e2d666 100644 --- a/backend/src/TeleWave.Application/Programming/Templates/Generate/GridPlanner.cs +++ b/backend/src/TeleWave.Application/Programming/Templates/Generate/GridPlanner.cs @@ -360,6 +360,19 @@ public sealed class GridPlanner( PlanRun Run ) { + /// + /// Длина слота: желаемая, но не больше свободного места. Остаток короче минимального слота + /// приклеивается к текущему — огрызок в сетке читается как ошибка, а не как решение. Остаток + /// побольше достанется следующему слоту, и под него подберут группу подходящей длины. + /// + private static int Fit(int wanted, int available) + { + var duration = Math.Min(Round(wanted), available); + return available - duration < MinSlotMinutes + ? available + : Math.Max(duration, MinSlotMinutes); + } + /// /// Длина слота и число единиц в нём. Блок из N единиц занимает ровно столько, сколько эти /// единицы идут, — округление до пяти минут; хвост короче минимального слота приклеивается @@ -461,19 +474,6 @@ public sealed class GridPlanner( private static int RepeatMinutes(GridBand band) => band.BlockMinutes > 0 ? band.BlockMinutes : 120; - /// - /// Длина слота: желаемая, но не больше свободного места. Остаток короче минимального слота - /// приклеивается к текущему — огрызок в сетке читается как ошибка, а не как решение. Остаток - /// побольше достанется следующему слоту, и под него подберут группу подходящей длины. - /// - private static int Fit(int wanted, int available) - { - var duration = Math.Min(Round(wanted), available); - return available - duration < MinSlotMinutes - ? available - : Math.Max(duration, MinSlotMinutes); - } - private static int Round(int minutes) => Math.Max(SlotStepMinutes, minutes / SlotStepMinutes * SlotStepMinutes);