Настольное приложение (Delphi 10.3, VCL, Win32) для учёта рабочего времени разработчика/тимлида с фиксацией отработанного времени в Jira Server/Data Center.
- Задачи: название, тип (разработка / анализ / административная / созвон / собеседование), опциональный номер Jira (формат
PROJ-123), опция «начать сразу» (по умолчанию включена). - Переключение: незавершённых задач может быть несколько, активна максимум одна — старт другой автоматически ставит текущую на паузу.
- Трей: пауза/продолжить, подменю быстрого переключения между задачами, двойной клик — открыть окно. Кнопка «X» сворачивает в трей, выход — только через меню трея. Иконка меняет цвет: зелёная — идёт учёт, серая — пауза.
- Автопауза при блокировке компьютера (Win+L) и автовозобновление при разблокировке; отключается в настройках.
- Автозапуск при старте Windows (
HKCU\Software\Microsoft\Windows\CurrentVersion\Run, параметр/autostart— запуск свёрнутым в трей); включается в настройках. - Jira: при завершении задачи с номером время отправляется в worklog (
POST /rest/api/2/issue/<key>/worklog, авторизацияBearerPAT). Время округляется вверх до минуты (минимум 1 минута),started— реальное начало работы над задачей, комментарий — название задачи. Отправка в фоновом потоке, интерфейс не блокируется. - Отказоустойчивость синхронизации: при ошибке (сеть, неверный номер, протухший токен) задача завершается локально, текст ошибки сохраняется; повторная отправка — кнопкой «Отправить в Jira» либо автоматически при следующем запуске приложения.
- Отчёты за период (пресеты «сегодня / неделя / месяц»): детализация по задачам, итоги по типам, общий итог; интервалы обрезаются по границам периода. Экспорт в HTML — открывается в браузере, оттуда печать.
- Устойчивость к сбоям: время хранится интервалами работы; у открытого интервала раз в минуту обновляется heartbeat. После крэша или выключения ПК незакрытый интервал закрывается по последней отметке, задача переводится на паузу, показывается уведомление.
| Что | Где |
|---|---|
| База (SQLite, WAL) | %APPDATA%\Tickwork\tracker.db — создаётся автоматически |
| Токен Jira | в базе, зашифрован DPAPI под учётной записью пользователя |
| Автозапуск | HKCU\Software\Microsoft\Windows\CurrentVersion\Run, значение Tickwork |
При первом запуске выполняется миграция со старого имени проекта: каталог %APPDATA%\JiraTimeTracker переносится в %APPDATA%\Tickwork, значение автозапуска JiraTimeTracker заменяется на Tickwork.
RAD Studio / Delphi 10.3 (BDS 20.0), платформа Win32:
call "C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\rsvars.bat"
msbuild Tickwork.dproj /t:Build /p:Config=Release /p:Platform=Win32Результат: Win32\Release\Tickwork.exe. Зависимостей нет — SQLite-драйвер FireDAC статически линкуется, HTTP через системный WinHTTP/SChannel.
Правила для исходников:
.pas— UTF-8 с BOM (в строках кириллица; без BOM dcc32 портит текст);.dfm— только ASCII: все русские подписи назначаются в коде (ApplyCaptionsвFormCreate).
Кнопка «Настройки»: адрес Jira (например https://jira.company.ru), Personal Access Token, «Проверить соединение» (GET /rest/api/2/myself — покажет имя пользователя), автозапуск, автопауза.
HTTPS-сертификат сервера Jira должен быть доверенным в Windows (корпоративный CA в хранилище сертификатов).
| Модуль | Назначение |
|---|---|
Tickwork.dpr |
точка входа: mutex единственного экземпляра, режим /autostart |
uTypes.pas |
типы задач/статусов, форматирование времени, валидация ключа Jira |
uDM.pas |
SQLite/FireDAC: схема, задачи, интервалы, отчёты, настройки, восстановление |
uAppSettings.pas |
настройки, DPAPI-шифрование токена, автозапуск в реестре |
uJiraClient.pas |
REST-клиент Jira: проверка соединения, отправка worklog |
uMain.pas |
главная форма, трей, автопауза по блокировке сессии, синхронизация |
uTaskEditForm.pas |
диалог редактирования задачи |
uSettingsForm.pas |
форма настроек |
uReportForm.pas |
отчёты и HTML-экспорт |
tasks(id, title, task_type, jira_key, status, -- 0 пауза, 1 активна, 2 завершена
created_at, completed_at,
synced, synced_at, jira_worklog_id, sync_error) -- состояние передачи в Jira
work_intervals(id, task_id, started_at, stopped_at, -- stopped_at IS NULL = учёт идёт
heartbeat_at) -- для восстановления после сбоя
settings(key, value) -- jira_url, jira_token (DPAPI), ...Время задачи = сумма её интервалов; отчёты считаются по интервалам, попадающим в период.
