Yc.Box.Types.WorkSchedule
1.2.0
dotnet add package Yc.Box.Types.WorkSchedule --version 1.2.0
NuGet\Install-Package Yc.Box.Types.WorkSchedule -Version 1.2.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Yc.Box.Types.WorkSchedule" Version="1.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Yc.Box.Types.WorkSchedule" Version="1.2.0" />
<PackageReference Include="Yc.Box.Types.WorkSchedule" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Yc.Box.Types.WorkSchedule --version 1.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Yc.Box.Types.WorkSchedule, 1.2.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Yc.Box.Types.WorkSchedule@1.2.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Yc.Box.Types.WorkSchedule&version=1.2.0
#tool nuget:?package=Yc.Box.Types.WorkSchedule&version=1.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Yc.Box.Types.WorkSchedule
Библиотека типов для работы с расписанием работы в проектах YC. Предоставляет полный набор моделей и перечислений для создания, управления и анализа рабочих расписаний с поддержкой различных типов работы, перерывов и статусов.
🚀 Возможности
- Рабочие расписания - Полная модель расписания работы с метаданными
- Рабочие дни - Детальное представление рабочих дней с перерывами
- Перерывы - Гибкая система перерывов с различными типами
- Типы расписаний - Поддержка различных режимов работы
- Статусы расписаний - Управление жизненным циклом расписаний
- Автоматические вычисления - Расчет рабочих часов и дней
- Валидация - Проверка корректности расписаний
📦 Установка
dotnet add package Yc.Box.Types.WorkSchedule
🔧 Использование
Создание расписания работы
using Yc.Box.Types.WorkSchedule.Models;
using Yc.Box.Types.WorkSchedule.Enums;
public class WorkScheduleService
{
public YcWorkSchedule CreateStandardSchedule()
{
var schedule = new YcWorkSchedule
{
Id = Guid.NewGuid(),
Name = "Стандартное расписание",
Description = "Стандартное расписание 5/2 с 9 до 18",
Type = YcScheduleType.FullTime,
Status = YcScheduleStatus.Active,
EffectiveFrom = DateTime.Today,
WorkDays = new List<YcWorkDay>()
};
// Добавляем рабочие дни
var workDays = new[] { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday,
DayOfWeek.Thursday, DayOfWeek.Friday };
foreach (var dayOfWeek in workDays)
{
var workDay = CreateWorkDay(dayOfWeek, TimeSpan.FromHours(9), TimeSpan.FromHours(18));
schedule.WorkDays.Add(workDay);
}
return schedule;
}
public YcWorkSchedule CreateFlexibleSchedule()
{
var schedule = new YcWorkSchedule
{
Id = Guid.NewGuid(),
Name = "Гибкое расписание",
Description = "Гибкое расписание с возможностью выбора времени",
Type = YcScheduleType.Flexible,
Status = YcScheduleStatus.Active,
WorkDays = new List<YcWorkDay>()
};
// Добавляем все дни недели с гибким временем
for (int i = 0; i < 7; i++)
{
var dayOfWeek = (DayOfWeek)i;
var workDay = CreateFlexibleWorkDay(dayOfWeek);
schedule.WorkDays.Add(workDay);
}
return schedule;
}
public YcWorkSchedule CreateShiftSchedule()
{
var schedule = new YcWorkSchedule
{
Id = Guid.NewGuid(),
Name = "Сменное расписание",
Description = "Сменное расписание 12/12",
Type = YcScheduleType.Shift,
Status = YcScheduleStatus.Active,
WorkDays = new List<YcWorkDay>()
};
// Дневная смена
var dayShift = CreateWorkDay(DayOfWeek.Monday, TimeSpan.FromHours(8), TimeSpan.FromHours(20));
schedule.WorkDays.Add(dayShift);
// Ночная смена
var nightShift = CreateWorkDay(DayOfWeek.Tuesday, TimeSpan.FromHours(20), TimeSpan.FromHours(8));
schedule.WorkDays.Add(nightShift);
return schedule;
}
}
Создание рабочих дней
public class WorkDayService
{
public YcWorkDay CreateWorkDay(DayOfWeek dayOfWeek, TimeSpan startTime, TimeSpan endTime)
{
var workDay = new YcWorkDay
{
Id = Guid.NewGuid(),
DayOfWeek = dayOfWeek,
StartTime = startTime,
EndTime = endTime,
IsWorkingDay = true,
Description = $"Рабочий день - {dayOfWeek}",
Breaks = new List<YcBreak>()
};
// Добавляем обеденный перерыв
var lunchBreak = CreateBreak(YcBreakType.Lunch, TimeSpan.FromHours(13), TimeSpan.FromHours(1));
workDay.Breaks.Add(lunchBreak);
// Добавляем кофе-брейк
var coffeeBreak = CreateBreak(YcBreakType.CoffeeBreak, TimeSpan.FromHours(15, 30), TimeSpan.FromMinutes(15));
workDay.Breaks.Add(coffeeBreak);
return workDay;
}
public YcWorkDay CreateFlexibleWorkDay(DayOfWeek dayOfWeek)
{
return new YcWorkDay
{
Id = Guid.NewGuid(),
DayOfWeek = dayOfWeek,
StartTime = TimeSpan.FromHours(8),
EndTime = TimeSpan.FromHours(20),
IsWorkingDay = true,
Description = $"Гибкий рабочий день - {dayOfWeek}",
Breaks = new List<YcBreak>()
};
}
public YcWorkDay CreateWeekend(DayOfWeek dayOfWeek)
{
return new YcWorkDay
{
Id = Guid.NewGuid(),
DayOfWeek = dayOfWeek,
StartTime = TimeSpan.Zero,
EndTime = TimeSpan.Zero,
IsWorkingDay = false,
Description = $"Выходной - {dayOfWeek}",
Breaks = new List<YcBreak>()
};
}
}
Создание перерывов
public class BreakService
{
public YcBreak CreateBreak(YcBreakType breakType, TimeSpan startTime, TimeSpan duration)
{
return new YcBreak
{
Id = Guid.NewGuid(),
Type = breakType,
StartTime = startTime,
Duration = duration,
Description = GetBreakDescription(breakType),
IsRequired = IsRequiredBreak(breakType)
};
}
public YcBreak CreateLunchBreak()
{
return CreateBreak(YcBreakType.Lunch, TimeSpan.FromHours(13), TimeSpan.FromHours(1));
}
public YcBreak CreateCoffeeBreak()
{
return CreateBreak(YcBreakType.CoffeeBreak, TimeSpan.FromHours(15, 30), TimeSpan.FromMinutes(15));
}
public YcBreak CreateTechnicalBreak()
{
return CreateBreak(YcBreakType.TechnicalBreak, TimeSpan.FromHours(11), TimeSpan.FromMinutes(10));
}
private string GetBreakDescription(YcBreakType breakType)
{
return breakType switch
{
YcBreakType.Lunch => "Обеденный перерыв",
YcBreakType.CoffeeBreak => "Кофе-брейк",
YcBreakType.TechnicalBreak => "Технический перерыв",
YcBreakType.RestBreak => "Перерыв на отдых",
YcBreakType.SmokingBreak => "Перерыв на курение",
YcBreakType.TrainingBreak => "Перерыв на обучение",
_ => "Другой перерыв"
};
}
private bool IsRequiredBreak(YcBreakType breakType)
{
return breakType switch
{
YcBreakType.Lunch => true,
YcBreakType.TechnicalBreak => true,
_ => false
};
}
}
Анализ расписаний
public class WorkScheduleAnalyzer
{
public WorkScheduleAnalysis AnalyzeSchedule(YcWorkSchedule schedule)
{
return new WorkScheduleAnalysis
{
TotalWorkHours = schedule.WeeklyWorkHours,
WorkingDaysCount = schedule.WorkingDaysCount,
IsActive = schedule.IsActive,
IsEffective = schedule.IsEffective,
AverageWorkHoursPerDay = schedule.WorkingDaysCount > 0
? schedule.WeeklyWorkHours / schedule.WorkingDaysCount
: TimeSpan.Zero
};
}
public List<YcWorkDay> GetWorkingDays(YcWorkSchedule schedule)
{
return schedule.WorkDays.Where(wd => wd.IsWorkingDay).ToList();
}
public List<YcWorkDay> GetNonWorkingDays(YcWorkSchedule schedule)
{
return schedule.WorkDays.Where(wd => !wd.IsWorkingDay).ToList();
}
public TimeSpan GetTotalBreakTime(YcWorkSchedule schedule)
{
return TimeSpan.FromTicks(schedule.WorkDays.Sum(wd => wd.TotalBreakDuration.Ticks));
}
public TimeSpan GetNetWorkTime(YcWorkSchedule schedule)
{
return schedule.WeeklyWorkHours - GetTotalBreakTime(schedule);
}
public bool IsValidSchedule(YcWorkSchedule schedule)
{
if (schedule.WorkDays == null || !schedule.WorkDays.Any())
return false;
foreach (var workDay in schedule.WorkDays)
{
if (workDay.StartTime >= workDay.EndTime)
return false;
foreach (var break_ in workDay.Breaks)
{
if (break_.StartTime < workDay.StartTime ||
break_.EndTime > workDay.EndTime)
return false;
}
}
return true;
}
}
public class WorkScheduleAnalysis
{
public TimeSpan TotalWorkHours { get; set; }
public int WorkingDaysCount { get; set; }
public bool IsActive { get; set; }
public bool IsEffective { get; set; }
public TimeSpan AverageWorkHoursPerDay { get; set; }
}
API контроллер для расписаний
using Yc.Box.Types.WorkSchedule.Models;
using Yc.Box.Types.WorkSchedule.Enums;
using Yc.Box.Types.Core.Models.ApiResponses;
[ApiController]
[Route("api/[controller]")]
public class WorkSchedulesController : ControllerBase
{
private readonly WorkScheduleService _workScheduleService;
private readonly WorkScheduleAnalyzer _analyzer;
public WorkSchedulesController(WorkScheduleService workScheduleService, WorkScheduleAnalyzer analyzer)
{
_workScheduleService = workScheduleService;
_analyzer = analyzer;
}
[HttpGet]
public ActionResult<YcApiResponse<List<YcWorkSchedule>>> GetWorkSchedules()
{
var schedules = _workScheduleService.GetAllSchedules();
return this.SuccessResponse(schedules, "Расписания получены");
}
[HttpGet("{id}")]
public ActionResult<YcApiResponse<YcWorkSchedule>> GetWorkSchedule(Guid id)
{
var schedule = _workScheduleService.GetById(id);
if (schedule == null)
return this.NotFoundError($"Расписание с ID {id} не найдено");
return this.SuccessResponse(schedule);
}
[HttpGet("{id}/analysis")]
public ActionResult<YcApiResponse<WorkScheduleAnalysis>> AnalyzeWorkSchedule(Guid id)
{
var schedule = _workScheduleService.GetById(id);
if (schedule == null)
return this.NotFoundError($"Расписание с ID {id} не найдено");
var analysis = _analyzer.AnalyzeSchedule(schedule);
return this.SuccessResponse(analysis, "Анализ расписания выполнен");
}
[HttpPost]
public ActionResult<YcApiResponse<YcWorkSchedule>> CreateWorkSchedule([FromBody] CreateWorkScheduleRequest request)
{
if (!ModelState.IsValid)
return this.ValidationError();
var schedule = _workScheduleService.CreateSchedule(request);
if (!_analyzer.IsValidSchedule(schedule))
return this.ValidationError("Расписание содержит некорректные данные");
return this.SuccessResponse(schedule, "Расписание создано");
}
[HttpPut("{id}/status")]
public ActionResult<YcApiResponse> UpdateScheduleStatus(Guid id, [FromBody] YcScheduleStatus status)
{
var schedule = _workScheduleService.GetById(id);
if (schedule == null)
return this.NotFoundError($"Расписание с ID {id} не найдено");
schedule.Status = status;
schedule.UpdatedAt = DateTime.UtcNow;
return this.SuccessResponse("Статус расписания обновлен");
}
}
📋 Доступные перечисления
YcScheduleType
FullTime
- Полный рабочий деньPartTime
- Неполный рабочий деньShift
- Сменное расписаниеFlexible
- Гибкое расписаниеRemote
- Удаленная работаTemporary
- Временное расписаниеSeasonal
- Сезонное расписаниеOther
- Другой тип
YcScheduleStatus
Draft
- ЧерновикActive
- АктивноеSuspended
- ПриостановленоCompleted
- ЗавершеноCancelled
- ОтмененоArchived
- Архивное
YcBreakType
Lunch
- ОбедCoffeeBreak
- Кофе-брейкTechnicalBreak
- Технический перерывRestBreak
- Перерыв на отдыхSmokingBreak
- Перерыв на курениеTrainingBreak
- Перерыв на обучениеOther
- Другой тип перерыва
🏗️ Структура пакета
Yc.Box.Types.WorkSchedule/
├── Models/
│ ├── YcWorkSchedule.cs # Основная модель расписания
│ ├── YcWorkDay.cs # Модель рабочего дня
│ └── YcBreak.cs # Модель перерыва
└── Enums/
├── YcScheduleType.cs # Типы расписаний
├── YcScheduleStatus.cs # Статусы расписаний
└── YcBreakType.cs # Типы перерывов
🔒 Совместимость
- .NET 9.0+
- Все классы имеют префикс
Yc
для избежания конфликтов имен
📄 Лицензия
Проект YC Team
🤝 Поддержка
Для вопросов и предложений обращайтесь к команде разработки YC.
📈 Версии
- 1.0.0 - Первоначальный релиз с моделями расписания
- 1.1.0 - Добавлены вычисляемые свойства и валидация
- 1.2.0 - Переименование классов с префиксом Yc
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.