Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Здравствуйте.
Может у кого-нибудь уже есть готовое решение на PL/SQL ?
Буду премного благодарен !!!

автор
*Приложение 12 к Положению Банка России от 19 июня 2012 года N 383-П "О правилах осуществления перевода денежных средств*

ПОРЯДОК
ФОРМИРОВАНИЯ ПОЛУЧАТЕЛЕМ СРЕДСТВ УНИКАЛЬНОГО ИДЕНТИФИКАТОРА
ПЛАТЕЖА И ЕГО КОНТРОЛЯ БАНКОМ ПЛАТЕЛЬЩИКА В СЛУЧАЕ ПЕРЕВОДА
ДЕНЕЖНЫХ СРЕДСТВ НА БАНКОВСКИЙ СЧЕТ ПОЛУЧАТЕЛЯ СРЕДСТВ,
ОТКРЫТЫЙ В ЦЕЛЯХ ИДЕНТИФИКАЦИИ ПЛАТЕЖА

Список изменяющих документов
(введен Указанием Банка России от 29.04.2014 N 3248-У)

1. Получатель средств формирует уникальный идентификатор платежа с учетом следующего: 1 разряд - контрольный ключ, 2 - 25 разряды - информация о платеже (2 - 16 разряды - цифры, 17 - 25 разряды - символы). Если часть символов уникального идентификатора платежа не используется, то свободные знаки обозначаются нулями.
2. Банк плательщика контролирует наличие в распоряжении в реквизите "Код" уникального идентификатора платежа при наличии в реквизите "Сч. N" получателя средств номера банковского счета получателя средств, открытого в целях идентификации платежа.
Банк плательщика контролирует уникальный идентификатор платежа посредством проверки контрольного ключа.
Контрольный ключ рассчитывается с применением 1 - 5 разрядов реквизита "Сч. N" получателя средств и 1 - 16 разрядов реквизита "Код", а также следующих весовых коэффициентов, установленных для каждого разряда:

Номера разрядов 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Коэффициенты 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3

Расчет контрольного ключа осуществляется в следующем порядке:
значение контрольного ключа приравнивается нулю;
рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты;
рассчитывается сумма значений младших разрядов полученных произведений;
младший разряд вычисленной суммы умножается на три;
значение контрольного ключа принимается равным младшему разряду полученного произведения.
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.
3 дек 14, 11:14    [16941984]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9250
напиши через e-mail
3 дек 14, 11:53    [16942303]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9250
Я вот так считаю.
Табличка с символами из спецификации вбита в отдельную табличку
+

  /*
  Один проход вычисления контрольного разряда.
  Параметры:
  p_s - исходная строка
  p_first_weight - начальный вес
  Возврат:
  Число от 0 до 10 (контрольный разряд по модулю 11).
  */
  function CalculateControlDigitInt( p_s varchar2, p_first_weight number ) return number is
    x_ch varchar2(4);
    weight number;
    res number;
    x_val number;
  begin
    res := 0;
    weight := p_first_weight;
    for i in 1 .. length( p_s ) loop
      x_ch := substrc( p_s, i, 1);
      -- Получаем код символа
      select val2 into x_val
        from g_gmp_char_encoding
        where ch = x_ch;
      res := res + x_val * weight;
      -- Меняем вес цифры на следующий
      weight := weight + 1;
      if weight > 10 then
        weight := 1;
      end if;
    end loop;
    -- Делим на 11
    res := res mod 11;
    return res;
  end CalculateControlDigitInt;

  function CalculateControlDigit( p_s varchar2 ) return char is
    digit number;
  begin
    digit := CalculateControlDigitInt( p_s, 1 );
    if ( digit <= 9 ) then
      return chr( ascii('0') + digit );
    end if;
    digit := CalculateControlDigitInt( p_s, 3 );
    if ( digit <= 9 ) then
      return chr( ascii('0') + digit );
    end if;
    return '0';
  end CalculateControlDigit;

  --
  function GetSupplierBillId( p_app_uin varchar2, PL_PAY_UN_ID number ) return varchar2 is
    str varchar2(100);
    digit varchar2(10);
  begin
