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

38. «Разделить счёт» с друзьями в Т‑Банке

Средняя

Java · 30 строк

Клиент оплатил ужин и делит счёт поровну между собой и друзьями: каждому уходит запрос денег и push. Остаток копеек от деления ложится на плательщика. Заблокированным клиентам запрос не отправляем, их долю тоже оплачивает плательщик.

Список participantIds приходит из приложения, суммы — в копейках. Сейчас ограничений нет, продакт просит до 20 человек и до 300 000 ₽. Отметьте строки с ошибками.

В работе: Кнопка «Разделить счёт» в истории операций после оплаты картой.

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

Источник: наша задача на данных Т‑Банка: запросы денег между клиентами. Условие пересказано своими словами.

  1. @Service
  2. public class SplitBillService {
  3. private final RequestRepository requests;
  4. private final UserRepository users;
  5. private final PushClient push;
  6. public SplitBillService(RequestRepository requests, UserRepository users, PushClient push) {
  7. this.requests = requests;
  8. this.users = users;
  9. this.push = push;
  10. }
  11. public List<PaymentRequest> split(long payerId, long totalKop, List<Long> participantIds, String comment) {
  12. int n = participantIds.size() + 1;
  13. long share = totalKop / n;
  14. List<PaymentRequest> created = new ArrayList<>();
  15. for (Long id : participantIds) {
  16. User user = users.findById(id).get();
  17. if (user.isBlocked()) {
  18. participantIds.remove(id);
  19. continue;
  20. }
  21. PaymentRequest r = new PaymentRequest(payerId, id, share, comment);
  22. requests.save(r);
  23. created.add(r);
  24. push.send(user.getDeviceToken(), "Вас попросили вернуть " + share / 100 + " ₽: " + comment);
  25. }
  26. return created;
  27. }
  28. }