//Exchange #2285
function CheckPayOrder_KrasnoyarskKray: Boolean;
var
  begin_acc: String;
  Xml: Variant;
//  i: Integer;
  Unclassified, isOneMask, specacc_flag, ls_7585: 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;

      begin_acc := Copy(CDSListField_Pay_Account_Get, 1, 5);
      specacc_flag :=    (begin_acc = '40204')
                      or (begin_acc = '40201')
                      or (begin_acc = '40116')
                      or (begin_acc = '40601')
                      or (begin_acc = '40701');

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

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

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

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

      //установка флага лс начинающихся на 75 и 85
      if (not Unclassified) then begin
        ls_7585 :=      (not specacc_flag)
                    and (Copy( CDSListField_LS_Number_Get, 1, 2) in ['75', '85']);

      end;

      // 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) and (xPi_Budget_Code <> '') then begin
        //получает отраслевой код и КОСГУ
        CDSListField_Industry_Code( Copy(xPi_Budget_Code, 1, 17));
        CDSListField_Kesr_Code( Copy(xPi_Budget_Code, 18, 3));
        if CDSListField_Industry_Code_Get = '00000000000000000' then
          if specacc_flag then begin
            CDSListField_Message('Указан неопределенный отраслевой код: 00000000000000000');
            Unclassified := True;
          end else begin
            CDSListField_Message('Указан неопределенный отраслевой код: 00000000000000000');
            Exit;
          end;
      end else
        //104 поле не заполнено
        if (not Unclassified) and (xPi_Budget_Code = '') then begin
          //получает отраслевой код и косгу
          if ls_7585 then begin
            //получает отраслевой код из правил соответсвий по счету
            Query.AddStr( CDSListField_Ls_Number_Get);

            Xml := CreateOleObject('Microsoft.XmlDom');
            Xml.LoadXML(
                Query.Run(
                    ' Select Industrycode_Mask, Fsr_Id'
                   +' From AubuclassifiersRules'
                   +' Where Accountnumber_Mask = ?'));

            if Xml.documentElement.childNodes.Length = 1 then begin
              CDSListField_Industry_Code(
                 Xml.documentElement.childNodes.Item[0].getAttribute('INDUSTRYCODE_MASK'));
              CDSListField_Kesr_Code( '130');
            end else begin
              CDSListField_Message(
                    'Не получен отраслевой код в правилах соответствий по счету '
                   +CDSListField_Ls_Number_Get);
              Exit;
            end;
          end else begin
            if not isParceDescription_KrasnoyarskKray( 'отр.код') then begin
              CDSListField_Message(
                  'Не удалось получить отраслевой код и КОСГУ из назначения платежа');
              if specacc_flag
                then Unclassified := True
                else Exit;
            end else begin
              if CDSListField_Industry_Code_Get = '00000000000000000' then begin
                CDSListField_Message('Указан неопределенный отраслевой код: 00000000000000000');
                if specacc_flag
                  then Unclassified := True
                  else Exit;
              end;
            end;
          end;
        end else
          Unclassified := True;



      //получает код субсидии
      if (not Unclassified) then
      begin
        if specacc_flag then begin
          if (Copy(CDSListField_Ls_Number_Get, 2, 1) in ['1', '2', '3']) then begin
            // exchange #2709
            // при поиске кода субсидии учитываем длину кода по маске.
            if not isParceDescription_KrasnoyarskKray( 'код субсидии')
              then begin
                CDSListField_Message(
                    'Не удалось получить код субсидии из назначения платежа');
                Unclassified := True;
              end;
          end else begin
            DoGrantInvestmentSetSystem;
          end;
        end else begin
          DoGrantInvestmentSetSystem;
        end;
      end;

      //проверяет полученные значения
      //код субсидии
      if (not Unclassified) then
        if DoGrantInvestmentValidate( TRUE)
          then Unclassified := True;

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

      //косгу
      // exchange #2627 - расширенная проверка КОСГУ с учетом символьных КБК
      // если косгу не указан, он будет заменен на системный код 0.
      // если указанный код не будет найден и если включена ls_7585,
      // то в код КОСГУ подставляется на 130 (с поиском).
      if not Unclassified then
        if NOT CheckKES then
          if specacc_flag
            then Unclassified := TRUE
            else
          if NOT ls_7585
            then EXIT
            else begin
              CDSListField_Kesr_Code( '130');
              if NOT CheckKES//( cds)
                then Unclassified := TRUE;
            end;

      //проверяет присутсвие косгу в базе и делает подмены по постановке
      // exchange #2627 - расширенная проверка КОСГУ с учетом символьных КБК
      // тут проверяем, если КОСГУ указан как системный код, то проверяется
      // роль получателя из выписки и т.д. по старому коду
      if (not Unclassified) then
        if (CDSListField_Kesr_Code_Get
                          = FormatKbk( 'KES', '0', CDSListField_Budget_Id_Get))
          then begin
            //проверяет роль получателя из выписки
            Query.AddStr( CDSListField_Org_Id_Get);

            Xml := CreateOleObject('Microsoft.XmlDom');
            Xml.LoadXML(
                Query.Run(
                     'Select OrgRole_Id From OrgRoles'
                    +' Where Org_Id = ? and OrgRole_Id in (18, 19)'));

            Xml := Xml.documentElement;
            if (Xml.childNodes.Length = 1)
                 and (Xml.childNodes.Item[0].getAttribute('ORGROLE_ID') = 19)
              then begin
                // заполняем и проверяем указанный код
                CDSListField_Kesr_Code( '999');
                if NOT CheckKES then
                  if specacc_flag
                    then Unclassified := TRUE
                    else EXIT;
              end else begin
                CDSListField_Message(
                      'Получатель из выписки не является автономным учреждением'
                     +' или имеет две роли АУ и БУ');
                if specacc_flag
                  then Unclassified := True
                  else Exit;
              end;
          end;

      //КВФО
      if not Unclassified then
        // Exchange #2364
        if DoSearchMatchLS_KrasnoyarskKray//( cds)
          then Unclassified := TRUE;

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