--    return '1234';
    str := 'Ъ' || lpad( p_app_uin, 6, '0' ) || lpad( trim(to_char(PL_PAY_UN_ID)), 12, '0' );
    digit  := CalculateControlDigit( upper( str ) );
    return str || digit;
  end GetSupplierBillId;
3 дек 14, 12:19    [16942523]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
rv2plus

автор
*Приложение 12 к Положению Банка России от 19 июня 2012 года N 383-П "О правилах осуществления перевода денежных средств*

Расчет контрольного ключа осуществляется в следующем порядке:
значение контрольного ключа приравнивается нулю;
рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты;
рассчитывается сумма значений младших разрядов полученных произведений;
младший разряд вычисленной суммы умножается на три;
значение контрольного ключа принимается равным младшему разряду полученного произведения.
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.
мне одному кажется, что выделенный текст не имеет никакого значения для результата?
3 дек 14, 12:22    [16942550]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9250
Табличка
p.s. что-то я с именами полей очепятался. Ну и бог с ними )))
+

prompt PL/SQL Developer import file
prompt Created on 3 Декабрь 2014 г. by LKudryavtsev
set feedback off
set define off
prompt Dropping G_GMP_CHAR_ENCODING...
drop table G_GMP_CHAR_ENCODING cascade constraints;
prompt Creating G_GMP_CHAR_ENCODING...
create table G_GMP_CHAR_ENCODING
(
ch VARCHAR2(4),
val NUMBER,
val2 NUMBER,
lang VARCHAR2(10)
)
;

