

{~Exch2344_ExistsRolesAndCredentials
 проверка ролей для организации (атрибут aAttrOrdID) и проверяет признак
  Переданные полномочия ПБС для счета организации (атрибут aAttrOrgAccID).
  значения полей берутся из атрибутов узла aNode.
  возвращает:
    =true - если Организация-владелец бланка расходов  имеет роль Бюджетное или
      Автономное учреждение и Счет финансирования имеет признак "Переданные
      полномочия ПБС". }
      
function Exch2344_ExistsRolesAndCredentials(
                  var aFromNode: variant;
                  aAttrOrdID, aAttrOrgAccID: string): boolean;
begin

    try
      if ExistsRolesForOrg( aFromNode.getAttribute( aAttrOrdID), '18,19')
        then Result := ExistsCredentialsFlagForOrgAccount(
                                        aFromNode.getAttribute( aAttrOrgAccID))
        else Result := FALSE;

      except
        ExceptionLog( 'Сбой: Un_Exch2344.Exch2344_ExistsRolesAndCredentials');
    end;

end;


{~Exch2344_SetAttr_NAME_UBP_PAY
  exchange #2344:
  если Счет финансирования имеет признак "Переданные полномочия ПБС",
  выгружать в поле Официальное название организации-владельца счета
  (из нового поля документа). на ID не смотрим!
  при этом, если поле не заполнено - поле заполняется по умолчанию
  значение поля берется из схемы из ORG_DESCRIPTION.

  exchange #2434 - доработка
  если поле ORG_CREDENTIALS_NAME имеется, то независимо от того, пустое поле
  или нет - aData.атрибут(aAttrData) будет заполнен значением из этого поля.

  aAttrData - название заполняемого атрибута:
    UF: aAttrData = 'NAME_UBP'.}
procedure Exch2344_SetAttr_NAME_UBP_PAY( var aData: Variant;
                                         var aSource: Variant;
                                         aAttrData: string);
begin

    try

      if XmlAttrExists( aSource, 'ORG_CREDENTIALS_NAME')
        then aData.setAttribute(
                        aAttrData,
                        TRIM( aSource.getAttribute('ORG_CREDENTIALS_NAME')));

      except
        ExceptionLog( 'Сбой: Un_Exch2344.Exch2344_SetAttr_NAME_UBP_PAY');
    end;

end;


{~Exch2344_SetAttr_NAME_UBP_PAY_Ex
  exchange #2344:
  если Счет финансирования имеет признак "Переданные полномочия ПБС",
  выгружать в поле Официальное название организации-владельца счета
  (из нового поля документа). на ID не смотрим!
  при этом, если поле не заполнено - поле заполняется по умолчанию
  значение поля берется из схемы из ORG_DESCRIPTION.

  exchange #2434 - доработка
  если поле ORG_CREDENTIALS_NAME имеется, то независимо от того, пустое поле
  или нет - aData.атрибут(aAttrData) будет заполнен значением из этого поля.

  aAttrData - название заполняемого атрибута:
    UF: aAttrData = 'NAME_UBP'.

  exchange #2451
    заполнять поле UF.NAME_UBP нужно только если поле ORG_CREDENTIALS_NAME
  не пустое, иначе оставлять предыдущее значние (по умолчанию)}
procedure Exch2344_SetAttr_NAME_UBP_PAY_Ex( var aData: Variant;
                                            var aSource: Variant;
                                            aAttrData: string);
var s: string;
begin

    try

      if XmlAttrExists( aSource, 'ORG_CREDENTIALS_NAME') then begin
        s := TRIM( aSource.getAttribute('ORG_CREDENTIALS_NAME'));
        if ( LENGTH( s) > 0)
          then aData.setAttribute( aAttrData, s);
      end;

      except
        ExceptionLog( 'Сбой: Un_Exch2344.Exch2344_SetAttr_NAME_UBP_PAY_Ex');
    end;

end;


{~Exch2434_ZR_ZS
  #2344: дополнение (ZR)
  NAME_UBP_PAY - добавить условие: если Счет финансирования имеет
  признак «Переданные полномочия ПБС», выгружать в поле независимо от
  СпецНастройки1 файла конфигурации ZR Официальное название Организации
  -плательщика (из нового поля документа - ORG_CREDENTIALS_NAME).
  если название Организации-плательщика не указано, в поле подставляется
  значение из ZR.NAME_UBP (как раньше)
  по устному уточнению поле NAME_UBP_PAY нужно заполнять из нового
  поля ORG_CREDENTIALS_NAME что соответствует полю FROM.NAME_UBP
  #2432: доработка
  если счет имеет признак «Переданные полномочия ПБС», то поле
    NAME_UBP_PAY заполнять из нового поля документа ORG_CREDENTIALS_NAME
    (Официальное название Организации-плательщика).
  иначе, если указана спец настройка и указана галочка «Бюджетополучатель»
    в бланке расходов (по ESTIMATE_ID) то поле NAME_UBP_PAY заполнять
    названия организации бюджетополучателя из первой строки ЭД.
  иначе: поле NAME_UBP_PAY заполнять из FROM.NAME_UBP.

  параметры:
    aData - формируемый ЭД
    aSource - исходный ЭД
    aCfg_SpecParam1 - спец параметр из конфигурации
    aFieldLS - название атрибута, в котором будет сохранен ид.лицевого счета.
                ZR: LS_UBP_PAY
                ZS: LS_PAY
    aField_TOFK_COD - название поля aData.КОД_TOFK
                ZR: KOD_TOFK
                ZS: KOD_TOFK_PAY
    aField_TOFK_NAME - название поля aData.НАЗВАНИЕ_TOFK
                ZR: NAME_TOFK
                ZS: NAME_TOFK_PAY}
procedure Exch2434_ZR_ZS_11( var aData: Variant;
                              var aSource: Variant;
                              aCfg_SpecParam1: boolean;
                              aCfg_param_UFK_TOFK: String;
                              aFieldLS: string;
                              aField_TOFK_COD: string;
                              aField_TOFK_NAME: string);
var
  xDataNode: Variant;
  xOrgAccountID: string;
  tmpStr: String;
begin

    try
      // сохраняем счет организации. он понадобится в нескольких местах
      xOrgAccountID := aSource.getAttribute('ORGACCOUNT_ID');

      { проверяем в счете финансирования признак «Переданные полномочия ПБС» }
      if ExistsCredentialsFlagForOrgAccount( xOrgAccountID)
        then Exch2344_SetAttr_NAME_UBP_PAY( aData, aSource, 'NAME_UBP_PAY')
        else
      if (GetEstimateCheckBox(aSource.getAttribute('ESTIMATE_ID'),'PERSONAL_ACCOUNT_FLAG') and aCfg_SpecParam1)
        then aData.setAttribute('NAME_UBP_PAY', QueryField( sqlOrgId, [aSource.childNodes.Item[0].getAttribute('RECIPIENT_ID')], 'DESCRIPTION'))
        else aData.setAttribute('NAME_UBP_PAY', aData.parentNode.childnodes.item[1].getAttribute('NAME_UBP'));


      // сохраняем ЛС
      aData.setAttribute( aFieldLS, QueryField( sqlAccById, [ xOrgAccountID], 'ACCOUNT_NUMBER'));

      setTOFKProps(aCfg_param_UFK_TOFK, aData, xOrgAccountID, aField_TOFK_COD, aField_TOFK_NAME);


      except
        ExceptionLog( 'Сбой Un_Exch2344.Exch2434_ZR_ZS_11');
    end;

end;


procedure Exch2434_ZR_ZS( var aData: Variant;
                          var aSource: Variant;
                          aCfg_SpecParam1: boolean;
                          aCfg_param_UFK_TOFK: String;
                          aFieldLS: string;
                          aField_TOFK_COD: string;
                          aField_TOFK_NAME: string);
var
  aDocClass: String;
begin
  aDocClass := VarToStr(aSource.getAttribute('DOCUMENTCLASS_ID'));

    try
      if (aDocClass = '11') then begin

        Exch2434_ZR_ZS_11( aData,
                            aSource,
                            aCfg_SpecParam1,
                            aCfg_param_UFK_TOFK,
                            aFieldLS,
                            aField_TOFK_COD,
                            aField_TOFK_NAME);
      end
      else if ((aDocClass = '75') or (aDocClass = '194')) then
        setTOFKProps(aCfg_param_UFK_TOFK, aData, aSource.getAttribute('PAY_ACC_ID'), aField_TOFK_COD, aField_TOFK_NAME);
    except
        ExceptionLog( 'Сбой Un_Exch2344.Exch2434_ZR_ZS');
    end;

end;

{~Exch2344_ZS_TFF9
  заполняются поля ZS в ЭД aData исходя из описания документа aSource
  по exchange 32344.
  заполняются поля:
    ZS.NAME_UBP_PAY;
    ZS.LS_PAY;
    ZS.NAME_TOFK_PAY;
    ZS.KOD_TOFK_PAY.}
procedure Exch2344_ZS_TFF9( var aData: Variant;
                            var aSource: Variant;
                            aCfg_SpecParam1: boolean;
                            aCfg_param_UFK_TOFK: String);
begin

    try
      Exch2434_ZR_ZS( aData,
                      aSource,
                      aCfg_SpecParam1,
                      aCfg_param_UFK_TOFK,
                      'LS_PAY',
                      'KOD_TOFK_PAY',
                      'NAME_TOFK_PAY');
      except
        ExceptionLog( 'Сбой Un_Exch2344.Exch2344_ZS_TFF9');
    end;

end;


{~Exch2344_ZR_TFF9
  заполняются поля ZR в ЭД aData исходя из описания документа aSource
  по exchange 32344.
  заполняются поля:
    ZR.NAME_UBP_PAY;
    ZR.LS_UBP_PAY;
    ZR.NAME_TOFK_PAY;
    ZR.KOD_TOFK_PAY.}
procedure Exch2344_ZR_TFF9( var aData: Variant;
                            var aSource: Variant;
                            aCfg_SpecParam1: boolean;
                            aCfg_param_UFK_TOFK: String);
begin

    try
      Exch2434_ZR_ZS( aData,
                      aSource,
                      aCfg_SpecParam1,
                      aCfg_param_UFK_TOFK,
                      'LS_UBP_PAY',
                      'KOD_TOFK',
                      'NAME_TOFK');
      except
        ExceptionLog( 'Сбой Un_Exch2344.Exch2344_ZR_TFF9;');
    end;

end;



function DoDefineDoc2344_TFF9( var aSourceXml: Variant;
                               aBudgetID: string;
                               var aFromBudgLevel: string;
                               var aFromKodUbp: string;
                               var aFromNameUbp: string;
                               var aToKodTofk: string;
                               var aToNameTofk: string;
                               var aOrgCode: string): integer;
begin

    try
      Result := -1;

      // дальше возвращаем параметры в зависимости от класса
      case aSourceXml.getAttribute('DOCUMENTCLASS_ID') of
        11: begin
              { #2344: если если Организация-владелец бланка расходов имеет роль
                Бюджетное или Автономное учреждение и Счет финансирования
                имеет признак "Переданные полномочия ПБС", выгружать в поле
                значение "6" }
              if ExistsRolesAndCredentialsOrg(
                                    aSourceXml.getAttribute( 'ESTIMATE_ID'),
                                    aSourceXml.getAttribute( 'ORGACCOUNT_ID'))
                then aFromBudgLevel := '6'
                else aFromBudgLevel := GetBudgLevel( aBudgetID);

              aFromKodUbp  := aSourceXml.getAttribute( 'ORG_CODE');
              aFromNameUbp := aSourceXml.getAttribute( 'ORG_NAME');
              aToKodTofk   := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('ORGACCOUNT_ID')], 'NAME');
              aToNameTofk  := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('ORGACCOUNT_ID')], 'DESCRIPTION');
              // Exchange #2434 - доработка
              aOrgCode     := aSourceXml.getAttribute( 'ORG_CODE');
            end;

        '75': begin
              aFromBudgLevel:= GetBudgLevel( aBudgetID);
              aFromKodUbp   := aSourceXml.getAttribute( 'PAY_CODE');
              aFromNameUbp  := aSourceXml.getAttribute( 'PAY_NAME');
              aToKodTofk   := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('PAY_ACC_ID')], 'NAME');
              aToNameTofk  := QueryField(sqlTofkAcc, [ aSourceXml.getAttribute('PAY_ACC_ID')], 'DESCRIPTION');
              aOrgCode      := aSourceXml.getAttribute( 'PAY_CODE');
            end;
      else EXIT;        // прочие классы не заполняем
      end;//case//
      Result := 0;

      except
        ExceptionLog( 'Сбой Un_Exch2344.DoDefineDoc2344_TFF9');
    end;

