Войти Регистрация
Код-ревью

22. Срок бесплатного хранения в ПВЗ

Лёгкая

Kotlin · 31 строк

Заказ хранится бесплатно 7 дней, день поступления считается первым: пришёл 1-го — бесплатно до 7-го включительно, с 8-го — 10 ₽ в сутки. После срока заказ уезжает обратно продавцу.

ПВЗ есть от Калининграда до Хабаровска, arrivedAt хранится как Instant. Отметьте строки с ошибками.

В работе: SMS «заказ ждёт вас до …» и ночная задача, которая отправляет непрошенные заказы на возврат.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
датычасовые поясаграничные случаи

Источник: на задачах Wildberries: хранение заказов в пунктах выдачи. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. data class Parcel(val id: Long, val arrivedAt: Instant, var issued: Boolean)
  2. object StoragePolicy {
  3. const val FREE_DAYS = 7
  4. const val FEE_PER_DAY_KOP = 1000L
  5. private fun arrivalDay(p: Parcel): LocalDate = p.arrivedAt.atZone(ZoneOffset.UTC).toLocalDate()
  6. fun lastFreeDay(p: Parcel): LocalDate = arrivalDay(p).plusDays(FREE_DAYS.toLong())
  7. fun storageFeeKop(p: Parcel, today: LocalDate): Long {
  8. val days = ChronoUnit.DAYS.between(arrivalDay(p), today)
  9. if (days < FREE_DAYS) return 0
  10. val paidDays = days - FREE_DAYS + 1
  11. return paidDays * FEE_PER_DAY_KOP
  12. }
  13. fun expired(parcels: List<Parcel>, today: LocalDate): List<Parcel> {
  14. val result = mutableListOf<Parcel>()
  15. for (p in parcels) {
  16. if (today.isAfter(lastFreeDay(p)) && !p.issued) result.add(p)
  17. if (result.size == 50) break
  18. }
  19. return result
  20. }
  21. fun smsText(p: Parcel, phone: String): String {
  22. Log.i("Storage", "SMS to $phone about parcel ${p.id}")
  23. return "Заказ ${p.id} ждёт вас до ${lastFreeDay(p)}"
  24. }
  25. }