prompt Disabling triggers for G_GMP_CHAR_ENCODING...
alter table G_GMP_CHAR_ENCODING disable all triggers;
prompt Loading G_GMP_CHAR_ENCODING...
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('0', 0, 0, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('1', 1, 1, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('2', 2, 2, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('3', 3, 3, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('4', 4, 4, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('5', 5, 5, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('6', 6, 6, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('7', 7, 7, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('8', 8, 8, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('9', 9, 9, 'NUM');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('А', 1, 1, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ц', 22, 2, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Б', 2, 2, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ч', 23, 3, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('В', 3, 3, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ш', 24, 4, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Г', 4, 4, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Щ', 25, 5, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Д', 5, 5, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Э', 26, 6, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Е', 6, 6, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ю', 27, 7, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ж', 7, 7, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Я', 28, 8, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('З', 8, 8, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('И', 9, 9, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('К', 10, 0, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Л', 11, 1, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('М', 12, 2, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ъ', 33, 3, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Н', 13, 3, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('О', 14, 4, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('П', 15, 5, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ы', 36, 6, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Р', 16, 6, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('С', 17, 7, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Т', 18, 8, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('У', 19, 9, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ф', 20, 0, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Х', 21, 1, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Ь', 42, 2, 'RUS');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('A', 1, 1, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('B', 3, 3, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('E', 6, 6, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('D', 29, 9, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('F', 30, 0, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('K', 10, 0, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('G', 31, 1, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('I', 32, 2, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('M', 12, 2, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('J', 33, 3, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('H', 13, 3, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('L', 34, 4, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('O', 14, 4, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('N', 35, 5, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Q', 36, 6, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('P', 16, 6, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('R', 37, 7, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('C', 17, 7, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('S', 38, 8, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('T', 18, 8, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('U', 39, 9, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Y', 19, 9, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('V', 40, 0, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('W', 41, 1, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('X', 21, 1, 'EN');
insert into G_GMP_CHAR_ENCODING (ch, val, val2, lang)
values ('Z', 42, 2, 'EN');
commit;
prompt 67 records loaded
prompt Enabling triggers for G_GMP_CHAR_ENCODING...
alter table G_GMP_CHAR_ENCODING enable all triggers;
set feedback on
set define on
prompt Done.
3 дек 14, 12:23    [16942554]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9250
andreymx
мне одному кажется, что выделенный текст не имеет никакого значения для результата?

Фиг его знает. Я по доке от ГИС ГМП считаю, шлюз пропускает.

Документы же пишутся методом копи-паст+вставить отсебятину+что-нибудь поменять. Что бы от процесса как можно больше людей удовольствие получили.
3 дек 14, 12:29    [16942606]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
123йй
Member

Откуда:
Сообщений: 1637
rv2plus,
и что сложного ?
автор
Номера разрядов 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Коэффициенты 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3 7 1 3 7 3

Расчет контрольного ключа осуществляется в следующем порядке:
значение контрольного ключа приравнивается нулю;
рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты;
рассчитывается сумма значений младших разрядов полученных произведений;
младший разряд вычисленной суммы умножается на три;
значение контрольного ключа принимается равным младшему разряду полученного произведения.

declare
uip varchar2(100) :='656756';
koef varchar2(100) :='3713737137'; 
res number:=0;
begin
  for i in 2..length(uip) loop
    res :=res +mod(substr(koef,i,1)+substr(uip,i,1),10);
  end loop;
  res :=mod(res*3,10);
  if uip=res||substr(uip,2) then
    dbms_output.put_line('ok'); 
  else
    dbms_output.put_line('err ' ||res||substr(uip,2)); 
  end if;     
end; 
3 дек 14, 12:35    [16942656]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
123йй
Member

Откуда:
Сообщений: 1637
+ допилить напильником
3 дек 14, 12:37    [16942677]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
автор
*Приложение 12 к Положению Банка России от 19 июня 2012 года N 383-П "О правилах осуществления перевода денежных средств*

Расчет контрольного ключа осуществляется в следующем порядке:
значение контрольного ключа приравнивается нулю;
рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты;
рассчитывается сумма значений младших разрядов полученных произведений;
младший разряд вычисленной суммы умножается на три;
значение контрольного ключа принимается равным младшему разряду полученного произведения.
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.
ворнинг сработал
3 дек 14, 13:00    [16942902]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
123йй - спасибо!
Добавил 2 раза to_number, умножение вместо сложения и ещё один MOD
Правильно допилил ? (cорри, только начинаю кодить на PL/SQL)

declare
uip varchar2(100) :='656756';
koef varchar2(100) :='3713737137'; 
res number:=0;
begin
  for i in 2..length(uip) loop
    -- рассчитывается сумма значений младших разрядов полученных произведений
    res :=res +mod(to_number(substr(koef,i,1))*to_number(substr(uip,i,1)),10);
  end loop;
  -- младший разряд вычисленной суммы умножается на три
  -- значение контрольного ключа принимается равным младшему разряду полученного произведения
  res :=mod(mod(res,10)*3,10);
  if uip=res||substr(uip,2) then
    dbms_output.put_line('ok'); 
  else
    dbms_output.put_line('err ' ||res||substr(uip,2)); 
  end if;     
end; 


По смыслу вроде верно. Но причём тут это правило проверки ? :
автор
Проверка контрольного ключа осуществляется посредством расчета произведения значений
разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа.
Значение контрольного ключа считается верным при получении суммы, кратной десяти.
3 дек 14, 13:19    [16943118]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
гис гмп юзер
Guest
123йй
и что сложного ?

Там как минимум еще буковки могут быть ))) и английские и русские (что особенно приятно)
3 дек 14, 13:23    [16943166]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
andreymx,
Первый ворнинг не нужен ибо умножаем вес на ноль и сумма не изменится.
Для фиксации второго ворнинга добавил ещё один мод.
Не могу понять зачем нужно правило проверки, ведь мы уже знаем контрольный ключ из первой позиции 25-и значного УИП.
автор
Проверка контрольного ключа осуществляется посредством расчета произведения значений разрядов на соответствующие весовые коэффициенты с учетом значения контрольного ключа. Значение контрольного ключа считается верным при получении суммы, кратной десяти.
3 дек 14, 13:24    [16943179]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
гис гмп юзер,
Букв быть не может т.к. контрольный ключ рассчитывается с применением 1 - 5 разрядов реквизита "Сч. N" получателя средств и 1 - 16 разрядов реквизита "Код".
Есть у кого пример 25-и значного УИП и счета получателя ?
3 дек 14, 13:28    [16943220]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Хочется проверить ключ (первая позиция в УИП). Насколько я понимаю счет получателя всегда 40822 и для проверки ключа в УИП нужен только его балансовый номер второго порядка == 40822 всегда ?
3 дек 14, 13:31    [16943252]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
Leonid Kudryavtsev,

Насколько я понимаю, уникальный 20-и значный идентификатор начисления УИН не равен
уникальному 25-и значному идентификатору платежа УИП. Ваш код не подойдёт в данной ситуации,
но всё равно агромное спасибо !
3 дек 14, 13:37    [16943299]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
леонид_кудрявцев
Guest
rv2plus
Насколько я понимаю, уникальный 20-и значный идентификатор начисления УИН не равен
уникальному 25-и значному идентификатору платежа УИП. Ваш код не подойдёт в данной ситуации,

Сорри. Давно делал. Плюс форум читаю одним глазом, втарым селекты в БД пишу
3 дек 14, 13:40    [16943314]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
123йй
Member

Откуда:
Сообщений: 1637
автор
и ещё один MOD

а что он дает? бершь калькулятор и считаешь
младший разряд например 54*3, 4*3, 100504*3 есть разница ?
3 дек 14, 13:40    [16943320]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
123йй, логично !
А про правило проверки можете что-нибудь сказать ?
Нафига оно там так пространно и непонятно расписано ?
Примерчик УИП-а для проверки не найдётся ? :)
3 дек 14, 13:47    [16943348]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
123йй,

УРА !!! Родил первую программу на PL/SQL !!!

CREATE OR REPLACE FUNCTION IsUIPCorrect(acc IN varchar2, uip IN varchar2) RETURN boolean IS
-- весовые коэффициенты 371373713737137371373
str VARCHAR2(21);
v_k varchar2(21):=RPAD('37137', LENGTH('37137') * 4, '37137')||'3';
key INTEGER:=0;
i integer;
BEGIN
-- 1) значение контрольного ключа приравнивается нулю
str:=SUBSTR(TRIM(acc), 1, 5)||'0'||SUBSTR(TRIM(uip), 2, 15);
FOR i IN 1 .. 21 LOOP
	-- 2) рассчитываются произведения значений разрядов на соответствующие весовые коэффициенты
	-- 3) рассчитывается сумма значений младших разрядов полученных произведений
	key:=key + MOD(TO_NUMBER(SUBSTR(str, i, 1)) * TO_NUMBER(SUBSTR(v_k, i, 1)), 10);
END LOOP;
-- 4) младший разряд вычисленной суммы умножается на три
-- 5) значение контрольного ключа принимается равным младшему разряду полученного произведения
key:= MOD(key * 3, 10);
RETURN uip=key||SUBSTR(uip,2);
END IsUIPCorrect;
3 дек 14, 13:50    [16943359]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
123йй
Member

Откуда:
Сообщений: 1637
rv2plus
123йй, логично !
А про правило проверки можете что-нибудь сказать ?
Нафига оно там так пространно и непонятно расписано ?
Примерчик УИП-а для проверки не найдётся ? :)

нет
нет
нет :)
все только из вашей задачи.
посмотри похожую задачу на ключевание счета (9 знак)
если верить этому
то УИН=УИП
3 дек 14, 13:56    [16943386]     Ответить | Цитировать Сообщить модератору
 Re: Как проконтролировать двадцатипятизначный УИП в платежке  [new]
rv2plus
Member

Откуда:
Сообщений: 28
[quot 123йй]
rv2plus
123йй, логично !
все только из вашей задачи.
посмотри похожую задачу на ключевание счета (9 знак)
если верить этому то УИН=УИП


очень обрадовался что задачу понял как и Вы
ключевание счета смотрел конечно потому и не понял пространный алгоритм проверки
imho этому верить нельзя ибо у них разрядность разная (20#25)
3 дек 14, 14:10    [16943458]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить