{~GetSysParam_PurposefulgrantFromZOR
  функция возвращает значение системного параметра:
             «Передавать код цели из заявки на оплату расходов»
  в разделе: « Сервис - Системные параметры - Платежное поручение».
  Результат:
    =0 - всегда;
    =1 - никогда;
    =2 - с контролем в ФК;
    =3 - указаны допкоды;
    =4 - не указаны допкоды.
  проверка наличия всех параметров (из 4-х), или одновременное указание
  нескольких параметров не проверяется.
  функция добавлена по exchange #2412.}
function GetSysParam_PurposefulgrantFromZOR: integer;
var
  xXml: variant;
  xXmlNodes: variant;
  i: integer;
  sName, sValue: string;
begin

    try
      Result := 0;
      // для ускорения запрашиваем сразу все параметры по шаблону.
      // все параметры начинаются с определенной подстроки.
      // в результате должны получить все 4 параметра.
      xXml := QueryXml(  ' select p.name NAME_, p.param_value VALUE_ '
                        +' from sysparam p where p.name like '
                        +#39'payorder.purposefullgrant_send_%'#39);

      xXmlNodes := xXml.documentElement.childNodes;
      for i := 0 to xXmlNodes.Length - 1 do begin
        sName  := xXmlNodes.Item[i].GetAttribute('NAME_');
        sValue := xXmlNodes.Item[i].GetAttribute('VALUE_');

        case sName of
          'payorder.purposefullgrant_send_never': begin

                  if (sValue = '1') then Result := 1;
                end;
          'payorder.purposefullgrant_send_fk_controll': begin

                  if (sValue = '1') then Result := 2;
                end;
          'payorder.purposefullgrant_send_dopcodes': begin

                  if (sValue = '1') then Result := 3;
                end;
          'payorder.purposefullgrant_send_no_dopcodes': begin

                  if (sValue = '1') then Result := 4;
                end;

        end;//case//
      end;//for//

      except
        ExceptionLog( 'Сбой Un_SysParams.GetSysParam_PurposefulgrantFromZOR');
    end;

end;


{~SysParam_UFG_OrgID
  возвращает ид.организации указанной в «Сервис/Системные параметры УФК» поле «УФК»}
function SysParam_UFG_OrgID(budgetId: String): string;
begin
    try
      Result := SysParamBudgetValue(budgetId, 'ufk.fill', 'ufk.org_id');
      except
        ExceptionLog( 'Сбой Un_SysParams.SysParam_UFG_OrgID');
    end;
end;


function CheckRoleRightAll( aRoleRightAll: String): Boolean;
var
  xParams: Variant;
begin

    try
      Result := (QueryField ( ' Select count( * ) N From UserRoles Urs '
                             +' Join RoleRight Rr On Rr.UserRole_Id = Urs.UserRole_Id'
                             +' Where Urs.sysuser_Id = ? And Rr.SysRight_Name = ?',
                              [ UserID,
                                aRoleRightAll],
                              'N') <> '0');

      except
        ExceptionLog( 'Сбой Un_SysParams.CheckRoleRightAll');
    end;

end;


{~CheckRoleOrgAll
  проверка разрешения прав доступа тек.пользователя ко всем организациям.
  результат:
    =true - разрешение ко всем орг.есть
    =false - нет такого парава}
function CheckRoleOrgAll: Boolean;
begin

    try
      Result := CheckRoleRightAll( 'Orgs.All');

      except
        ExceptionLog( 'Сбой Un_SysParams.CheckRoleOrgAll');
    end;

end;


{~SysParam_RESPONSIBLEPERSONS}
function SysParam_RESPONSIBLEPERSONS: Variant;
var
  s: string;
  xDoc: Variant;
  xNode: Variant;

  function DoExtractParam( aAttr, aSuffix: string): boolean;
  var
    xPos: integer;
  begin

      try
        xPos := POS( aSuffix, s);
        if (xPos < 1) then begin
          // если подстроки не нашлось - результатом будет оставшаяся часть
          // строки, после чего считаем что строка разобрана полностью
          xNode.SetAttribute( aAttr, s);
          Result := FALSE;
          s := '';
        end else begin
          // если подстрока aSuffix нейдена - значение берем от начала строки
          // до суффикса, и затем удаляем все до подстроки суффикса,
          // включая саму подстроку суффикса.
          Result := TRUE;
          if ( xPos = 1)
            then xNode.SetAttribute( aAttr, '')
            else xNode.SetAttribute( aAttr, COPY( s, 1, xPos - 1));
          DELETE( s, 1, xPos + (LENGTH( aSuffix) - 1));
        end;

        except
          ExceptionLog( 'Сбой DoExtractParam');
      end;

  end;

begin

    try
      s := TRIM( VarToStr( QueryField( ' select p.param_value V from sysparam p'
                                      +' where p.name=?',
                                       [ 'ufk.responsiblepersons' ],
                                       'V')));

      { выполняем разбор параметра
        пример (это одна непрерывная строка не разделенная переводами строк!):
1000000129;0;148;
=HEAD_ID%dollar%1000000372
#HEAD_FIO%dollar%Н.А.Мошкова
#HEAD_POST_ID%dollar%
#HEAD_POST%dollar%Начальник финансового управления
#BOOKKEEPER_ID%dollar%1000000373
#BOOKKEEPER_FIO%dollar%О.Н.Борисова
#BOOKKEEPER_POST_ID%dollar%-3
#BOOKKEEPER_POST%dollar%Главный бухгалтер
#EXECUTOR_ID%dollar%
#EXECUTOR_FIO%dollar%Ф.Г.Баюшев
#EXECUTOR_POST_ID%dollar%
#EXECUTOR_POST%dollar%Системный администратор
#EXECUTOR_PHONE%dollar%(83176)5-02-43,
1000000127;
        }
      Result := CreateOleObject('Microsoft.XmlDom');
      xDoc := Result.appendChild( Result.createElement('DOCUMENT'));
      while (LENGTH(s) > 0) do begin

        xNode := xDoc.appendChild( Result.createElement('ITEM'));
        if NOT DoExtractParam( 'BudgetID'           , ';') then BREAK;
        if NOT DoExtractParam( 'VidID'              , ';') then BREAK;
        if NOT DoExtractParam( 'Class'              , ';') then BREAK;
        if NOT DoExtractParam( 'OrgID'              , '=HEAD_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'HEAD_ID'            , '#HEAD_FIO%dollar%') then BREAK;
        if NOT DoExtractParam( 'HEAD_FIO'           , '#HEAD_POST_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'HEAD_POST_ID'       , '#HEAD_POST%dollar%') then BREAK;
        if NOT DoExtractParam( 'HEAD_POST'          , '#BOOKKEEPER_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'BOOKKEEPER_ID'      , '#BOOKKEEPER_FIO%dollar%') then BREAK;
        if NOT DoExtractParam( 'BOOKKEEPER_FIO'     , '#BOOKKEEPER_POST_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'BOOKKEEPER_POST_ID' , '#BOOKKEEPER_POST%dollar%') then BREAK;
        if NOT DoExtractParam( 'BOOKKEEPER_POST'    , '#EXECUTOR_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'EXECUTOR_ID'        , '#EXECUTOR_FIO%dollar%') then BREAK;
        if NOT DoExtractParam( 'EXECUTOR_FIO'       , '#EXECUTOR_POST_ID%dollar%') then BREAK;
        if NOT DoExtractParam( 'EXECUTOR_POST_ID'   , '#EXECUTOR_POST%dollar%') then BREAK;
        if NOT DoExtractParam( 'EXECUTOR_POST'      , '#EXECUTOR_PHONE%dollar%') then BREAK;
        if NOT DoExtractParam( 'EXECUTOR_PHONE'     , ',') then BREAK;
      end;//while//
      except
        ExceptionLog( 'Сбой Un_SysParams.SysParam_RESPONSIBLEPERSONS');
    end;

end;


{~SysParam_RESPONSIBLEPERSONS_Details
  загрузка описания ответственных лиц
  из системного параметра «Ответственные лица»
  (Сервис – Системные параметры – Заполнение полей в документах).
  Одноименные поля строки параметра с соответствующими значениями
  полей бюджета, организация и вида (aVidID).

  параметр:
    aSysParamType:
      '-2' - генеральный
      '-3' - бух
      добавлено по exchange #2983
      '-5' - ответственный исполнитель
      '-52' - ответственный исполнитель - телефон в поле aResID

    aVidID - вид документа
      =0 - «Электронный документ»
      =3 - "все"
      =2 - информация для УФК


  если параметр aSysParamType и aBudgetID будут =пустые строки (оба параметра),
  то в системных настройках по #2831 поиск не выполняется.}
function SysParam_RESPONSIBLEPERSONS_Details( aBudgetID: string;
                                            aClass: string;
                                            aOrgID: string;
                                            aSysParamType: string;
                                            aVidID: string;
                                            var aResID: string;
                                             var aResFIO: string;
                                             var aResPOST: string): boolean;
var
  xXmlResperson: Variant;
  xNode: Variant;
  i: integer;
  xFound: integer;
  xIndex: integer;
begin

    try
      Result := FALSE;
      aResID:= '';
      aResFIO:= '';
      aResPOST:= '';

      // получаем данные из сиспараметра
      xXmlResperson := SysParam_RESPONSIBLEPERSONS;

      // в начале ищем с учетом бюджета и организации
      xFound := 0;
      xIndex := -1;

      for i := 0 to xXmlResperson.documentElement.childNodes.Length - 1 do begin
        xNode := xXmlResperson.documentElement.childNodes.Item[i];

        if (LENGTH( aBudgetID) > 0) then
          if (xNode.GetAttribute( 'BudgetID') <> aBudgetID)
            then CONTINUE;

        if (LENGTH( aOrgID) > 0) then
          if (xNode.GetAttribute( 'OrgID') <> aOrgID)
            then CONTINUE;

        if (LENGTH( aClass) > 0) then
          if (xNode.GetAttribute( 'Class') <> aClass)
            then CONTINUE;

        if (xNode.GetAttribute( 'VidID') <> aVidID)
          then CONTINUE;

        xIndex := i;
        INC( xFound);
      end;//for//


      // если нашли однозначно - берем эти параметры
      if (xFound = 1) then begin
        xNode := xXmlResperson.documentElement.childNodes.Item[ xIndex];
        case aSysParamType of
          '-2': begin
                // руководитель
                aResID := xNode.getAttribute( 'HEAD_ID');
                aResFIO := xNode.getAttribute( 'HEAD_FIO');
                aResPOST := xNode.getAttribute( 'HEAD_POST');
              end;
          '-3': begin
                // бух
                aResID := xNode.getAttribute( 'BOOKKEEPER_ID');
                aResFIO := xNode.getAttribute( 'BOOKKEEPER_FIO');
                aResPOST := xNode.getAttribute( 'BOOKKEEPER_POST');
              end;
          // exchange #2983
          '-5': begin
                // ответственный исполнитель
                aResID := xNode.getAttribute( 'EXECUTOR_ID');
                aResFIO := xNode.getAttribute( 'EXECUTOR_FIO');
                aResPOST := xNode.getAttribute( 'EXECUTOR_POST');
              end;
          // exchange #2983
          '-52': begin
                // ответственный исполнитель - телефон
                aResID := xNode.getAttribute( 'EXECUTOR_PHONE');
                aResFIO := xNode.getAttribute( 'EXECUTOR_FIO');
                aResPOST := xNode.getAttribute( 'EXECUTOR_POST');
              end;
        end;//case//
        Result := TRUE;
      end;

      except
        ExceptionLog( 'Сбой SysParam_RESPONSIBLEPERSONS_Details');
    end;

end;


{~SysParam_Type_not_defined_by_default
  значение сист.параметра:
    Сервис
      Системные параметры –
        Доходы
          Заполнять тип дохода значением «Не указано»
  результат:
    значение param_value.}
function SysParam_Type_not_defined_by_default: string;
begin

    try
      Result := QueryField( 'select p.param_value V from sysparam p '
                            +'where p.name=?',
                            [ 'income.type_not_defined_by_default' ],
                            'V');

      except
        ExceptionLog( 'Сбой SysParam_Type_not_defined_by_default');
    end;

end;

function SysParamBudgetValue(budgetId, pageName, paramName: String): string;
var
  XmlDoc: Variant;
begin
  try
    XmlDoc := CreateOleObject('Microsoft.XmlDom');
    XmlDoc.LoadXML('<EXCH_UTILS_PROCESSOR action="get_budget_param_value" ' +
      ' BUDGET_ID="' + budgetId + '" PAGE_NAME="' + pageName + '" PARAM_NAME="' + paramName + '"/>');
    XmlDoc.LoadXML(ExecXml(XmlDoc.xml));
    Result := XmlDoc.documentElement.getAttribute('PARAM_VALUE');
  except
    ExceptionLog('Сбой Un_SysParams.SysParamBudgetValue');
  end;
end;

function SysParamValue(paramName: String): string;
var
  SysParam: Variant;
begin
  try
    SysParam := CreateOleObject('Microsoft.XmlDom');
    with SysParam.appendChild(SysParam.createElement('EXCH_UTILS_PROCESSOR')) do
      begin
        setAttribute('action', 'get_sys_param_value');
        with appendChild(SysParam.createElement('SYSPARAM')) do
          setAttribute('NAME', paramName);
        SysParam.loadXml(ExecXml(SysParam.xml));
        SysParam := SysParam.getElementsByTagName('PARAM_VALUE');
        if SysParam.length = 1 then
          Result := SysParam.items[0].firstChild.Data;
      end;
  except
    ExceptionLog('Сбой Un_SysParams.SysParamValue');
  end;
end;

begin
end.