end;


{~Exch2344_FromZRZS_TFF9
  заполняется секцию данных FROM (aData) для ZR, ZS
  исходя из описания документа aSource по доработке #2344.
  заполняются поля:
    FROM.BUDG_LEVEL;
    FROM.KOD_UBP;
    FROM.NAME_UBP.}
procedure Exch2344_FromZRZS_TFF9( var aDataXml: Variant;
                                   var aSourceXml: Variant);
var
  xNode: variant;
  xFromBudgLevel: string;
  xFromKodUbp: string;
  xFromNameUbp: string;
  xToKodTofk: string;
  xToNameTofk: string;
  xOrgCode: string;
begin

    try

      if (aSourceXml.getAttribute('DOCUMENTCLASS_ID') = 11) then begin
        if (DoDefineDoc2344_TFF9( aSourceXml,
                                  aSourceXml.getAttribute('BUDGET_ID'),
                                  xFromBudgLevel,
                                  xFromKodUbp,
                                  xFromNameUbp,
                                  xToKodTofk,
                                  xToNameTofk,
                                  xOrgCode) <> 0)
          then Raise( 'Сбой описания ЭД.');

        aDataXml.setAttribute( 'BUDG_LEVEL', xFromBudgLevel);
        aDataXml.setAttribute( 'KOD_UBP', xFromKodUbp);
        aDataXml.setAttribute( 'NAME_UBP', xFromNameUbp);


      end;
      except
        ExceptionLog( 'Сбой Un_Exch2344.Exch2344_FromZRZS_TFF9;');
    end;

end;


begin
end.
