{~ExportKbk_LineED_AuBu
  exchange #3081
  выгрузка кбк для строки эд ау/бу.

  Правило 2.
  При формировании значения кода бюджетной классификации плательщика:
    С 1 по 17 знаки заполнить нулями;
    С 18 по 20 знаки заполнить значением  поля «КВР», если:
        Тип классификации «10» - «Расходы» и
        в карточке организации-плательщика (aPAY_ID)
        (блока «Плательщик», «Реквизиты плательщика»)
        поле «Аналитический учет расходов по КВР»
        равно «1», иначе заполнять из поля «КОСГУ».

  Правило 4.
  если строка кбк содержит все нули, выгружать пустое значение.

  если aExtendKBK = true, то код расширяется до 20 знаков.
  если aExtendKBK = false - код выгружается как есть.}
function ExportKbk_LineED_AuBu_Ex( aBudgetID, aPAY_ID: string;
                                   aLineED: Variant;
                                   aFieldKES: string;
                                   aFieldKvr: string;
                                   aExtendKBK: boolean = TRUE;
                                   aField_AnalKind: string = 'CR_ANAL_KIND'): string;
var
  xFillKvr: boolean;
begin

    try


      // проверяем вариант заполнения
      xFillKvr := FALSE;
      if (GetNodeAttributeEx( aLineED, aField_AnalKind) = '2') then
        if (LENGTH( aPAY_ID) > 0) then
          if (QueryField( 'select AUBU_KVR_EXP_FLAG Z from org where id=?',
                          [ aPAY_ID],
                          'Z') = '1')
            then xFillKvr := TRUE;



      // получаем код кбк
      if xFillKvr
        then Result := KvrCodeFormat( GetNodeAttributeEx( aLineED, aFieldKvr),
                                      aBudgetID)
        else Result := KesCodeFormat( GetNodeAttributeEx( aLineED, aFieldKES),
                                      aBudgetID);

      if aExtendKBK
        then Result := ExportKbkWithout0( KBKExtend( Result))
        else Result := ExportKbkWithout0( Result);
      except
        ExceptionProc( 'ExportKbk_LineED_AuBu_Ex');
    end;

end;
{------------------------------------------------------------------------------}
{~ExportKbk_LineED_AuBu
  exchange #3081
  выгрузка кбк для строки эд ау/бу 194/195/198
  с полями KESR_CODE и KVR_CODE.}
function ExportKbk_LineED_AuBu( aBudgetID, aPAY_ID: string;
                                aLineED: Variant;
                                aExtendKBK: boolean = TRUE): string;
begin

    try
      Result := ExportKbk_LineED_AuBu_Ex( aBudgetID,
                                          aPAY_ID,
                                          aLineED,
                                          'KESR_CODE',
                                          'KVR_CODE',
                                          aExtendKBK);
      except
        ExceptionProc( 'ExportKbk_LineED_AuBu');
    end;

end;
{------------------------------------------------------------------------------}
{~ExportTypeKbk_LineED_AuBu
  exchange #3081
  выгрузка типа кбк для строки эд ау/бу.

  Правило 1.
  Определение типа КБК плательщика выгружаемого документа осуществляется
  по значению поля «Тип классификации» аналитической строки и соответствует
  двузначным кодам:
    10 – «Расходы»;
    20 – «Доходы»;
    31 – «Источники».

  значения cr_anal_kind:
    1 = доходы
    2 - расходы
    3 - источники}
function ExportTypeKbk_LineED_AuBu( aLineED: Variant;
                                    aFieldName: string = 'CR_ANAL_KIND'): string;
begin

    try
      case GetNodeAttributeEx( aLineED, aFieldName) of
        '1': Result := '20';
        '2': Result := '10';
        '3': Result := '31';
        else begin
              WriteInfo( 'Значение типа классификации имеет недопустимое значение.');
              Result := '';
            end;
      end;//case//
      except
        ExceptionProc( 'ExportTypeKbk_LineED_AuBu');
    end;

end;


{~Export_KBK_RCP_AuBu
  exchange #3081

  Правило 4. При формировании значений типа КБК и КБК получателя для
    выгружаемого ЭД требуется определить:
  1.	Из какой из строк «Классификация получателя для ФК» или
      «Классификация получателя» ЭД  требуется осуществлять выгрузку.
      Для этого требуется проверить значения всей группы полей  на неравенство
      «пусто», если хотя бы одно из полей заполнено, считать группу полей
      соответствующими для выгрузки. Если поля обоих групп определены
      соответствующими выгрузке, то приоритетней считать группу полей
      «Классификация получателя для ФК» и осуществлять формирование значений
      для выгрузки из нее. Если группы обоих полей определены
      несоответствующими выгрузки, то значения не выгружать.
  2.	Тип КБК и КБК получателя из группы полей «Классификация получателя для ФК»:
        Тип КБК = 10 – если тип строки «Расходы», соответственно
          КБК = КВСР+КФСР+КЦСР+КВР;
        Тип КБК=20 – если тип строки «Доходы», соответственно КБК= Админ.+КВД;
        Тип КБК=31(32) – если тип строки «Источники» и первые два знака поля
          «КВИ»=01(02), соответственно КБК=Админ+КВИ.
  3.	 Тип КБК и КБК получателя из группы полей «Классификация получателя»:
        Тип КБК = 10 – если значение поля «тип классификации» строки «Расходы»,
        соответственно КБК = с 1 по 17 знаки 0 + значение поля «КВР» ИЛИ «КОСГУ».
        Значение поля «КВР» берется, если в карточке организации блока
        «Получатель» поле «Аналитический учет расходов по КВР» равно «1»,
        иначе (в том числе и отсутствие организации блока «Получатель» в
        справочнике «Организации») брать значение из поля «КОСГУ»;
        Тип КБК=20 – если значение поля «тип классификации» строки «Доходы»,
        соответственно КБК= с 1 по 17 знак 0 + значение «КОСГУ»;
        Тип КБК=31 – если значение поля «тип классификации» строки «Источники»,
        соответственно КБК= с 1 по 17 знак 0 + значение «КОСГУ».}
procedure Export_KBK_RCP_AuBu( aBudgetID: string;
                               aXmlZRST, aXmlEDLine: Variant;
                               aOrgID: string;
                               aFieldKBK: string;
                               aFieldTYPE: string);
var
  xKBK: string;
  xKBK_Type: string;
  xKBK_KES: string;
  xKBK_KVR: string;
begin

    try
      // «Классификация получателя для ФК»
      xKBK := ExportKbkWithout0(
                            GetNodeAttributeEx( aXmlEDLine, 'FK_BUDGET_CODE'));
      if (LENGTH( xKBK) > 0) then begin
        if (LENGTH( aFieldKBK) > 0)
          then aXmlZRST.SetAttribute( aFieldKBK, KBKExtend( xKBK));
        if (LENGTH( aFieldTYPE) > 0)
          then aXmlZRST.SetAttribute(
                          aFieldTYPE,
                          ExportTypeKbk_LineED_AuBu( aXmlEDLine,
                                                     'FK_ANAL_KIND'));
        EXIT;
      end;

      // «Классификация получателя»
      // здесь проверяем отдельно на заполнения поля косгу или квр
      xKBK_KES := ExportKbkWithout0(
                          GetNodeAttributeEx( aXmlEDLine, 'KESR_HEAD_CODE'));
      xKBK_KVR := ExportKbkWithout0(
                          GetNodeAttributeEx( aXmlEDLine, 'KVR_HEAD_CODE'));
      if ((LENGTH( xKBK_KES) <= 0) AND (LENGTH( xKBK_KVR) <= 0))
        then EXIT;

      if (LENGTH( aFieldKBK) > 0)
        then aXmlZRST.SetAttribute(
                      aFieldKBK,
                      ExportKbk_LineED_AuBu_Ex( aBudgetID,
                                                aOrgID,
                                                aXmlEDLine,
                                                'KESR_HEAD_CODE',
                                                'KVR_HEAD_CODE',
                                                TRUE,
                                                'HEAD_CR_ANAL_KIND'));
      if (LENGTH( aFieldTYPE) > 0)
        then aXmlZRST.SetAttribute(
                      aFieldTYPE,
                      ExportTypeKbk_LineED_AuBu(  aXmlEDLine,
                                                  'HEAD_CR_ANAL_KIND'));
      except
        ExceptionProc( 'Export_KBK_RCP_AuBu');
    end;

end;

function ExportKbk_Rule( aBudgetID: string;
                                   aLine: Variant;
                                   kbkTemplate: string;
                                   aClassNum: integer;
                                   aExtendKBK: boolean = TRUE): string;
