среда, 29 июня 2016 г.

Проверка контрольного разряда Единого лицевого счета (ЕЛС) ГИС ЖКХ

С 1 июля 2016 года вроде как уже должна быть внедрена отправка данных в ГИС ЖКХ для организаций, осуществляющих прием платежей за ЖКХ, согласно приказу Минкомсвязи России № 589, Минстроя России № 944/пр от 28.12.2015 "Об утверждении порядка и способов размещения информации". Идея хорошая, а реализация какой будет - посмотрим. Пока что вот реализация алгоритма проверки контрольного разряда Единого лицевого счета (далее ЕЛС).

Описание алгоритма можно найти на  http://dom.gosuslugi.ru/#/regulations?userCtgrCode=1 документ называется Алгоритм проверки контрольного разряда ЕЛС, а вот этот Структура идентификаторов в ГИС ЖКХ смотреть не надо, он уже устарел, там неправильный пример ЕЛС (75да533315) и неверная оценка общего количества идентификаторов (7 млрд).
Я скопирую правильный на текущий момент текст сюда на всякий случай:       

Алгоритм проверки контрольного разряда ЕЛС
   
     Система формирует строку длиной 10 символов, содержащую:
     1-ый разряд (контрольная сумма) не заполняется;
     2-ой разряд – содержит только цифры «0»-«9»;
     3-ий и 4-ый разряды – используются только следующие кириллические символы: «А», «В», «Е», «К», «М», «Н», «О», «Р», «С», «Т», «У», «Х»;
     С 5-го по 10-ый разряды – содержит только цифры «0»-«9».

     После генерации строки номера ЕЛС со 2-го по 10-ый символ система рассчитывает контрольную сумму следующим образом:
  •      Каждый кириллический символ из ЕЛС должен быть приведен к числовому виду, для этого необходимо код символа в кодировке UTF-8 перевести из двоичного представления в десятичное;
  •      Каждая цифра из ЕЛС или число, соответствующее кириллическому символу из ЕЛС, умножается на номер своей позиции в номере ЕЛС, при этом позиции отсчитываются с конца номера – справа налево;
  •      Полученные произведения суммируются;
  •      Полученная сумма делится на 10;
Остаток от деления является контрольной суммой.
Хотя бы в этот раз они не сделали смесь русских и английских букв, как в номерах штрафов ГИБДД. Но все равно, наличие букв непонятно, их всего 12, и дает минимальное увеличение номерной емкости по сравнению с цифрами.

Процедура проверки контрольного разряда ЕЛС на java
public static boolean checkELS(String els) {
   if (els == null || els.length() != 10) {
      return false;
   }
   if (!StringUtils.containsOnly(els.substring(2, 4), "ХАКЕРСТВОМНУ")) { // АВЕКМНОРСТУХ  
      logger.debug("wrong symbols in positions 2-3");
      return false;
   }
   if (!StringUtils.isNumeric(els.substring(0, 2)) || !StringUtils.isNumeric(els.substring(4))) {
      logger.debug("non-numeric symbol");
      return false;
   }
   int sum = 0;
   for (int i = 1; i < els.length(); i++) {
      if (i == 2 || i == 3) {
         sum += els.codePointAt(i) * (els.length() - i);
      } else {
         sum += Integer.parseInt(els.substring(i, i + 1)) * (els.length() - i);
      }
   }
   return sum % 10 == Integer.parseInt(els.substring(0, 1));
}

номер для проверки: 50АА007748
можно конечно проверки делать с помощью regexp вида ^\d{2}[АВЕКМНОРСТУХ]{2}\d{6}$