Назад в блог
Практика

Надёжный таймер задач: пауза, переключение и напоминания

Как таймер в Laravel-таск-трекере превратился из кнопки старт/стоп в устойчивую систему состояний.

Надёжный таймер задач: пауза, переключение и напоминания

Почему простого старт/стоп оказалось мало

Первая версия таймера умела открыть запись времени и закрыть её. В реальной работе быстро появились вопросы: что делать во время перерыва, как перейти к другой задаче и как не потерять забытый активный интервал?

Главная сложность была не в отображении секунд, а в точном смысле каждого действия:

  • пауза фиксирует текущий интервал, но сохраняет возможность продолжить задачу;
  • продолжить начинает новый интервал и не считает время ожидания;
  • стоп окончательно завершает текущую работу;
  • завершить задачу останавливает таймер и меняет статус задачи.

Безопасное переключение

Одновременно может идти только один таймер. Если запустить другую задачу, интерфейс сначала просит подтверждение. После него текущий интервал закрывается, а новый создаётся в одной контролируемой операции.

Такое правило важно держать в доменной логике, а не только прятать кнопку в интерфейсе. Иначе два запроса или другой экран админки смогут обойти визуальное ограничение.

Живой индикатор и напоминание

Активное время показывается в таблице задач и в глобальном мини-таймере в шапке Filament. Для этого не нужно каждую секунду записывать значение в базу: браузер считает отображаемое время от сохранённого момента старта.

Если интервал длится подозрительно долго, появляется напоминание. Из него можно продолжить работу, поставить её на паузу или скорректировать время. Это полезнее жёсткого автоматического завершения: приложение замечает проблему, но решение оставляет человеку.

Что проверяют тесты

Feature-тесты фиксируют главные инварианты: запрет двух активных таймеров, корректное закрытие интервала, отсутствие времени паузы в результате и безопасное переключение между задачами. Когда интерфейс стал сложнее, именно эти тесты позволили менять кнопки без страха сломать учёт времени.