var
 i: Integer;
begin
  Result := '';
  try
    Result := kbkTemplate;
    kbkTemplate := StringReplace(kbkTemplate, '%КОСГУ%' , GetFieldValueByRule(aLine, '%КОСГУ%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%КВР%', GetFieldValueByRule(aLine, '%КВР%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%Отраслевой код%', GetFieldValueByRule(aLine, '%Отраслевой код%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%КФСР%', GetFieldValueByRule(aLine, '%КФСР%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%Ан. группа%', GetFieldValueByRule(aLine, '%Ан. группа%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%Ан.группа%', GetFieldValueByRule(aLine, '%Ан. группа%', aClassNum));
    kbkTemplate := StringReplace(kbkTemplate, '%Код субсидии%', GetFieldValueByRule(aLine, '%Код субсидии%', aClassNum));

    if aExtendKBK
      then Result := ExportKbkWithout0( KBKExtend( kbkTemplate))
      else Result := ExportKbkWithout0( kbkTemplate);
  except
      ExceptionProc( 'ExportKbk_LineED_AuBu_Ex');
  end;
end;

function GetFieldValueByRule(aLineED: Variant; aRule: String; classNum: integer): String;
var
 r: String;
 tableName, fieldName: String;
begin
  tableName := GetNameTableByRule(aRule);
  fieldName := GetNameField_AuBu_of_ClassNum(aRule, classNum);
  if(Length(GetNodeAttributeEx(aLineED, fieldName)) > 0) then
  begin
    r := GetNodeAttributeEx(aLineED, fieldName);
    if ((classNum = 1) or (classNum = 222)) and ((tableName = 'INDUSTRYCODE') or (tableName = 'GRANTINVESTMENT')) then
    begin
      r := QueryField('select i.code as CODE from ' + tableName + ' i where i.id=?', [r], 'CODE');
    end;
    Result := r;
  end
  else
    Result := '';
end;

function GetNameField_AuBu_of_ClassNum( aField: string; classNum: integer): string;
begin
    try
      case UPPERCASE( aField) of
        '%КОСГУ%':
              case classNum of
                1:
                     Result := 'KESR_HEAD_CODE';
                222:   Result := 'AUBU_KESR_CODE';
                else Result := 'KESR_CODE';
              end;//case//

        '%КВР%':
              case classNum of
                1:
                     Result := 'KVR_HEAD_CODE';
                222:   Result := 'AUBU_KVR_CODE';
                else Result := 'KVR_CODE';
              end;//case//

        '%ОТРАСЛЕВОЙ КОД%':
              case classNum of
                1:
                     Result := 'INDUSTRYCODE_HEAD_ID';
                222:   Result := 'AUBU_INDUSTRYCODE_ID';
                else Result := 'INDUSTRYCODE_CODE';
              end;//case//

        '%КФСР%':
              case classNum of
                1:
                     Result := 'KFSR_HEAD_CODE';
                222:   Result := 'AUBU_KFSR_CODE';
                else Result := 'KFSR_CODE';
              end;//case//

        '%АН. ГРУППА%':
              case classNum of
                1:
                     Result := 'KSDA_HEAD_CODE';
                222:
                     Result := 'AUBU_KSDA_CODE';
                else  Result := 'KSDA_CODE';
              end;

        '%КОД СУБСИДИИ%':
              case classNum of
                1:
                     Result := 'GRANTINVESTMENT_HEAD_ID';
                222:   Result := 'AUBU_GRANTINVESTMENT_ID';
                else Result := 'GRANTINVESTMENT_CODE';
              end;//case//
      end;//case//
      except
        ExceptionProc( 'GetNameField_AuBu_of_ClassNum');
    end;
end;

function GetNameTableByRule( aField: string): string;
begin
  case UPPERCASE( aField) of
    '%КОСГУ%':
          Result := 'KES';
    '%КВР%':
          Result := 'KVR';
    '%ОТРАСЛЕВОЙ КОД%':
          Result := 'INDUSTRYCODE';
    '%КФСР%':
          Result := 'KFSR';
    '%АН. ГРУППА%':
          Result := 'KSDA';
    '%КОД СУБСИДИИ%':
          Result := 'GRANTINVESTMENT';
  end;//case//
end;


begin
end.
