Код-ревью Senior Проверка сгенерированного кода обновлено

Код-ревью: утилита дат и денег от ассистента

Вопрос

Ассистент написал утилиту для расчёта суммы заказов за день. Найдите проблемы.

// Сумма оплаченных заказов за календарный день
export function dailyTotal(orders, day) {
  const start = new Date(day);
  const end = new Date(start.getTime() + 24 * 60 * 60 * 1000);
  let total = 0;
  for (const o of orders) {
    const t = new Date(o.paidAt);
    if (t > start && t < end && o.status == "paid") {
      total += o.amount * 1.2;
    }
  }
  return total.toFixed(2);
}

Коротко

Код выглядит аккуратно, но в нём ровно те ошибки, которые ассистенты делают чаще всего: пропущенные краевые случаи (полночь, часовые пояса, переход на летнее время), выдуманное бизнес-правило и небрежная работа с деньгами. Такие вещи не ловит линтер, нужны тесты на границы и знание требований.

Что должен найти ревьюер

  1. Ошибкастрока 3
    new Date(day) для строки вида 2024-03-10 трактуется как UTC, а не как день в часовом поясе бизнеса. Явно задать часовой пояс.
  2. Ошибкастрока 4
    День не всегда 24 часа: при переходе на летнее время в части стран будет ошибка. Считать конец как начало следующих суток в нужном поясе.
  3. Ошибкастрока 8
    Строгое t > start теряет заказы, оплаченные ровно в полночь. Нужно t >= start.
  4. Стильстрока 8
    Нестрогое сравнение == вместо ===.
  5. Ошибкастрока 9
    Умножение на 1.2 нигде не описано: выдуманный налог или наценка. Бизнес-правило уточнить, а не угадывать.
  6. Ошибкастрока 9
    Деньги в числах с плавающей точкой копят ошибку округления. Считать в копейках целыми.
  7. Ошибкастрока 12
    toFixed возвращает строку, а по названию ожидается число. Вызывающий код может сложить строки.

Разбор

Код выглядит аккуратно, но в нём ровно те ошибки, которые ассистенты делают чаще всего: пропущенные краевые случаи (полночь, часовые пояса, переход на летнее время), выдуманное бизнес-правило и небрежная работа с деньгами. Такие вещи не ловит линтер, нужны тесты на границы и знание требований.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.