refactor: период через period.from вместо last_used; дедуп удалён
Удалены last_used, precision, dynamic и дедупликация по created_on/updated_on. Период задаётся одним полем period.from (env FROM_DATE), окно -- от этой даты до сегодня. После успешного --commit/--send начало окна сдвигается на конец отчёта; datetime-границы --date приводятся к полным дням. Схема конфига ломающая: старые ключи игнорируются, миграция описана в документации.
This commit is contained in:
173
docs/CONFIG.md
173
docs/CONFIG.md
@@ -6,11 +6,10 @@
|
||||
- [YAML-конфиг](#yaml-конфиг)
|
||||
- [Структура](#структура)
|
||||
- [`redmine.verify_ssl` — проверка TLS-сертификата](#redmineverify_ssl--проверка-tls-сертификата)
|
||||
- [`period.precision` — точность периода](#periodprecision--точность-периода)
|
||||
- [`period.default_to` — необязательное окончание периода](#perioddefault_to--необязательное-окончание-периода)
|
||||
- [Период по умолчанию — текущий месяц](#период-по-умолчанию--текущий-месяц)
|
||||
- [`period.from` — начало окна отчёта](#periodfrom--начало-окна-отчёта)
|
||||
- [`--date` — формат диапазона](#--date--формат-диапазона)
|
||||
- [`--commit` — автофиксация периода](#--commit--автофиксация-периода)
|
||||
- [Авто-сдвиг начала периода](#авто-сдвиг-начала-периода)
|
||||
- [Миграция старых ключей периода](#миграция-старых-ключей-периода)
|
||||
- [`email` — настройка отправки по почте](#email--настройка-отправки-по-почте)
|
||||
- [`--send` — отправка отчёта по email](#--send--отправка-отчёта-по-email)
|
||||
- [`output` — путь и имя файла по умолчанию](#output--путь-и-имя-файла-по-умолчанию)
|
||||
@@ -61,14 +60,7 @@ redmine:
|
||||
verify_ssl: true
|
||||
|
||||
period:
|
||||
precision: date
|
||||
default_from: "2026-06-01"
|
||||
# default_to можно не указывать — тогда конец периода будет сегодня
|
||||
default_to: "2026-06-30"
|
||||
dynamic: false
|
||||
last_used:
|
||||
from: "2026-06-30T09:00:00"
|
||||
to: "2026-06-30T12:00:00"
|
||||
from: "2026-06-01"
|
||||
|
||||
output:
|
||||
dir: ~/reports
|
||||
@@ -113,91 +105,111 @@ Debian/Ubuntu. Теперь `true` в YAML и `REDMINE_VERIFY=true` в env ра
|
||||
одинаково — оба включают проверку по системному хранилищу CA на любой ОС
|
||||
(через truststore), без привязки к конкретному пути.
|
||||
|
||||
### `period.precision` — точность периода
|
||||
### `period.from` — начало окна отчёта
|
||||
|
||||
Определяет, как вычисляется следующий период после фиксации:
|
||||
|
||||
- `date` (по умолчанию) — период с точностью до дня. Следующий запуск (после `--commit`) начинается со следующего дня.
|
||||
- `datetime` — период с точностью до секунды. При повторном запуске time entries, у которых `created_on` или `updated_on` раньше `last_used.to`, исключаются: запись сохраняется, только если **оба** поля не раньше cutoff (AND-логика). Записи без дат (оба поля отсутствуют) сохраняются; если задано только одно поле, проверяется оно. Это предотвращает дублирование при отправке отчёта внутри рабочего дня. Cutoff применяется всегда, когда вычислен (`precision: datetime` и задан `last_used.to`) — в том числе при явном `--date`.
|
||||
|
||||
`last_used.from` / `last_used.to` записываются автоматически при `--commit`. Вручную редактировать не требуется.
|
||||
|
||||
### `period.default_to` — необязательное окончание периода
|
||||
|
||||
Если `period.default_to` не задан, а `period.default_from` задан, инструмент
|
||||
использует сегодняшнюю дату в качестве конца периода.
|
||||
Единственный ключ периода в YAML. Дата в формате `YYYY-MM-DD`:
|
||||
|
||||
```yaml
|
||||
period:
|
||||
default_from: "2026-07-01"
|
||||
# default_to отсутствует → конец периода = сегодня
|
||||
from: "2026-06-01"
|
||||
```
|
||||
|
||||
Это предотвращает устаревание периода, когда отчёт генерируется автоматически
|
||||
(`--send`, `--commit`) без явного `--date`.
|
||||
Окно отчёта — `from..сегодня`: конец окна всегда сегодняшняя дата и отдельно
|
||||
не настраивается. Переменная окружения `FROM_DATE` задаёт то же начало и имеет
|
||||
приоритет над YAML:
|
||||
|
||||
Аналогично работает `DEFAULT_TO_DATE`: если переменная не задана, а
|
||||
`DEFAULT_FROM_DATE` задана, конец периода = сегодня.
|
||||
```
|
||||
--date > FROM_DATE (env) > period.from (YAML) > 1-е число текущего месяца
|
||||
```
|
||||
|
||||
Обратное не работает: `period.default_to` без `period.default_from` (и
|
||||
`DEFAULT_TO_DATE` без `DEFAULT_FROM_DATE`) игнорируется — период определяется
|
||||
остальными источниками.
|
||||
Разрешение начала окна:
|
||||
|
||||
### Период по умолчанию — текущий месяц
|
||||
| Условие | Начало окна |
|
||||
|---|---|
|
||||
| `from` не задан (`FROM_DATE` и `period.from` пусты) | 1-е число текущего месяца |
|
||||
| `from` — корректная дата | `from` |
|
||||
| `from` позже сегодняшней даты | сегодня (окно «сегодня--сегодня») |
|
||||
| `from` некорректна (не `YYYY-MM-DD`) | warning в stderr + 1-е число текущего месяца |
|
||||
|
||||
Если период не задан ни одним из источников (`--date`, `DEFAULT_FROM_DATE`,
|
||||
`period.default_from`), отчёт строится за текущий месяц: начало периода —
|
||||
1-е число текущего месяца, конец — сегодняшняя дата. Период вычисляется
|
||||
на момент запуска и не хранится в коде или конфиге.
|
||||
Граничный день (день коммита) становится началом следующего окна и потому
|
||||
перечитывается: уже отправленные записи этого дня повторятся в следующем
|
||||
отчёте. Это осознанное следствие отсутствия дедупликации; зато поздние
|
||||
записи, добавленные в Redmine в день коммита после отправки, не теряются.
|
||||
Повторный запуск `--commit`/`--send` в тот же день даёт окно
|
||||
«сегодня--сегодня».
|
||||
|
||||
`period.from` записывается автоматически при `--commit`/`--send`; вручную
|
||||
редактировать не требуется.
|
||||
|
||||
### `--date` — формат диапазона
|
||||
|
||||
Флаг `--date` принимает два формата:
|
||||
Флаг `--date` задаёт диапазон явно и переопределяет все остальные источники.
|
||||
Каждая граница — дата `YYYY-MM-DD` или datetime `YYYY-MM-DDTHH:MM:SS`:
|
||||
|
||||
- Даты: `YYYY-MM-DD--YYYY-MM-DD` (например, `2026-06-01--2026-06-30`).
|
||||
- Datetime с секундами: `YYYY-MM-DDTHH:MM:SS--YYYY-MM-DDTHH:MM:SS`
|
||||
(например, `2026-06-30T09:00:00--2026-06-30T12:00:00`).
|
||||
- `2026-06-01--2026-06-30`;
|
||||
- `2026-06-30T09:00:00--2026-06-30T12:00:00`.
|
||||
|
||||
Обе границы должны быть в одном формате — смешанная точность отвергается.
|
||||
Время в границах отбрасывается — окно всегда состоит из полных дней, так как
|
||||
гранулярность Redmine — день. Границы можно смешивать (дата + datetime).
|
||||
Начало позже конца (`start > end`) — ошибка.
|
||||
|
||||
### `--commit` — автофиксация периода
|
||||
### Авто-сдвиг начала периода
|
||||
|
||||
Флаг `--commit` сохраняет использованный период в YAML-конфиг, чтобы следующий запуск автоматически начинался с нового периода.
|
||||
`--commit` и `--send` генерируют отчёт, сохраняют его в файл (по `--output`
|
||||
или по шаблону `output.dir`/`output.filename`) и сдвигают начало окна.
|
||||
`--send` дополнительно отправляет отчёт по email (см.
|
||||
[ниже](#--send--отправка-отчёта-по-email)).
|
||||
|
||||
**Что делает:**
|
||||
После успешного `--commit` (файл сохранён) или реальной отправки `--send`
|
||||
(подтверждение «y» + успешная отправка) в конфиг пишется
|
||||
`period.from = <конец окна отчёта>`. Следующий запуск без `--date` начинает
|
||||
окно с граничного дня последнего отчёта.
|
||||
|
||||
1. Генерирует отчёт как обычно.
|
||||
2. Сохраняет отчёт в файл:
|
||||
- Если указан `--output` — по явному пути.
|
||||
- Если `--output` не указан — по шаблону из `output.dir` / `output.filename`.
|
||||
3. Записывает `period.last_used.from` / `period.last_used.to` в YAML-конфиг.
|
||||
4. При `period.precision: datetime` сохраняет текущий момент времени (ISO с секундами).
|
||||
5. При `period.precision: date` сохраняет даты периода.
|
||||
Сдвиг НЕ происходит:
|
||||
|
||||
**Поведение `period.dynamic`:**
|
||||
- если за период нет time entries (отчёт пуст — выход до сохранения);
|
||||
- при отказе от подтверждения отправки в `--send` (ответ не «y»/«yes»);
|
||||
- при ошибке SMTP в `--send` (соединение, аутентификация, таймаут);
|
||||
- при ошибке сохранения файла отчёта.
|
||||
|
||||
- `dynamic: true` — следующий запуск (без `--date`) вычисляет период от `last_used`:
|
||||
- Полный календарный месяц → следующий полный месяц.
|
||||
- Произвольный диапазон → та же длительность, начиная со дня после `last_used.to`.
|
||||
- `dynamic: false` — `--commit` перезаписывает `default_from`/`default_to` на использованный период.
|
||||
Исключение: при явном `--commit` (сочетание `--send --commit`) отказ от
|
||||
подтверждения отправки сдвиг не отменяет: окно всё равно сдвигается по
|
||||
`--commit`.
|
||||
|
||||
**Нюанс:** при `--commit` YAML-файл перезаписывается целиком через `yaml.dump` —
|
||||
пользовательские комментарии и ручное форматирование в файле теряются.
|
||||
При сочетании `--send --commit` ошибка SMTP подавляет и сдвиг по `--commit`:
|
||||
файл остаётся сохранён, но начало периода не двигается.
|
||||
|
||||
**Примеры:**
|
||||
Примеры:
|
||||
|
||||
```bash
|
||||
# Июнь 2026 → следующий запуск (без --date) → июль 2026
|
||||
# Окно 1--30 июня → следующий запуск (без --date) начнётся с 30 июня
|
||||
redmine-reporter --date 2026-06-01--2026-06-30 --commit
|
||||
|
||||
# Произвольный диапазон: 15-20 июня → следующий запуск → 21-26 июня
|
||||
# Произвольный диапазон 15--20 июня → следующее окно с 20 июня
|
||||
redmine-reporter --date 2026-06-15--2026-06-20 --commit
|
||||
|
||||
# С datetime-точностью: повторный запуск не дублирует записи
|
||||
redmine-reporter --commit
|
||||
# Отправить и сдвинуть окно (только при подтверждении «y» и успехе)
|
||||
redmine-reporter --date 2026-06-01--2026-06-30 --send --commit
|
||||
```
|
||||
|
||||
`--commit`/`--send` перезаписывают только `period.from`; остальные секции и
|
||||
ключи YAML сохраняются. Файл перезаписывается через `yaml.dump` —
|
||||
пользовательские комментарии и ручное форматирование теряются.
|
||||
|
||||
### Миграция старых ключей периода
|
||||
|
||||
Старые ключи периода больше не читаются и тихо игнорируются при загрузке —
|
||||
их можно удалить из YAML:
|
||||
|
||||
- `period.last_used` (включая `from`/`to`);
|
||||
- `period.precision`;
|
||||
- `period.dynamic`;
|
||||
- `period.default_from` / `period.default_to`.
|
||||
|
||||
Env `DEFAULT_FROM_DATE` / `DEFAULT_TO_DATE` заменены на `FROM_DATE`; конец
|
||||
периода больше не настраивается (всегда сегодня). Дедупликация time entries
|
||||
по `created_on`/`updated_on` удалена.
|
||||
|
||||
### `email` — настройка отправки по почте
|
||||
|
||||
Секция `email` используется флагом `--send`. Если секция не настроена или `smtp.host`
|
||||
@@ -266,8 +278,10 @@ email:
|
||||
|
||||
### `--send` — отправка отчёта по email
|
||||
|
||||
Флаг `--send` отправляет сгенерированный отчёт через SMTP сразу после сохранения
|
||||
в файл. Требует настроенную секцию `email` в YAML-конфиге.
|
||||
Флаг `--send` сохраняет отчёт в файл, отправляет его через SMTP и сдвигает
|
||||
начало периода при подтверждении и успешной отправке (см.
|
||||
[Авто-сдвиг](#авто-сдвиг-начала-периода)). Требует настроенную
|
||||
секцию `email` в YAML-конфиге.
|
||||
|
||||
**Что делает:**
|
||||
|
||||
@@ -275,11 +289,14 @@ email:
|
||||
2. Сохраняет отчёт в файл:
|
||||
- Если указан `--output` — по явному пути.
|
||||
- Если `--output` не указан — по шаблону из `output.dir` / `output.filename`.
|
||||
3. Формирует MIME-письмо:
|
||||
3. Запрашивает подтверждение: «Отправить? [y/N]». Ответ «y»/«yes» продолжает,
|
||||
иначе отправка отменяется (без сдвига периода).
|
||||
4. Формирует MIME-письмо:
|
||||
- Тема, plain-text тело и вложение (если `attach: true`).
|
||||
- При `email.html: true` — дополнительно HTML-версия тела (`multipart/alternative`), сгенерированная из таблицы отчёта.
|
||||
4. Отправляет через SMTP (таймаут 30 секунд). STARTTLS включается только при
|
||||
5. Отправляет через SMTP (таймаут 30 секунд). STARTTLS включается только при
|
||||
`email.smtp.tls: true`; аутентификация — только если задан `email.smtp.user`.
|
||||
6. При успешной отправке сдвигает начало периода.
|
||||
|
||||
**Файл отчёта сохраняется до попытки отправки** — при ошибке SMTP файл остаётся
|
||||
на диске, данные не теряются.
|
||||
@@ -302,7 +319,7 @@ redmine-reporter --date 2026-06-01--2026-06-30 --send
|
||||
# С явным путём
|
||||
redmine-reporter --date 2026-06-01--2026-06-30 --output ~/report.xlsx --send
|
||||
|
||||
# Отправить и зафиксировать период
|
||||
# Отправить и сдвинуть начало периода
|
||||
redmine-reporter --date 2026-06-01--2026-06-30 --send --commit
|
||||
```
|
||||
|
||||
@@ -312,7 +329,7 @@ redmine-reporter --date 2026-06-01--2026-06-30 --send --commit
|
||||
|---|---|
|
||||
| `--send` | Сохранить по шаблону → отправить |
|
||||
| `--send --output X` | Сохранить в X → отправить |
|
||||
| `--send --commit` | Сохранить → отправить → зафиксировать период |
|
||||
| `--send --commit` | Сохранить → подтвердить → отправить → сдвинуть начало периода |
|
||||
| `--send` с `email.html: true` | Письмо с plain-text + HTML-таблицей |
|
||||
| `--send` без `email` в конфиге | Ошибка, exit 1 |
|
||||
| `--send` при ошибке SMTP | Файл сохранён, ошибка в stderr, exit 1 |
|
||||
@@ -429,7 +446,7 @@ report:
|
||||
2. `--output xlsx` (bare format) → путь формируется как `output.dir / output.filename` с подстановкой `{ext}` = bare format и дат из периода.
|
||||
3. `--output /path/report` (без расширения) → дописывается `.output.default_format`.
|
||||
4. `--output /path/report.csv` (с расширением) → используется как есть.
|
||||
5. `--output /path/report.xyz` (неизвестное расширение) → используется как есть, форматтер выбирается по расширению.
|
||||
5. `--output /path/report.xyz` (неизвестное расширение) → ошибка «Неизвестный формат файла», exit 1.
|
||||
|
||||
## Миграция с `.env` на YAML
|
||||
|
||||
@@ -463,9 +480,8 @@ vim ~/.config/redmine-reporter/config.yml
|
||||
| `--init-config --force` | Перезаписать существующий YAML |
|
||||
| `--config-path PATH` | Путь к YAML-конфигу: загрузка при запуске, запись при `--init-config` и `--commit` (по умолчанию `~/.config/redmine-reporter/config.yml`) |
|
||||
|
||||
Если `DEFAULT_TO_DATE` не задана, а `DEFAULT_FROM_DATE` задана, сгенерированный
|
||||
YAML будет содержать пустое `default_to`, и при запуске инструмент использует
|
||||
сегодняшнюю дату.
|
||||
Если задана `FROM_DATE`, сгенерированный YAML будет содержать `period.from` с
|
||||
этим значением.
|
||||
|
||||
### Проверка после миграции
|
||||
|
||||
@@ -507,14 +523,15 @@ rm ~/.config/redmine-reporter/config.yml
|
||||
|
||||
## `.env` (legacy)
|
||||
|
||||
Для обратной совместимости `.env` продолжает работать без изменений.
|
||||
Для обратной совместимости `.env` продолжает работать как раньше, кроме ключей
|
||||
периода: `DEFAULT_FROM_DATE` заменён на `FROM_DATE`, `DEFAULT_TO_DATE` удалён
|
||||
(см. [Миграция старых ключей периода](#миграция-старых-ключей-периода)).
|
||||
|
||||
```ini
|
||||
REDMINE_URL=https://red.eltex.loc
|
||||
REDMINE_API_KEY=your-api-key
|
||||
REDMINE_AUTHOR=Кокос А.А.
|
||||
DEFAULT_FROM_DATE=2026-06-01
|
||||
DEFAULT_TO_DATE=2026-06-30
|
||||
FROM_DATE=2026-06-01
|
||||
```
|
||||
|
||||
Если ни `.env`, ни YAML не заданы — используются кодовые дефолты (текущий месяц
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
- [Экспорт в файл](#экспорт-в-файл)
|
||||
- [Содержимое отчёта](#содержимое-отчёта)
|
||||
- [Отправка по email](#отправка-по-email)
|
||||
- [Ежемесячный цикл с --commit](#ежемесячный-цикл-с---commit)
|
||||
- [Скользящее окно периода](#скользящее-окно-периода)
|
||||
- [Справочник флагов](#справочник-флагов)
|
||||
- [Устранение неполадок](#устранение-неполадок)
|
||||
- [См. также](#см-также)
|
||||
@@ -68,16 +68,15 @@ redmine-reporter --init-config --config-path /etc/redmine-reporter/config.yml
|
||||
|
||||
## Выбор периода
|
||||
|
||||
Источник периода выбирается по приоритету (от высшего к низшему):
|
||||
Окно отчёта — диапазон дат `from..to`. Конец (`to`) всегда сегодняшняя дата,
|
||||
если диапазон не задан явно через `--date`.
|
||||
|
||||
1. `--date` — явный диапазон.
|
||||
2. `DEFAULT_FROM_DATE` (env/.env) — конец: `DEFAULT_TO_DATE` или сегодня. `DEFAULT_TO_DATE` без `DEFAULT_FROM_DATE` игнорируется.
|
||||
3. `period.dynamic: true` + `period.last_used` в YAML — следующий период после `last_used`:
|
||||
- последний период — полный календарный месяц → следующий полный месяц;
|
||||
- произвольный диапазон → та же длительность, начиная со дня после `last_used.to`;
|
||||
- при `precision: datetime` → та же длительность, сдвинутая на 1 секунду после `last_used.to`.
|
||||
4. `period.default_from` в YAML — конец: `default_to` или сегодня. `default_to` без `default_from` игнорируется.
|
||||
5. Ничего не задано → текущий месяц: с 1-го числа по сегодня.
|
||||
Приоритет начала окна (от высшего к низшему):
|
||||
|
||||
1. `--date` — явный диапазон (полностью переопределяет окно).
|
||||
2. `FROM_DATE` (env) — начало; конец — сегодня.
|
||||
3. `period.from` (YAML) — начало; конец — сегодня.
|
||||
4. Ничего не задано — текущий месяц: с 1-го числа по сегодня.
|
||||
|
||||
Форматы `--date`:
|
||||
|
||||
@@ -85,11 +84,18 @@ redmine-reporter --init-config --config-path /etc/redmine-reporter/config.yml
|
||||
# Даты
|
||||
redmine-reporter --date 2026-06-01--2026-06-30
|
||||
|
||||
# Дата-время
|
||||
# Дата-время (границы флорятся до полных дней)
|
||||
redmine-reporter --date 2026-06-01T09:00:00--2026-06-01T18:00:00
|
||||
```
|
||||
|
||||
Смешанная точность (дата + дата-время в одном диапазоне) и диапазон, где начало позже конца, отвергаются с ошибкой.
|
||||
Границы с временем округляются до дат — отчёт строится за полные дни диапазона.
|
||||
Границы можно смешивать (дата + дата-время). Начало позже конца
|
||||
(`start > end`) — ошибка.
|
||||
|
||||
Краевые случаи:
|
||||
|
||||
- `from` позже сегодняшней даты — окно «сегодня--сегодня».
|
||||
- `from` некорректна (не `YYYY-MM-DD`) — warning + текущий месяц.
|
||||
|
||||
## Отчёт за другого пользователя
|
||||
|
||||
@@ -206,6 +212,8 @@ redmine-reporter --send --commit
|
||||
Факты:
|
||||
|
||||
- Файл отчёта сохраняется на диск ДО отправки: при ошибке SMTP файл остаётся на месте.
|
||||
- Перед отправкой запрашивается подтверждение «Отправить? [y/N]»; ответ «y»/«yes» продолжает, иначе отправка отменяется (без сдвига периода, если не задан явный `--commit`).
|
||||
- При успешной отправке начало периода сдвигается (см. [Скользящее окно периода](#скользящее-окно-периода)); при отмене (если не задан явный `--commit`) или ошибке SMTP — без сдвига.
|
||||
- Секция `email` отсутствует или `smtp.host` пуст → ошибка «Email не настроен. Добавьте секцию 'email' в конфиг...», exit 1.
|
||||
- `email.html: true` → письмо `multipart/alternative`: plain-text + HTML-таблица отчёта в теле.
|
||||
- Файл прикрепляется при `attach: true`; MIME-тип определяется по расширению, неизвестное → `application/octet-stream`.
|
||||
@@ -220,41 +228,42 @@ redmine-reporter --send --commit
|
||||
- «Ошибка отправки письма: ...»
|
||||
- «Не удалось подключиться к SMTP-серверу host:port»
|
||||
|
||||
## Ежемесячный цикл с --commit
|
||||
## Скользящее окно периода
|
||||
|
||||
`--commit` сохраняет отчёт в файл (по `--output` или по шаблону `output.dir`/`output.filename`) и записывает `period.last_used` в YAML-конфиг.
|
||||
|
||||
Что пишется:
|
||||
|
||||
- `precision: datetime` → `last_used.from` = `last_used.to` = текущий момент UTC.
|
||||
- `precision: date` → фактические `from`/`to` использованного периода.
|
||||
- `dynamic: true` → `default_from`/`default_to` не меняются.
|
||||
- `dynamic: false` → дополнительно перезаписываются `default_from`/`default_to`.
|
||||
После успешного `--commit` (файл сохранён) или реальной отправки `--send`
|
||||
(подтверждение «y» + успех) окно отчёта сдвигается вперёд: в конфиг пишется
|
||||
`period.from = <конец окна>`. Следующий запуск без `--date`
|
||||
начинается с граничного дня последнего отчёта.
|
||||
|
||||
Типичный цикл:
|
||||
|
||||
```bash
|
||||
# 1. Отчёт за июнь 2026: сохранить файл, зафиксировать период
|
||||
# 1. Отчёт за июнь 2026: сохранить, отправить, сдвинуть начало на 30 июня
|
||||
redmine-reporter --date 2026-06-01--2026-06-30 --send --commit
|
||||
|
||||
# 2. Следующий запуск без --date возьмёт июль 2026 автоматически
|
||||
# (при dynamic: true и полном месяце)
|
||||
# 2. Следующий запуск без --date берёт окно с 30 июня по сегодня
|
||||
redmine-reporter --send --commit
|
||||
```
|
||||
|
||||
Защита от дублей при `precision: datetime`:
|
||||
Граничный день: начало следующего окна совпадает с днём коммита, поэтому этот
|
||||
день перечитывается. Записи дня коммита, уже попавшие в прошлый отчёт,
|
||||
повторятся (дедупликации по `created_on`/`updated_on` нет — это осознанное
|
||||
следствие), зато поздние записи, добавленные в Redmine в этот день после
|
||||
отправки, не теряются.
|
||||
|
||||
- Если в YAML есть `last_used.to` (cutoff), time entry сохраняется в отчёт, только если `created_on` И `updated_on` оба >= cutoff; если хотя бы одно поле раньше cutoff — запись исключается.
|
||||
- Записи, у которых оба поля (`created_on`, `updated_on`) отсутствуют, сохраняются; если задано только одно поле, решает оно.
|
||||
- Фильтр применяется всегда при `precision: datetime`, в том числе при явном `--date`.
|
||||
Повторный запуск `--commit`/`--send` в тот же день даёт окно
|
||||
«сегодня--сегодня», которое повторно включает уже отправленные записи этого
|
||||
дня.
|
||||
|
||||
Важно: `--commit` перезаписывает YAML через `yaml.dump` — пользовательские комментарии в файле теряются.
|
||||
Важно: `--commit`/`--send` перезаписывают только `period.from`; остальные
|
||||
ключи YAML сохраняются, но пользовательские комментарии теряются
|
||||
(перезапись через `yaml.dump`).
|
||||
|
||||
## Справочник флагов
|
||||
|
||||
| Флаг | Описание |
|
||||
| --- | --- |
|
||||
| `--date` | Диапазон периода: `YYYY-MM-DD--YYYY-MM-DD` или `YYYY-MM-DDTHH:MM:SS--YYYY-MM-DDTHH:MM:SS`. Смешанная точность и `start > end` отвергаются. |
|
||||
| `--date` | Явный диапазон: границы — дата `YYYY-MM-DD` или datetime `YYYY-MM-DDTHH:MM:SS`. Время отбрасывается (полные дни), границы можно смешивать; `start > end` — ошибка. |
|
||||
| `--compact` | Компактный текстовый вывод в консоль вместо таблицы. |
|
||||
| `--output` | Путь к файлу (`.odt`/`.csv`/`.md`/`.html`/`.json`/`.xlsx`) или bare-формат — тогда путь берётся из YAML-шаблона; без флага — вывод в консоль (stdout). |
|
||||
| `--author` | Переопределить имя автора отчёта. |
|
||||
@@ -273,8 +282,8 @@ redmine-reporter --send --commit
|
||||
| `--init-config` | Сгенерировать YAML-конфиг из текущего `.env`/окружения и выйти. |
|
||||
| `--force` | Перезаписать существующий YAML-конфиг (только с `--init-config`). |
|
||||
| `--config-path` | Путь к YAML-конфигу: загрузка, запись `--init-config` и `--commit`. По умолчанию `~/.config/redmine-reporter/config.yml`. |
|
||||
| `--commit` | Сохранить отчёт в файл и зафиксировать период (`period.last_used`) в YAML. |
|
||||
| `--send` | Отправить отчёт по email после сохранения файла. |
|
||||
| `--commit` | Сохранить отчёт в файл и сдвинуть начало периода (`period.from` = конец окна) в YAML. |
|
||||
| `--send` | Отправить отчёт по email после сохранения файла; при подтверждении и успехе сдвинуть начало периода. |
|
||||
|
||||
## Устранение неполадок
|
||||
|
||||
|
||||
Reference in New Issue
Block a user