{ exchange #3062
  часть функционала описания кб вынесена из модуля Un_Export в отдельный модуль
  чтобы унифицировать код в импорте.}

{~DoKbkMasked
  обновление кбк (20 знаков обязательно) по маске.
  результат:
    обновленная строка aKBK по маске.
  иногда требуется заполнить часть кода определенными значениями (нулями),
  а часть оставить как есть (см.выгрузка ZR эд 11/75 для Волгограда).
  чтобы унифицировать код, заведена эта функция где указывается маска.
  если маска пустая - ничего не меняется в коде.
  если маска не пустая она должна содержать 20 символов.
  проверяется каждый символ:
    0...9 - устанавливается символ из маски в соответствующий символ строки кбк.
    -  этот символ в строке кбк не меняется.
    прочие символы игнорируются.}
function DoKbkMasked( aKBK, aMaska: string): string;
var
  i: integer;
begin

    try
      Result := aKBK;
      if (LENGTH( aMaska) > 0) then
        for i := 1 to LENGTH( aMaska) do
          case aMaska[ i] of
            '0','1','2','3','4','5','6','7','8','9':
                Result[ i] := aMaska[ i];
          end;//case//
      except
        ExceptionProc( 'DoKbkMasked');
    end;

end;


{~GetRuleKBKLine_R
  формирование расходной строки КБК из кодов aKADMR, aKFSR, aKCSR, aKVR, aKESR.
  форматирование кодов осуществляется для бюджета aBudgetId.

  exchange #3062
  убран код КСГУ. код КВР/КВД/КВИ расширен.
  для этого добавлен параметр aCheckKES.
  если aCheckKES=true - все по старому.
  если aCheckKES=false - косгу не учитывается.

  aFormating - необходимость форматирования кода по маске.
               иногда это не нужно, когда детали кода уже отформатированы,
               а здесь нужно собрать строку кбк.
    =true - выполняется
    =false - не выполняется.}
function GetRuleKBKLine_R( aKADMR, aKFSR, aKCSR, aKVR, aKESR: string;
                           aBudgetId: String;
                           aCheckKES: boolean = TRUE;
                           aMaska: string = '';
                           aFormating: boolean = TRUE): string;
begin

    try
      if aFormating
        then Result := DoKbkMasked(
                            KadmCodeFormat( aKADMR, aBudgetId)
                           +KfsrCodeFormat( aKFSR, aBudgetId)
                           +KcsrCodeFormat( aKCSR, aBudgetId, 0, aCheckKES)
                           +KvrCodeFormat( aKVR, aBudgetId)
                           +KesCodeFormat( aKESR, aBudgetId, 0, aCheckKES),
                            aMaska)
        else Result := DoKbkMasked(
                            aKADMR
                           +aKFSR
                           +CheckLengthCodeKCSR( aKCSR, aCheckKES)
                           +aKVR
                           +CheckLengthCodeKES( aKESR, aCheckKES),
                            aMaska);
      except
        ExceptionProc( 'GetRuleKBKLine_R');
    end;

end;

{~GetRuleKBKLine_I
  формирование строки источников КБК из кодов aKADMI, aKI, aKESI.
  форматирование кодов осуществляется для бюджета aBudgetId.

  exchange #3062
  убран код КСГУ. код КВР/КВД/КВИ расширен.
  для этого добавлен параметр aCheckKES.
  если aCheckKES=true - все по старому.
  если aCheckKES=false - косгу не учитывается.

  aFormating - необходимость форматирования кода по маске.
               иногда это не нужно, когда детали кода уже отформатированы,
               а здесь нужно собрать строку кбк.
    =true - выполняется
    =false - не выполняется.}
function GetRuleKBKLine_I( aKADMI, aKI, aKESI: string;
                           aBudgetId: String;
                           aCheckKES: boolean = TRUE;
                           aMaska: string = '';
                           aFormating: boolean = TRUE): string;