end; {End CheckPayOrder}
{------------------------------------------------------------------------------}
{~isParceDescription_KrasnoyarskKray
  разбирает основание платежа.
  параметры:
    cds - набор данных
    keyword - ключевое слово

  если в основании платежа не встречаются ключевые слова или встречаются более
  одного раза то False.
  В зависимости от ключевого слова заполняются поля в наборе данных

   exchange #2709
  дорабатывается разбор кода субсидии.
  при поиске кода субсидии учитываем длину кода по маске.}
function isParceDescription_KrasnoyarskKray( aKeyword: String): Boolean;
begin

    try
      if (aKeyword = 'код субсидии')
        then Result := ParceDescriptionCDS(
                               // cds,
                                '#2709',   // поиск по новому алгоритму
                                TRUE,
                                // получаем 0-й код выровненный по маске
                                // без разделителей (точек).
                                GetMaskGrantInvestmentCode(
                                          '0',
                                          CDSListField_Budget_Id_Get{cds.FieldByName('Budget_Id').AsString}))
        else Result := ParceDescriptionCDS( {cds,} aKeyword, TRUE);

      except
        ExceptionProc( 'isParceDescription_KrasnoyarskKray');
    end;

end;
{------------------------------------------------------------------------------}
{~DoSearchMatchLS_KrasnoyarskKray
  возвращает =true, если л/с не найден по маске.
  в этом случае ЭД нужно ставить на невыясненный.}
