«Обсидиант: Ростки в бетоне». Часть 1: Как дед-пчеловод за 5 минут починил пятилетний баг в бэкенде Россельхозбанка

Салют честной ИТ-публике vc.ru от уральского пчеловода! С вами снова Игорь Чернов (КиберДед) из славного города Давлеканово. Пока московские синьоры в модных коворкингах пьют лавандовый раф, жуют безглютеновые круассаны и на созвонах протирают штаны за полмиллиона в месяц, у нас тут, на пасеке, своя суровая инженерия. Для меня что плату сложную под микроскопом перепаять, что матку в улье заменить, что закрутить детективный сюжет — это одна и та же работа с архитектурой. Привык я, понимаешь, видеть четкий «скелет» процесса там, где городские видят только хаос, блокчейн и красивые слайды презентаций.Но сегодня этот мой инженерный взгляд наткнулся на такое цифровое бессилие, что я чуть с печи не грохнулся, а под плинтусом испуганно зашевелились и бросились врассыпную даже видавшие виды тараканы.

Дело было так: продал я, значит, знатный урожай свежего липового медка. Деньги реальные, пахнут воском, солнцем и честным трудом. Решил на старости лет не прятать их в трехлитровую банку под погреб, а пустить в дело, положить «развернуть» — открыть онлайн классический «Свой вклад» в Россельхозбанке. Дело-то копеечное: перевел на карту сумму под расчет (копейка в копейку — 34 010 рублей), выбрал тариф «под замок» — без пополнения, без снятия. Сижу, пчелиный воск топлю, жму кнопку подтверждения. Но стоило мне включить тумблер «Оставлять % на вкладе = Да» (ну, капитализация, все дела), как веб-интерфейс интернет-банка намертво лег и выдал мне кирпич битого кода с позорной ошибкой:«Сумма вклада должна быть не меньше значения неснижаемого остатка».Я четыре часа протирал глаза и смотрел на этот бред. Какая, к лешему, связь между капитализацией процентов и неснижаемым остатком у вклада, который по определению неотзывной? У меня на карте ровно столько, сколько я кладу!

Система РСХБ, видимо, решила, что я должен сдать ей в залог саму пасеку вместе с ульями, чтобы просто оставить проценты на счете. У моих тараканов наступил полный когнитивный диссонанс, они выстроились во фрунт и начали ходить по кругу раздумывая. Полез дед копать прецеденты в «Народном рейтинге» Банки.ру. И тут меня накрыло второй волной: этот баг у них официально задокументирован и висит в топе жалоб еще с 2021 года (привет отзывам № 10520009 и № 10572713)! Пять лет, Карл! Целый ИТ-департамент огромного государственного банка с миллиардными бюджетами на «цифровую трансформацию» пять лет не может исправить копеечный конфликт валидации полей в своей АБС. Они там что, код святой водой кропят вместо дебага?Уровень мыслительной активности тамошних специалистов залег где-то на глубоких ярусах темных мышиных нор, глубоко ниже плинтуса. Кажется, если запустить под этот их цифровой фундамент обычного дождевого червяка, он проявит куда более выдающиеся способности к логическому анализу, чем авторы этого архитектурного чуда. Червяк хотя бы ползет вперед к свету, а местный серверный код годами ходит по кругу впотьмах, путая теплое с мягким.Мне понадобилось ровно пять минут, чтобы отложить стамеску, сесть за комп, расковырять этот папуасский скрипт и написать за их высокооплачиваемых архитекторов готовое серверное решение.Показываю скелет их ошибки: при включении капитализации бэкэнд РСХБ ловит паническую атаку. Он ошибочно дергает пакет лимитов от совершенно другого расходного вклада («Комфортный»), инициализирует пустую переменную, сравнивает этот математический шум с балансом карты-источника и намертво блокирует транзакцию, выплевывая на экран эту дичь про остаток.Специально для ИТ-директора Россельхозбанка, чтобы его сотрудникам в их уютных норах не было слишком больно думать, я публикую первую часть нашего «цифрового фумигатора» на их родной Java. Скопируйте в продакшен и увольте уже тех, кто протирает штаны за резней на работчем месте в стрелялки:

package ru.rshb.dbo.deposits.validation;

import java.math.BigDecimal;

/** * PRODUCTION PATCH FOR RUSSIAN AGRICULTURAL BANK (RSHB) * Core Processor: DepositValidationService * Fixes a 5-year-old architectural flaw in deposit creation logic * Author: Igor Chernov (CyberDed), Davlekanovo */ public class DepositValidationService {

public ValidationResult validateDepositCreation(DepositRequest request, AccountSource cardSource) { BigDecimal depositAmount = request.getAmount(); BigDecimal availableBalance = cardSource.getAvailableBalance(); // ИСПРАВЛЕНИЕ ЛОГИЧЕСКОГО ТУПИКА КИБЕРДЕДОМ: // Если продукт НЕ предусматривает расходные операции (allowWithdrawal == false), // значение minBalance должно ЖЕСТКО приравниваться к ZERO, // даже если включена капитализация процентов (isCapitalization == true)! BigDecimal requiredMinBalance = BigDecimal.ZERO; if (request.getProductOptions().isAllowWithdrawal()) { requiredMinBalance = request.getProductOptions().getMinBalanceLimit(); if (requiredMinBalance == null) { requiredMinBalance = new BigDecimal("10000.00"); // дефолт по тарифу РСХБ } }

// Проверяем исключительно реальную обеспеченность транзакции деньгами if (availableBalance.compareTo(depositAmount) < 0) { return new ValidationResult(false, "ERR_INSUFFICIENT_FUNDS", "Недостаточно средств на счете списания"); }

if (depositAmount.compareTo(BigDecimal.ZERO) <= 0) { return new ValidationResult(false, "ERR_INVALID_AMOUNT", "Сумма должна быть больше нуля"); }

return new ValidationResult(true, null, null); } }

Коллеги, в следующей части мы спустимся еще глубже в эти мышиные норы и я выкачу вторую половину нашего народно-инженерного патча — готовый кусок кода для их базы данных Oracle на PL/SQL, который окончательно вылечит заклинившие триггеры на сервере РСХБ, раз уж их бэкэндеры ушли в глубокую корпоративную спячку.Не переключайтесь, запасайтесь медком и подписывайтесь на деда!