//Exchange #2286
function CheckPayOrder_PermKray: Boolean;
var
  sql: String;
  Xml: Variant;
  i: Integer;
  Unclassified, {isOneMask, }ls1_flag, ls2_flag: Boolean;
  xPi_Budget_Code: string;
begin

    try
      Result := False;

      if NOT vIsAzkVersion2_26_46_11 then begin
        CDSListField_Message('Модуль проверки работает начиная с версии АЦК-Финансы 2.26.46.11');
        Exit;
      end;

      if NOT DoCheckRecAccountGeneral then EXIT;

      CDSListField_Enroll( NULL);

      //устанавливаем флаг неклассифицированных поступлений
      Unclassified := False;

      //определяет Id получателя из выписки
      if NOT DoCheckOrg( Unclassified) then EXIT;

      //лс
      if (not Unclassified) then// begin
        //Определяем список лицевых счетов открытых на б/с счете получателя 24 класса
        if NOT DoSearchOrgAccount( {Xml, }1, 3, Unclassified)
          then EXIT;

      //инициализирует значения отраслевого кода, косгу и кода субсидии
      CDSListField_Industrycode_Id( '');
      CDSListField_Industry_Code( '');
      CDSListField_Kesr_Code( '');

      // сброс полей описания кода субсидии
      DoResetGrantInvestment;//( cds);

      //устанавливает флаг лс, содержащиего во втором разряде 1
      ls1_flag := Copy( CDSListField_LS_Number_Get, 2, 1) = '1';
      //устанавливает флаг лс, содержащиего во втором разряде 2
      ls2_flag := Copy( CDSListField_LS_Number_Get, 2, 1) = '2';

      // exchange #2758
      // если поле Идентификатора платежа (104 поле) не заполнено
      // или имеет значение «0», то косгу и отр.код берем из Назначения платежа.
      // поэтому, тут проверяем, если в идентификаторе платежа указана строка "0"
      // то это считаем за пустую строку.
      xPi_Budget_Code := CDSListField_Pi_Budget_Code_Get;
      if (xPi_Budget_Code = '0')
        then xPi_Budget_Code := '';

      //получает отраслевой код и КОСГУ
      if not Unclassified then begin
        if (xPi_Budget_Code <> '') then begin
          CDSListField_Industry_Code( Copy(xPi_Budget_Code, 1, 17));
          CDSListField_Kesr_Code( Copy(xPi_Budget_Code, 18, 3));
        end else begin //104 поле не заполнено
          if not ls2_flag then begin
            if not isParceDescription_PermKray( 'косгу', True) then
            begin
              CDSListField_Message(
                        'Не удалось получить КОСГУ из назначения платежа');
              Unclassified := True;
            end;
          end else begin
            //получает отраслевой код и косгу из назначения
            if not isParceDescription_PermKray( 'отр.код') then begin
              CDSListField_Message(
                    'Не удалось получить отраслевой код и КОСГУ из назначения'
                   +' платежа');
              Unclassified := True;
            end;
          end;
        end;
      end;

      //получает код субсидии
      if not Unclassified then begin
        if ls1_flag then begin
          if not isParceDescription_PermKray( 'код субсидии') then begin
            CDSListField_Message('Не удалось получить код субсидии из назначения платежа');
            Unclassified := True;
          end else begin
            if StringReplace(CDSListField_GrantInvestment_Code_Get, '0', '') = ''
              then begin
                CDSListField_Message('В назначении платежа указан нулевой код субсидии');
                Unclassified := True;
              end;
          end;
        end else begin
          // подставляем описание системного кода субсидии и инвестиции
          // ("не указан")}
          DoGrantInvestmentSetSystem;//( cds);
        end;
      end;

      //проверяет полученный косгу
      // exchange #2627 - расширенная проверка КОСГУ с учетом символьных КБК
      if not Unclassified then
        if NOT CheckKES
          then Unclassified := TRUE;

      //проверка кода субсидии
      // exchange #2365
      if (not Unclassified) then
        if DoGrantInvestmentValidate//( cds)
          then Unclassified := True;

      //проверяет полученный отраслевой код
      if (not Unclassified) and (ls2_flag) then begin
        if (CDSListField_Industry_Code_Get <> '') then begin
          // exchange #2667 и #2666 исправлен поиск отр.кода.
          if NOT CheckIndustryCode//( cds)
            then Unclassified := True;
        end else begin
          CDSListField_Message('Не удалось получить отраслевой код');
          Unclassified := True;
        end;
      end;

      //квфо
      if not Unclassified then begin
        if NOT DoSearchMatchLS_PermKray( ls2_flag, Unclassified)
          then EXIT;
      end;

      //формирование данных неклассифицированых поступлений
      if Unclassified then begin
        if NOT DoUnclassified then EXIT;
        Result := True;
      end else begin
        DoCheckOk;
        Result := True;
      end;
      except
        ExceptionProc( 'CheckPayOrder_PermKray');
    end;