function DoSearchMatchLS_KrasnoyarskKray: boolean;
  {----------------------------------------------------------------------------}
  function DoSearchMatchLS_( aSQLResult: string): boolean;
  var
    xXml: Variant;
    xRootXml: Variant;
    xNodeXml: Variant;
    i: integer;
  begin

      try
        Result := FALSE;
        xXml := vXML_Doc;//  CreateOleObject('Microsoft.XmlDom');
        xXml.LoadXML( aSQLResult);
        xRootXml := xXml.documentElement;
        for i := 0 to xRootXml.childNodes.Length - 1 do begin
          xNodeXml := xRootXml.childNodes.Item[i];
          if CDSListField_Industrycode_Id_Get{cds.FieldByName('Industrycode_Id').AsString }= '' then begin
            if ( MatchesMask( CDSListField_LS_Number_Get{cds.FieldByName('LS_Number').asString},
                              xNodeXml.getAttribute('ACCOUNTNUMBER_MASK'))) then
              if not Result then begin
                Result := True;
                CDSListField_Fsr_Id( xNodeXml.getAttribute('FSR_ID'));
                {
                cds.Edit;
                cds.FieldByName('Fsr_Id').AsString := xNodeXml.getAttribute('FSR_ID');
                cds.Post;
                }
              end else begin
                Result := False;
                CDSListField_Message( {cds, }'Маска счета не совпадает с правилом соответствия классификаторов');
                Break;
              end;
          end else begin
            if ( MatchesMask( CDSListField_LS_Number_Get{cds.FieldByName('LS_Number').asString},
                              xNodeXml.getAttribute('ACCOUNTNUMBER_MASK'))
                and
                 MatchesMask( CDSListField_Industry_Code_Get{cds.FieldByName('Industry_Code').asString},
                              xNodeXml.getAttribute('INDUSTRYCODE_MASK'))) then
              if not Result then begin
                Result := True;
                CDSListField_Fsr_Id( xNodeXml.getAttribute('FSR_ID'));
                {
                cds.Edit;
                cds.FieldByName('Fsr_Id').AsString := xNodeXml.getAttribute('FSR_ID');
                cds.Post;
                }
              end else begin
                Result := False;
                CDSListField_Message( {cds,} 'Маски счета и отраслевого кода не совпадают с правилом' +
                  ' соответствия классификаторов');
                Break;
              end;
          end;
        end;//for//
        except
          ExceptionProc( 'DoSearchMatchLS_');
      end;

  end;
  {----------------------------------------------------------------------------}
var
  sql: string;
  xFlag: boolean;
  isOneMask: boolean;
begin

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

      { Exchange #2364
        Если код субсидии для строки  заполняется  значением, отличным от
        системного 0 «Не указан» (Код «0», наименование «Не указан»,
        Учредитель «Не указан», тип «Не указан»)}
      xFlag := FALSE;   // алгоритм 2
      if NOT DoGrantInvestmentCodeIsSystem then
        { если в поле «Тип субсидии» (GRANTINVESTMENTTYPE) которых указан тип,
          отличный от «Не указан» (3) - алгоритм 1}
        if ( CDSListField_Grantinvestment_Type_Get <> '3')
          then xFlag := TRUE;   // алгоритм 1

      if xFlag then begin
        // алгоритм 1
        Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
        Query.AddStr( CDSListField_Grantinvestment_Type_Get);
        isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType = ?'));
      end else begin
        { алгоритм 2
          1)	Выбираются все правила, у которых в поле «Тип субсидии»
          (GRANTINVESTMENTTYPE) указан код с типом 3 «Не указан»}
        Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
        isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType = 3'));
        { 4)	Если, в результате выполнения пунктов 1-3 Алгоритма2 не было
          найдено подходящее правило, то пункты 2 и 3 Алгоритма2 выполняются
          для правил, у которых в поле «Тип субсидии» (GRANTINVESTMENTTYPE)
          указаны коды с типами 0, 1, 2.}
        if NOT isOneMask then begin
          Query.AddStr( CDSListField_Budget_Id_Get);    // #2872
          isOneMask := DoSearchMatchLS_(
                          Query.Run(sql + ' and GrantinvestmentType in (0,1,2)'));
        end;
      end;

      // если подходящего л/с не нашли - ПП не линкуется
      if isOneMask
        then Result := FALSE
        else begin
          if NOT DoGrantInvestmentCodeIsSystem{( cds)} then
            CDSListField_Message(
              'Не найдены правила соответствия классификаторов'
             +' по типу Кода субсидии или маска счета не совпадает с полученными'
             +' правилами')
          else
            CDSListField_Message(
              'Не найдены правила соответствия классификаторов'
             +' или маска счета не совпадает с полученными правилами');
          Result := TRUE;
        end;
      except
        ExceptionProc( 'DoSearchMatchLS_KrasnoyarskKray');
    end;

end;

begin
end.
