// exchange #2520
// реализовать отдельный модуль разбора выписки банка по правилу "КОМИ".
// По правилу "КОМИ" механизм разбора должен быть полностью аналогичен
// общему разбору по БУ/АУ, за исключением условия проверки л/с.
// релизация в АЦК-финансы: 2.30
function CheckPayOrder_KOMI: Boolean;
var
  Unclassified: Boolean;
  isOneMask: Boolean;
  MustBeGrantInvestCode: Boolean;
  xSysIndustryCode: string;     // exchange #7506
  xPi_Budget_Code: string;
begin

    try
      Result := False;

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

      if NOT DoCheckRecAccountGeneral then EXIT;

      CDSListField_Enroll( NULL);

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

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

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

      xPi_Budget_Code := CDSListField_Pi_Budget_Code_Get;
      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));
      end else
        //104 поле не заполнено ?
        if (not Unclassified) and (xPi_Budget_Code = '') then begin
          //инициализирует значения отраслевого кода и косгу
          CDSListField_Industry_Code( '');
          CDSListField_Kesr_Code( '');
          //получает отраслевой код и косгу из назначения
          if not isParceDescription_General({cds,} 'отр.код') then
            //Exchange #2281, если нет отр.кода, ищем один косгу,
            //без него классифицироать не будем
            if not isParceDescription_General({cds,} 'косгу') then begin
              CDSListField_Message('Не удалось получить КОСГУ из назначения платежа');
              Unclassified := True;
            end;
        end else begin
          Unclassified := True;
        end;

      //проверка отраслевого кода на 17 нулей и замена на один системный ноль.
      // exchange #2706
      // для символьных БК так нельзя. поэтому тут проверяем реальный код
      // с системным. для этого в начале получаем системный код и будем его затем
      // использовать для разных проверок.
      xSysIndustryCode := GetMaskIndustryCode( '0', CDSListField_Budget_Id_Get);

      //инициализирует значениe кода субсидии
      DoResetGrantInvestment;//( cds);

      // Exchange #2520
      // Код субсидии ищем только в том случае, если в первом разряде лицевого
      // счета стоят значения О или Ц (раскладка русская); в противном случае
      // (если первый разряд ЛС не равен О или Ц) код субсидии проставляем
      // системное значение 0 «Не указан» (код 0, Наименование «Не указан»,
      // Тип 3 «Не указан», Учредитель «Не указана»).
      // разбор отраслевого кода выполняется как в ОБЩЕМ алгоритме.
      MustBeGrantInvestCode :=
                (Copy( CDSListField_LS_Number_Get{cds.FieldByName('LS_Number').asString}, 1, 1) in ['О','Ц']);

      if (not Unclassified) then
        if (not isParceDescription_General({cds,} 'код субсидии')) then begin
          if MustBeGrantInvestCode then begin
            CDSListField_Message('Не удалось получить код субсидии из назначения платежа');
            Unclassified := True;
          end;
        end;

      //приведение косгу к числовому типу
      if (not Unclassified) then
        try
          CDSListField_Kesr_Code(
              StrToInt(StringReplace( CDSListField_Kesr_Code_Get, ' ', '')));
          except
            CDSListField_Kesr_Code( '0');
            CDSListField_Message( 'Не удалось преобразовать КОСГУ в числовой тип');
            Unclassified := True;
        end;
    {
        cds.Edit;
        try
          cds.FieldByName('Kesr_Code').asInteger :=
            StrToInt(StringReplace(cds.FieldByName('Kesr_Code').asString, ' ', ''));
        except
          cds.FieldByName('Kesr_Code').asInteger := 0;
          cds.FieldByName('ResText').AsString :=
            'Не удалось преобразовать КОСГУ в числовой тип';
          Unclassified := True;
        end;
        cds.Post;}

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

      //Код субсидии
      if (not Unclassified)
        then GrantInvestmentChooseGeneral( MustBeGrantInvestCode, Unclassified);

      //Отраслевой код
      if (not Unclassified) then
        if NOT SearchIndustrycode_KOMI( xSysIndustryCode, Unclassified)
          then EXIT;

      //КВФО
      if not Unclassified then
        // Exchange #2362 - как в общем алгоритме
        if DoSearchMatchLS_General
          then Unclassified := TRUE;

      if Unclassified then
      begin
        if NOT vIsAzkVersion2_26_46_1 then begin
          if NOT DoUnclassified_2_26_46_1_General( 1) then EXIT;
          Result := True;
        end else begin
          // версия системы выше чем 2.26.46.1
          if NOT DoUnclassified then EXIT;
          Result := True;
        end;
      end
      else begin
        DoCheckOk;
        Result := True;
      end;
      except
        ExceptionProc( 'CheckPayOrder_KOMI');
    end;

end;


begin
end.
