Files
timesheet/README.md
2025-10-22 17:07:23 +07:00

38 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Описание
Утилита распределяет заданное общее время по задачам равномерно или по весам, выводит таблицу в ЧЧ:ММ и, по желанию, колонку десятичных часов в формате 0.01 или 0.1 с контролем, чтобы сумма десятичной колонки совпадала с общим временем
### Особенности
- Равномерное или взвешенное распределение методом наибольших остатков, чтобы сумма минут ровно совпала с общим бюджетом
- Опциональное квантование по 0.1 часа, где 0.1 часа = 6 минут, с распределением «квантов» тоже методом наибольших остатков и точной суммой по десятым
- Десятичные часы 0.01 или 0.1 рассчитываются через Decimal.quantize с ROUND_HALF_UP и балансируются так, чтобы сумма десятичной колонки строго равнялась общим часам в выбранном формате
### Интерактивный сценарий
- Введите общее время: допускаются форматы ЧЧ, десятичные часы (например 7.5), либо ЧЧ:ММ (например 7:30)
- Укажите количество задач и выберите режим распределения: поровну или по весам, где большие веса получают больше минут
- По желанию включите квантование по 0.1 часа, чтобы распределение шло кратно 6 минутам и сумма десятичных десятых получалась ровно, например 2.0 часа = 20 квантов
- По желанию включите вывод колонки десятичных часов и выберите формат 0.01 или 0.1, при этом используются Decimal.quantize и ROUND_HALF_UP для привычного округления, а сумма колонки балансируется до точного общего времени
### Пример
- Вход: 2 часа и 7 задач при квантовании 0.1 часа приведёт к 6 задачам по 18 минут (0.3 часа) и 1 задаче 12 минут (0.2 часа), что суммарно даёт 2.0 часа и 120 минут
- Пояснение: 2.0 часа = 20 десятых, распределение квантов методом наибольших остатков даёт набор из шести 0.3 и одного 0.2 при равных долях, сохраняя общий бюджет и корректность округления
### Формулы и правила округления
- Перевод минут в десятичные часы: $$ \text{часы}_{\text{дец.}} = \frac{\text{минуты}}{60} $$, например 17 минут ≈ 0.2833 часа
- В формате 0.01 используется округление HALF_UP до сотых, например $$ \text{round\_half\_up}\left(\frac{17}{60}, 2\right) = 0.28 $$
- В формате 0.1 каждая 0.1 часа равна 6 минутам, поэтому 17 минут округляются до 0.3 часа при округлении к ближайшей десятой по HALF_UP и при квантовании по десятым
### Режимы распределения
- Равномерный: все задачи получают равные доли, округление в целых минутах осуществляется методом наибольших остатков, чтобы сумма минут совпала с бюджетом
- По весам: доля каждой задачи пропорциональна весу, с тем же методом наибольших остатков для целочисленных минут
- Квантование 0.1 часа: распределение идёт в «квантах» по 6 минут, что гарантирует точную сумму в десятичных десятых и соответствует многим практикам учёта времени
### Колонка десятичных часов
- 0.01: балансированное округление до сотых через Decimal.quantize(ROUND_HALF_UP), чтобы сумма десятичных часов была ровно равна общему времени, например 2.00
- 0.1: балансированное округление до десятых, совместимое с квантованием по 6 минут, что обеспечивает, к примеру, ровно 2.0 часа суммой по колонке
### Ограничения и заметки
- Для режима квантования 0.1 часа общее время должно делиться на 6 минут без остатка, иначе будет предупреждение и переход к поминутному распределению, чтобы не нарушать бюджет .
- Балансирование десятичной колонки обеспечивает совпадение суммы с общим временем, минимально меняя значения строк в пределах одного знака выбранного формата