end;
{------------------------------------------------------------------------------}
//разбирает основание платежа.
//параметры:
//cds - набор данных
//keyword - ключевое слово
//MustBeSpace - должен быть пробел между ключевым словом и значением
//если в основании платежа не встречаются ключевые слова или встречаются более
//одного раза то False. В зависимости от ключевого слова заполняются поля в наборе
//данных
function isParceDescription_PermKray( aKeyword: String;
                                      aMustBeSpace: Boolean = True): Boolean;
begin

    try
      Result := ParceDescriptionCDS( aKeyword, aMustBeSpace);
      except
        ExceptionProc( 'isParceDescription_PermKray');
    end;

end;
{------------------------------------------------------------------------------}
function DoSearchMatchLS_PermKray( aLs2_flag: boolean;
                                   var aUnclassified: boolean): boolean;
var
  sql: String;
  xXml: Variant;
  i: Integer;
  isOneMask: boolean;
begin

    try
      Result := FALSE;

      //проверяем найденные счет и отраслевой код подпадает под маски
      sql := 'Select Accountnumber_Mask, Industrycode_Mask, Fsr_Id'
            +' From AubuclassifiersRules'
            // exchange #2872 - добавлен бюджет в запрос
            +' where BUDGET_ID=? ';

      Query.AddStr( CDSListField_Budget_Id_Get);    // #2872

      if CDSListField_Grantinvestment_Code_Get <> '0' then begin
        sql := sql + ' and GrantinvestmentType = ?';
        Query.AddStr( CDSListField_Grantinvestment_Type_Get);
      end;

      xXml := vXML_Doc;// CreateOleObject('Microsoft.XmlDom');
      xXml.LoadXML(Query.Run(sql));

      xXml := xXml.documentElement;
      isOneMask := False;
      for i := 0 to xXml.childNodes.Length - 1 do begin
        xXml := xXml.childNodes.Item[i];
        if not aLs2_flag then begin
          if (MatchesMask( CDSListField_LS_Number_Get,
                           xXml.getAttribute('ACCOUNTNUMBER_MASK'))) then
            if not isOneMask then begin
              isOneMask := True;
              CDSListField_Fsr_Id( xXml.getAttribute('FSR_ID'));
            end else begin
              isOneMask := False;
              CDSListField_Message(
                    'Маска счета не совпадает с правилом соответствия'
                   +' классификаторов');
              Break;
            end;
        end else begin
          if      (MatchesMask( CDSListField_LS_Number_Get,
                                xXml.getAttribute('ACCOUNTNUMBER_MASK')))
              and (MatchesMask( CDSListField_Industry_Code_Get,
                                xXml.getAttribute('INDUSTRYCODE_MASK'))) then
            if not isOneMask then begin
              isOneMask := True;
              CDSListField_Fsr_Id( xXml.getAttribute('FSR_ID'));
            end else begin
              isOneMask := False;
              CDSListField_Message(
                  'Маски счета и отраслевого кода не совпадают с правилом'
                 +' соответствия классификаторов');
              Break;
            end;
        end;
        xXml := xXml.parentNode;
      end;//for//

      aUnclassified := (not isOneMask);
      if aUnclassified then begin
        if (CDSListField_Grantinvestment_Code_Get <> '0')
          then CDSListField_Message(
                      'Не найдены правила соответствия классификаторов'
                     +' по типу Кода субсидии или маска счета не совпадает'
                     +' с полученными правилами')
          else CDSListField_Message(
                      'Не найдены правила соответствия классификаторов'
                     +' или маска счета не совпадает с полученными правилами');
      end;

      Result := TRUE;
      except
        ExceptionProc( 'DoSearchMatchLS_PermKray');
    end;

end;


begin
end.
