Java · 38 строк
Абонент заказывает детализацию звонков за месяц в личном кабинете. Тарификация поминутная: неполная минута считается полной, звонки до 3 секунд бесплатные, минута стоит 2,50 ₽. За месяц у активного абонента 1 000–3 000 звонков.
Сервис вызывается из многих потоков веб-сервера. Отметьте строки с ошибками.
В работе: Детализация в личном кабинете: по ней абоненты сверяют счёт и пишут претензии.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах МТС: детализация и тарификация звонков. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
public class CallDetailsService {private static final SimpleDateFormat FMT = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");private final DataSource ds;public CallDetailsService(DataSource ds) {this.ds = ds;}public List<String> report(String msisdn, LocalDate month) throws SQLException {Connection conn = ds.getConnection();PreparedStatement ps = conn.prepareStatement("SELECT id, started_at, duration_sec, callee FROM calls WHERE msisdn = ? AND started_at >= ? AND started_at < ?");ps.setString(1, msisdn);ps.setObject(2, month.withDayOfMonth(1));ps.setObject(3, month.withDayOfMonth(month.lengthOfMonth()));ResultSet rs = ps.executeQuery();List<String> lines = new ArrayList<>();while (rs.next()) {int seconds = rs.getInt("duration_sec");int minutes = seconds / 60;String tariff = loadTariffName(conn, rs.getLong("id"));double cost = minutes * 2.5;lines.add(FMT.format(rs.getTimestamp("started_at")) + ";" + rs.getString("callee") + ";"+ minutes + " мин;" + cost + " ₽;" + tariff);}return lines;}private String loadTariffName(Connection conn, long callId) throws SQLException {try (PreparedStatement ps = conn.prepareStatement("SELECT t.name FROM tariffs t JOIN calls c ON c.tariff_id = t.id WHERE c.id = ?")) {ps.setLong(1, callId);ResultSet rs = ps.executeQuery();rs.next();return rs.getString(1);}}}