begin

    try
      if aFormating
        then Result := DoKbkMasked(
                          KadmCodeFormat( aKADMI, aBudgetId)
                         +KiCodeFormat( aKI, aBudgetId, 0, aCheckKES)
                         +KesCodeFormat( aKESI, aBudgetId, 0, aCheckKES),
                          aMaska)
        else Result := DoKbkMasked(
                          aKADMI
                         +CheckLengthCodeKI( aKI, aCheckKES)
                         +CheckLengthCodeKES( aKESI, aCheckKES),
                          aMaska);
      except
        ExceptionProc( 'GetRuleKBKLine_I');
    end;

end;

{~GetRuleKBKLine_D
  формирование доходной строки КБК из кодов aKADMD, aKD, aKESD.
  форматирование кодов осуществляется для бюджета aBudgetId.

  exchange #3062
  убран код КСГУ. код КВР/КВД/КВИ расширен.
  для этого добавлен параметр aCheckKES.
  если aCheckKES=true - все по старому.
  если aCheckKES=false - косгу не учитывается.

  aFormating - необходимость форматирования кода по маске.
               иногда это не нужно, когда детали кода уже отформатированы,
               а здесь нужно собрать строку кбк.
    =true - выполняется
    =false - не выполняется.}
function GetRuleKBKLine_D( aKADMD, aKD, aKESD: string;
                           aBudgetId: String;
                           aCheckKES: boolean = TRUE;
                           aMaska: string = '';
                           aFormating: boolean = TRUE): string;
begin

    try
      if aFormating
        then Result := DoKbkMasked(
                              KadmCodeFormat( aKADMD, aBudgetId)
                             +KdCodeFormat( aKD, aBudgetId, 0, aCheckKES)
                             +KesCodeFormat( aKESD, aBudgetId, 0, aCheckKES),
                              aMaska)
        else Result := DoKbkMasked(
                              aKADMD
                             +CheckLengthCodeKES( aKD, aCheckKES)
                             +CheckLengthCodeKES( aKESD, aCheckKES),
                              aMaska);
      except
        ExceptionProc( 'GetRuleKBKLine_D');
    end;

end;

