1. Исторически пробовали использовать тотже Google Calendar , не зашло. Формулировка менеджмента такая: "Нам требуется всего лишь бросить один взгяд на табличку, чтобы понять какое количество человеко-часов у нас доступно завтра под проекты." Google Calendar такой возможности не дает ( или любой другой) . Не информативно. Да и в Excel выгрузка хромает.
2. Примерно количество email-ов которое валится сотруднику за рабочий день 100-150. В каждый email нужно погрузится. Сотрудники теряют уведомления по email. Либо видят уже тогда, когда они теряют актуальность. 50% сотрудников будет уведомлено, 50% пропустит уведомление. Уже проходили. Не подходит. Все тот же человеческий фактор.
3. Корпоративный мессенденджер есть. Начальники отделов - это не операторы по рассылке уведомлений ( спама) . Это опять же ручной труд. Его нужно исключить. Человеческий фактор не нужен совсем.
В конце рабочего дня каждый сотрудник просто смотрит табличку "График работы" . ВСЕ. Эта схема работает.
Теперь осталось только найти такое программное обеспечение, которое даст посмотреть график одновременно большому количеству человек.
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
#nullable enable
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
/// <summary>
/// An <see cref="IModelBinderProvider"/> for <see cref="CancellationToken"/>.
/// </summary>
public class CancellationTokenModelBinderProvider : IModelBinderProvider
{
// CancellationTokenModelBinder does not have any state. Re-use the same instance for binding.
private readonly CancellationTokenModelBinder _modelBinder = new();
/// <inheritdoc />
public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
ArgumentNullException.ThrowIfNull(context);
if (context.Metadata.ModelType == typeof(CancellationToken))
{
return _modelBinder;
}
return null;
}
}
/// <summary>
/// <see cref="IModelBinder"/> implementation to bind models of type <see cref="CancellationToken"/>.
/// </summary>
public class CancellationTokenModelBinder : IModelBinder
{
/// <inheritdoc />
public Task BindModelAsync(ModelBindingContext bindingContext)
{
ArgumentNullException.ThrowIfNull(bindingContext);
// We need to force boxing now, so we can insert the same reference to the boxed CancellationToken
// in both the ValidationState and ModelBindingResult.
//
// DO NOT simplify this code by removing the cast.
var model = (object)bindingContext.HttpContext.RequestAborted;
bindingContext.ValidationState.Add(model, new ValidationStateEntry() { SuppressValidation = true });
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
Насчет возможности получения CancellationToken через параметр метода действия за счет привязки к модели меня терзают смутные сомнения.
Бывают перестановки до 3-5 раз за рабочий день для одного сотрудника.
Только я уже работаю мидлом более пяти лет и ведущим разрабом работал. и тимлидом. и успешно поднимал проекты и готовил кадры.
Получаем ограничение: система обязана иметь интерфейс Excel ( Libre Office ) или аналогов, что-бы новенький сотрудник сразуже начал выполнять рабочие задачи.
Персональный диск стоит дешевле - да, но ценой кучи ограничений на уровне лицензии и кучи дополнительных неудобств, в тч отсутствия нормально API.