Architecture
Процессы
Section titled “Процессы”Main process
Section titled “Main process”src/main/index.js
- создаёт окно Electron;
- владеет SQLite;
- выполняет HTTP-запросы;
- шифрует секреты;
- обрабатывает IPC;
- запускает периодическую синхронизацию.
Preload
Section titled “Preload”src/main/preload.js
Публикует узкий API window.tempo. Renderer не имеет доступа к Node.js, файловой системе, SQLite или произвольному IPC.
Renderer
Section titled “Renderer”src/renderer/app.js
Рендерит экраны без внешнего frontend runtime. Все пользовательские данные экранируются функцией esc() перед вставкой в HTML.
Таблицы
Section titled “Таблицы”settings— обычные настройки JSON.secrets— зашифрованные токены.clients— контрагенты.projects— проекты и remote mapping.rate_rules— временные и контекстные ставки.time_entries— таймеры и завершённые записи.outbox— гарантированная очередь Kimai.payments— фактические выплаты.payment_allocations— закрытие времени выплатами.payment_schedules— декларативный график.schedule_items— материализованные ожидаемые выплаты.receipts— чеки НПД.adjustments— ручной долг/списание в деньгах или часах.jira_issues— локальный кэш задач.sync_log— наблюдаемость интеграций.
Транзакционные границы
Section titled “Транзакционные границы”Остановка таймера и добавление outbox выполняются в одной SQLite-транзакции. Создание выплаты, удаление старых распределений, новое автораспределение и обновление платёжного графика также выполняются атомарно.
Конфликты
Section titled “Конфликты”TempoWeave не выполняет destructive merge удалённых записей. Kimai считается системой публикации времени, а локальная база — системой финансовой аналитики и оффлайн-источником.
При push:
- новая запись перед POST проходит preflight-поиск по
tempoweave:<uuid>в коротком диапазоне дат; - запись с
kimai_idобновляется через PATCH; - ошибка остаётся в outbox с экспоненциальной задержкой;
- локальное удаление не транслируется в Kimai, чтобы приложение не выполняло разрушительные операции неявно.
При pull:
- найденный Kimai ID обновляет существующую запись;
- тег
tempoweave:<uuid>восстанавливает локальную связь; - совпавший fingerprint предотвращает дубль;
- неизвестная запись импортируется как
source=kimai.
Прогноз
Section titled “Прогноз”Используются последние 20 рабочих значений из окна до 60 дней:
- среднее дневное начисление;
- линейный тренд, ограниченный ±15% среднего в день;
- прогноз на число рабочих дней горизонта;
- интервал около 80% через
1.28 × σ × √n.
Это эвристический операционный прогноз, а не бухгалтерская гарантия.
Финансовая модель
Section titled “Финансовая модель”Финансовый контур разделён на независимые факты:
- записи времени создают начисления по правилам ставок;
- выплаты фиксируют фактически полученные деньги и налог;
payment_allocationsзакрывают конкретные записи времени полностью или частично;- нераспределённый остаток выплаты является авансом/переплатой;
- график выплат описывает ожидания и не считается фактическим доходом;
- корректировки меняют денежный или часовой долг с обязательной причиной;
- чек НПД подтверждает выплату, но не создаёт второе поступление.
Редактирование выплаты атомарно удаляет её прежние распределения, пересчитывает новые и восстанавливает состояния затронутых пунктов графика. Ссылка на чек при обычном редактировании сохраняется.
Недельный календарь
Section titled “Недельный календарь”Недельный экран получает записи из SQLite, раскладывает пересекающиеся интервалы по параллельным дорожкам и показывает дневные часы, начисления и ожидаемые выплаты. Запущенные таймеры отображаются с текущим временем окончания, не требуя сети.