' Скрипт на открытие
' Проверяет пренадлежность открывающего пользователя к шгруппе DV или подразделениям в совйстве 'Подразделениея'
'
' v 1.2.1

Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)

    DoEvent = 0

    Dim Units, Unit, CurrentUserID, Flag, CollEmpty
    CurrentUserID = StaffObject(UserSession).GetCurrentUserID
    If IsEmployeeInGroup(UserSession, "Божественная двшная группа", CurrentUserID) Then
        Exit Function
    End If

    Set Units = Prop(CardData, "Подразделения")
    If Not Units Is Nothing Then
        Flag = False: CollEmpty = True
        For Each Unit In SubSect(Units, "SelectedValues").Rows
            CollEmpty = False
            If IsEmployeeInUnit(UserSession, Unit.Value("SelectedValue"), CurrentUserID) Then
                Flag = True
                Exit For
            End If
        Next
        If Not (Flag Or CollEmpty) Then
            MsgBox "Доступ к карточке запрещен", vbOKOnly Or vbExclamation, "Предупреждение"
            DoEvent = 8 ' 8 - закрыть карточку
        End If
    End If

End Function

' Проверить вхождение пользователя в группу DV
Function IsEmployeeInGroup(UserSession, GroupAlias, EmployeeID)
    Dim Row
    For Each Row In Sect(RefStaff(UserSession), "AlternateHierarchy").AllRows
        If Row.Value("Name") = GroupAlias Then
            IsEmployeeInGroup = StaffObject(UserSession).IsEmployeeInGroup(EmployeeID, Row.ID)
            Exit Function
        End If
    Next
    IsEmployeeInGroup = False
End Function

' Проверить вхождение пользователя в подразделение и дочерние подразделения
Function IsEmployeeInUnit(UserSession, UnitID, EmployeeID)
    Dim Employee, CurUnit
    Set Employee = Sect(RefStaff(UserSession), "Employees").GetRow(EmployeeID)
    Set CurUnit = Employee.SubSection.ParentRow
    Do While Not (IsNull(CurUnit) Or CurUnit Is Nothing)
        If GoodGuid(CurUnit.ID) = GoodGuid(UnitID) Then
            IsEmployeeInUnit = True
            Exit Function
        End If
        Set CurUnit = CurUnit.ParentRow
    Loop
    IsEmployeeInUnit = False
End Function

' Нормализуем гуид
Function GoodGuid(Guid)
    If IsNull(Guid) Then
        GoodGuid = Guid
        Exit Function
    End If
    GoodGuid = UCase(Replace(Replace(CStr(Guid), "{", ""), "}", ""))
End Function

' Справочник сотрудников
Function RefStaff(UserSession)
    Set RefStaff = UserSession.CardManager.DictionaryData("{6710B92A-E148-4363-8A6F-1AA0EB18936C}")
End Function

' Получение StaffObject
Function StaffObject(UserSession)
    Set StaffObject = CreateObject("TOHelperObjects.StaffObject")
    Set StaffObject.UserSession = UserSession
End Function

' Получение секции карточки по имени
Function Sect(CardData, Alias)
    Set Sect = CardData.Sections(CardData.Type.AllSections.GetByAlias(Alias).ID)
End Function

' Получение подчиненной секции по имени
Function SubSect(RowData, Alias)
    Set SubSect = RowData.ChildSections(RowData.Section.Type.ChildSections.GetByAlias(Alias).ID)
End Function

' Нулевая строка секции MainInfo
Function MainInfo(CardData)
    Set MainInfo = Sect(CardData, "MainInfo").FirstRow
End Function

' Строка свойства
Function Prop(CardData, Alias)
    Set Prop = Nothing
    Dim Row: For Each Row In Sect(CardData, "Properties").Rows
        If Row.Value("Name") = Alias Then
            Set Prop = Row
            Exit Function
        End If
    Next
End Function

' Получение значения свойства
Function GetProp(CardData, Alias, DefaultValue)
    Dim Row: Set Row = Prop(CardData, Alias)
    If Row Is Nothing Then
        GetProp = DefaultValue
    Else
        GetProp = Row.Value("Value")
        If IsNull(GetProp) Then GetProp = DefaultValue
    End If
End Function