{~GetRuleKBKLineEx
  формирование строки КБК из кодов строки эд aLine с типом кбк = aTypeKBK.
  форматирование кодов осуществляется для бюджета aBudgetId.
  aPrefix - префикс названия кодов полей в строке aLine.

  реализовано в отдельной функции, с указанием типа кбк не по строке через
  поле ANAL_KIND а явно через параметр aTypeKBK.
  aTypeKBK:
    0 - расходы
    1 - доходы
    2 - источники
    3 - источники ау/бу (exchange #2566)

  exchange #3062
  убран код КСГУ. код КВР/КВД/КВИ расширен.
  для этого добавлен параметр aCheckKES.
  если aCheckKES=true - все по старому.
  если aCheckKES=false - косгу не учитывается.

  aFormating - необходимость форматирования кода по маске.
               иногда это не нужно, когда детали кода уже отформатированы,
               а здесь нужно собрать строку кбк.
    =true - выполняется
    =false - не выполняется.}
function GetRuleKBKLineEx( aLine: Variant;
                           aTypeKBK: integer;
                           aBudgetId: String;
                           aPrefix: String = '';
                           aCheckKES: boolean = TRUE;
                           aFormating: boolean = TRUE): string;
begin

    try
//      Result := '';
      case aTypeKBK of
      //расходы, порядок следования: КВСР, КФСР, КЦСР, КВР, КОСГУ
        0: Result := GetRuleKBKLine_R(
                            GetNodeAttributeEx( aLine, aPrefix + 'KADMR_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KFSR_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KCSR_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KVR_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KESR_CODE'),
                            aBudgetId,
                            aCheckKES,
                            '',
                            aFormating);
{
        KadmCodeFormat(aLine.getAttribute(aPrefix + 'KADMR_CODE'), aBudgetId)
                      + KfsrCodeFormat(aLine.getAttribute(aPrefix + 'KFSR_CODE'), aBudgetId)
                      + KcsrCodeFormat(aLine.getAttribute(aPrefix + 'KCSR_CODE'), aBudgetId)
                      + KvrCodeFormat(aLine.getAttribute(aPrefix + 'KVR_CODE'), aBudgetId)
                      + KesCodeFormat(aLine.getAttribute(aPrefix + 'KESR_CODE'), aBudgetId, 0, aCheckKES);}

      //доходы, порядок следования: Гл.Админ, КВД, КОСГУ
        1: Result := GetRuleKBKLine_D(
                            GetNodeAttributeEx( aLine, aPrefix + 'KADMD_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KD_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KESD_CODE'),
                            aBudgetId,
                            aCheckKES,
                            '',
                            aFormating);
        {
                KadmCodeFormat(aLine.getAttribute(aPrefix + 'KADMD_CODE'), aBudgetId)
                      + KdCodeFormat(aLine.getAttribute(aPrefix + 'KD_CODE'), aBudgetId)
                      + KesCodeFormat(aLine.getAttribute(aPrefix + 'KESD_CODE'), aBudgetId, 0, aCheckKES);
                      }
      //источники, порядок следования: Гл.Админ, КВИ, КОСГУ
        2: Result := GetRuleKBKLine_I(
                            GetNodeAttributeEx( aLine, aPrefix + 'KADMI_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KI_CODE'),
                            GetNodeAttributeEx( aLine, aPrefix + 'KESI_CODE'),
                            aBudgetId,
                            aCheckKES,
                            '',
                            aFormating);
        {
                      KadmCodeFormat(aLine.getAttribute(aPrefix + 'KADMI_CODE'), aBudgetId)
                      + KiCodeFormat(aLine.getAttribute(aPrefix + 'KI_CODE'), aBudgetId)
                      + KesCodeFormat(aLine.getAttribute(aPrefix + 'KESI_CODE'), aBudgetId, 0, aCheckKES);
                      }
      // exchange #2566
      // добавлена расшифровка строк ау/бу: отраслевой код (17 цифр дополненных
      // нулями слева) + КОСГУ (3 цифры)
        3: begin
              Result := AppendStringLeft(
                             QueryField(  ' select a.code from INDUSTRYCODE a'
                                         +' where a.id=? and a.budget_id=?',
                                          [ GetNodeAttributeEx(
                                                      aLine,
                                                      aPrefix + 'KADMI_CODE'),
                                            aBudgetId],
                                          'CODE'),
                             17,
                             '0');
              if aFormating
                then Result :=
                        Result + KesCodeFormat(
                                  GetNodeAttributeEx(
                                                aLine,
                                                aPrefix + 'AUBU_KESR_CODE'),
                                  aBudgetId)
                else Result :=
                        Result + GetNodeAttributeEx(
                                                aLine,
                                                aPrefix + 'AUBU_KESR_CODE');
            end;

        else ExceptionProc(
                  FORMAT( 'Тип КБК %s не определен.', [ inttostr( aTypeKBK)]));
      end;//case//
      except
        ExceptionProc( 'GetRuleKBKLineEx');
    end;

end;

{~GetRuleKBKLine
  Возвращает КБК в зависимости от типа с дописанными нулями, и порядком
  следования кодов.
  exchange #3062
  убран код КСГУ. код КВР/КВД/КВИ расширен.
  для этого добавлен параметр aCheckKES.
  если aCheckKES=true - все по старому.
  если aCheckKES=false - косгу не учитывается.}
function GetRuleKBKLine( aLine: Variant;
                          aBudgetId: String;
                          aprefix: String = '';
                          aCheckKES: boolean = TRUE): String;
begin

    try
      Result := GetRuleKBKLineEx(
                    aLine,
                    STRTOINT( GetNodeAttributeEx( aLine, aprefix + 'ANAL_KIND')),
                    aBudgetId,
                    aprefix,
                    aCheckKES);
      except
        ExceptionLog( 'Сбой Un_Export.GetRuleKBKLine');
    end;

end;
{==============================================================================}
{~ExportKbkWithout0
  выгрузка поля КБК: если код содержит все нули - код не выгружается.
  если пустой - тоже не выгружается.
  если код не пустой и не нулевой - выгружается как указано.
  доработано по #3081 для унификации кода.}
function ExportKbkWithout0( aKBK: string): string;
begin

    try
      if KBK_is_0( aKBK)
        then Result := ''
        else Result := aKBK;
      except
        ExceptionProc( 'ExportKbkWithout0');
    end;

end;

begin
end.
