Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату

Проверка статуса контрагента, проверяем ИНН/КПП на дату через SOAP-интерфейс на сайте Федеральной налоговой службы. Версия 2 по состоянию на 27.04.2017 г. работает в тестовом режиме.
* ==============================================================================================================================  
 * Автор:            vic119, Alex Roublev (доработка), Igor Korolyov (верификация, доработка), SSA (верификация, доработка)  
 * Дата:             10.12.2014, 27.04.2017  
 * Описание:         статус ИНН/КПП на дату  
 *                   проверка контрагента через SOAP-интерфейс на сайте Федеральной налоговой службы https://npchk.nalog.ru/  
 * Документация:     https://npchk.nalog.ru/ws2.doc  
 *  
 * Примечание:       на 27.04.2017 на сайте ФНС сервис работает в тестовом режиме  
 *  
 * Доп. информация:  Использование WEB сервиса для проверки ИНН/КПП контрагента: http://infostart.ru/public/439808/  
 *                   Обсуждение на форуме Foxclub: http://forum.foxclub.ru/read.php?29,645686  
 *  
 * Библиотека:       используется библиотека Microsoft XML Core Service версия 6 SP3 (msxml6.dll)  
 *                   альтернатива - MSXML версия 4 SP2 (msxml4.dll) с вызовом объекта класса Msxml2.XMLHTTP.4.0  
 *                   описание версий https://support.microsoft.com/ru-ru/help/269238/list-of-microsoft-xml-parser-msxml-versions  
 *  
 * Параметры:  
 *                   tcInn  - ИНН контрагента  
 *                   tcKpp  - КПП контрагента  
 *                   tcDate - дата, на которую проверяем в строковом формате 'дд.мм.гггг'  
 *  
 * Возврат:          строка с описанием статуса проверки  
 * =============================================================================================================================  
  #DEFINE TIME_LIMIT    30 && лимит времени при обращении к сайту ФНС (для выхода из цикла)  
    
  CLEAR  
    
  LOCAL lcInn AS STRING, lcKpp AS STRING, ldDate AS DATE  
    
  lcInn = '6441012385'  
  lcKpp = '583601001'  
  ldDate = {^2014.12.08}  
    
  LOCAL ARRAY vaState(1,2)  
    
  vaState(1,1) = '-1'  
  vaState(1,2) = ''  
    
  Check_INN_KPP(m.lcInn, m.lcKpp, m.ldDate, @vaState)  
    
  ?Check_Status_INN_KPP(@vaState)  
    
  FUNCTION Check_INN_KPP()  
    
      LPARAMETERS tcInn AS STRING, tcKpp AS STRING, tdDate AS DATE, vaState  
    
      LOCAL ;  
          loHttp AS 'Msxml2.XMLHTTP.6.0', ; && класс объекта для работы с SOAP-интерфейсом на сайте ФНС  
          loError AS OBJECT, ; && объект для записи сообщения об ошибке  
          lcRequest AS STRING, ; && xml-данные для запроса статуса контрагента  
          ltTimeout AS DATETIME && время перед началом выполнения опроса сайта в цикле  
    
     ****************************************  
     * проверка корректности ввода параметров  
    
      DO CASE  
          CASE PCOUNT() < 3  
              tdDate = DATE()  
          CASE PCOUNT() < 2  
              tcKpp = ''  
          CASE PCOUNT() < 1  
              tcInn = ''  
      ENDCASE  
    
      DO CASE  
          CASE EMPTY(tcInn)  
              vaState(1,2) = 'не заполнен номер ИНН.'  
              RETURN  
          CASE TYPE('tcInn') <> 'C' OR LEN(CHRTRAN(tcInn, "0123456789", "")) > 0  
              vaState(1,2) = 'некорректно заполнен номер ИНН.'  
              RETURN  
      ENDCASE  
    
      DO CASE  
          CASE LEN(tcInn) = 10 && юр. лицо  
              DO CASE  
                  CASE EMPTY(tcKpp)  
                      vaState(1,2) = 'не заполнен обязательный для юр. лица номер КПП.'  
                      RETURN  
                  CASE TYPE('tcKpp') <> 'C' OR LEN(tcKpp) <> 9 OR LEN(CHRTRAN(tcKpp, "0123456789", "")) > 0  
                      vaState(1,2) = 'некорректно заполнен обязательный для юр. лица номер КПП.'  
                      RETURN  
              ENDCASE  
          CASE LEN(tcInn) = 12 && индивид. предприниматель  
              IF !EMPTY(tcKpp)  
                  vaState(1,2) = 'номер КПП не указывается для ИП.'  
                  RETURN  
              ENDIF  
      ENDCASE  
    
      DO CASE  
          CASE EMPTY(tdDate)  
              vaState(1,2) = 'не заполнена дата.'  
              RETURN  
          CASE TYPE('tdDate') <> 'D'  
              vaState(1,2) = 'некорректно заполнена дата.'  
              RETURN  
      ENDCASE  
    
     ****************************************  
    
      TEXT TO lcRequest TEXTMERGE PRETEXT 1 + 2 NOSHOW  
      <?xml version="1.0" encoding="UTF-8"?>  
      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:req="http://ws.unisoft/FNSNDSCAWS2/Request">  
          <soapenv:Header/>  
              <soapenv:Body>  
                  <req:NdsRequest2>  
                      <req:NP INN="<<tcInn>>" KPP="<<tcKpp>>" DT="<<Transform(Day(tdDate), '@L 99')>>.<<Transform(Month(tdDate), '@L 99')>>.<<Transform(Year(tdDate), '9999')>>"/>  
                  </req:NdsRequest2>  
              </soapenv:Body>  
      </soapenv:Envelope>  
      ENDTEXT  
    
      TRY  
    
          loHttp = CREATEOBJECT('Msxml2.XMLHTTP.6.0')  
    
          WITH m.loHttp  
              .OPEN('POST', 'http://npchk.nalog.ru/FNSNDSCAWS_2?wsdl', .F.)  
              .setRequestHeader('Content-Type', 'text/xml; charset=utf-8')  
              .setRequestHeader('Content-length', TRANSFORM(LEN(lcRequest)))  
              .Send(m.lcRequest)  
    
              ltTimeout = DATETIME() + TIME_LIMIT  
    
             * опрашиваем данные до тех пор, пока не будет получен ответ или не исчерпается лимит времени  
              DO WHILE .ReadyState <> 4  
                  DOEVENTS FORCE  
                  IF DATETIME() > m.ltTimeout  
                      EXIT  
                  ENDIF  
                  INKEY(0.5)  
              ENDDO  
    
              IF .STATUS = 200 && ответ был получен  
                  WITH .responseXML  
                      .setProperty('SelectionNamespaces', 'xmlns:rsp="http://ws.unisoft/FNSNDSCAWS2/Response"')  
                      vaState(1,1) = .selectSingleNode("//rsp:NdsResponse2/rsp:NP/@State").nodeValue && статус контрагента  
                  ENDWITH  
              ELSE  
                  vaState(1,2) = 'ответ не получен, код ' + TRANSFORM(.STATUS) + ', ' + .StatusText + '.'  
              ENDIF  
          ENDWITH  
    
      CATCH TO loError  
          vaState(1,2) = 'Cтрока ' + TRANSFORM(loError.LINENO) + ', ' + loError.MESSAGE  
      ENDTRY  
    
  ENDFUNC  
    
  FUNCTION Check_Status_INN_KPP()  
    
      LPARAMETERS vaState  
    
      LOCAL lnState AS INTEGER, lcError AS STRING  
    
      lnState = CAST(vaState(1, 1) AS I)  
      lcError = vaState(1, 2)  
    
      RETURN ICASE ;  
          (;  
              m.lnState = -1, 'Данные контрагента не обработаны' + IIF(!EMPTY(lcError), ': ' + lcError, ''), ;  
              m.lnState =  0, 'Налогоплательщик зарегистрирован в ЕГРН и имел статус действующего в указанную дату', ;  
              m.lnState =  1, 'Налогоплательщик зарегистрирован в ЕГРН, но не имел статус действующего в указанную дату', ;  
              m.lnState =  2, 'Налогоплательщик зарегистрирован в ЕГРН', ;  
              m.lnState =  3, 'Налогоплательщик с указанным ИНН зарегистрирован в ЕГРН, КПП не соответствует ИНН или не указан', ;  
              m.lnState =  4, 'Налогоплательщик с указанным ИНН не зарегистрирован в ЕГРН', ;  
              m.lnState =  5, 'Некорректный ИНН', ;  
              m.lnState =  6, 'Недопустимое количество символов ИНН', ;  
              m.lnState =  7, 'Недопустимое количество символов КПП', ;  
              m.lnState =  8, 'Недопустимые символы в ИНН', ;  
              m.lnState =  9, 'Недопустимые символы в КПП', ;  
              m.lnState = 10, 'КПП не должен использоваться при проверке ИП', ;  
              m.lnState = 11, 'Некорректный формат даты', ;  
              m.lnState = 12, 'Некорректная дата (ранее 01.01.1991 или позднее текущей даты)', ;  
              'Сатус контрагента не определен (' + TRANSFORM(m.lnState) + ')' ;  
          )  
  ENDFUNC
Автор: vic119, Alex Roublev (доработка)
0

Автор публикации

не в сети 19 лет

Alex Roublev

0
Комментарии: 0Публикации: 3Регистрация: 28-09-2002
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 2,00 КБ 698check_counteragent
Оставить комментарий
Авторизация
*
*
Генерация пароля