4. Attestation (Recertification)
21 декабря 2021 г.
14:06
Identity Manager 8.1.2 - Attestation Administration Guide (oneidentity.com)
Включение вычисления RiskIndex
QER\CalculateRiskIndex
Структура аттестации
Attestation types включают в себя Attestation procedures. Просто группируя их.
Attestation procedures определяют базовый объект для аттестации, например - членство в Business role (объект PersonInOrg). В них задается отображение записи аттестации на портале - можно указать отображаемые свойства и колонки для группировки.
Значение Related object указывает на свяхь с другой таблицей, через указание XObjectKey (\$FK(UID_ADSAccount).XObjectKey\$), поля которого мы указываем в Grouping column 1 и т.п.
Compliance frameworks для классификации attestation policies, compliance rules, and company policies в соответствии с требованиями.
Attestation policies указывают конкретные условия для аттестации. В них указывается Attestation procedure, расписание.
Указывается условие Where для ограничения объектов для аттестации, которые указаны в Attestation procedure. Если мы на портале задаем условие для отбора объектов аттестации - то это условие сохраняется в Where Attestation policy!
В Attestation policy задается Apprval Policy, которая включает в себя Approval Workflow с шагами для прохождения аттестации.
| Additional approver possible | Specifies whether a current attestor is allowed to instruct another employee as an attestor. This additional attestor has parallel authorization to make approvals for the current attestation case. The attestation case is not passed on to the next approval level until both attestors have made a decision. This option can only be set for approval levels with a single, manual approval step. |
|---|---|
| Approval can be delegated | Specifies whether a current attestor can delegate the attestation to another person. This employee is added to the current approval step as the attestor. This employee then makes the approval decision instead of the attestor who made the delegation. This option can only be set for approval levels with a single, manual approval step. |
| Approval by affected employee | Specifies whether the employee who is affected by the approval decision can also approve it. If this option is set, employees to be attested can attest themselves. If this option is not set, use the QER | Attestation | PersonToAttestNoDecide configuration parameter to define whether the employees to be attested can attest themselves. |
| Do not show in approval history | Specifies whether or not the approval step should be displayed in the attestation history. For example, this behavior can be applied to approval steps with the CD - calculated approval procedure, which are used only for branching in the approval workflow. It It makes it easier to follow the attestation history. |
Для того, чтобы сотрудник мог сам себя аттестовать, надо поставить галку Approval by affected employee.
Recertifying existing users
IMPORTANT: Access to connected target systems may possibly be denied to One Identity Manager users as a result of recertification. You can configure this behavior to meet your company’s requirements. Read the following section thoroughly before you use the recertification function.
One Identity Manager provides an attestation policy for performing cyclical attestation of existing users allowing companies to regularly test and authorize employee master data stored in the One Identity Manager database. Cyclical attestation is triggered through a scheduled task. This resets the certification status for all employees stored in the database. One Identity Manager uses the same procedure for this as for attesting new users. The case is referred to as recertification.
Result of recertification
- Certified, activated employees who can access all entitlements
assigned to them in One Identity Manager and the connected target
systems.
Company resources are inherited. Account definitions are assigned to internal employees. -
OR -
-
Denied and permanently deactivated employees.
Disable employees cannot log in to One Identity Manager tools. Company resources are not inherited. Account definitions are not automatically assigned. User accounts associated with the employee are also locked or deleted. You can customize the behavior to meet your requirements.
Для того, чтобы выявлять определенных сотрудников по условиям (сотрудники с определенным индексом риска, например) надо править условие в Attestation policy!
Не отрабатывает автоудаление сотрудника из бизнес-ролей и групп при отклонении аттестации (ресертификации)
-
В QER\Attestation\AutoRemovalScope указать области, откуда будет удаляться сотрудник
-
В Workflow политики надо добавить дополнительный шаг EX с событием AUTOREMOVE
Identity Manager 8.1 - Attestation Administration Guide (oneidentity.com)
Условие отбора объектов для аттестации PersonInOrg с учетом членства сотрудника в определенной Бизнес-роли и его индекса риска
(EXISTS (select top 1 1 FROM (SELECT UID_Org FROM Org WHERE UID_Org IN ('8f42bafa-2350-4dac-81ac-c7aa117b269f','8e98371f-4d04-4f02-8266-00e1a4ae023f','19590942-9839-480f-8760-18a9aefc5c2b')) x WHERE x.UID_Org = PersonInOrg.UID_Org))AND(EXISTS (select top 1 1 FROM (SELECT UID_Person FROM Person WHERE RiskIndexCalculated >= 0 and RiskIndexCalculated \<= 0.1) p WHERE p.UID_Person = PersonInOrg.UID_Person))
Не удаляется пользователь из динамических Бизнес ролей при включенном параметре QER\Attestation\AutoRemovalScope\RoleMembership\RemoveDynamicRole
В версии 8.2 должно будет работать, так как там появится возможность делать исключения для динамических бизнес ролей.
Процесс ресертификации для Х5 (перевод сотрудника в другое подразделение)
Есть 2 расписания ресертификации - ежедневно (для проверки перевода сотрудника с высоким индексом риска в другое подразделение и плановое (3 года) для ресертификации сотрудников с высоким индексом риска)
При изменении подразделения сотрудника в его CustomProperty08 записывается строка NeedRecert (условие сработки процесса - индекс риска > значения определенного и отличие текущего департамента от прошлого).
При создании AttestationCase проверяется CustomProperty08 на значение NeedRecert и если оно там записано - создается AttestationCase.
В PropertyInfo3 AttestationCase записывается UID_Person, чтобы определить в его в шаге зачистки кастомных параметров
В Workflow на последнем шаге затирается CustomProperty08 сотрудника, чтобы аттестация не возникала снова на следующий день.
Процесс ресертификации для Х5 (изменение руководителя сотрудника)
Так как при изменении руководителя сотрудника с высоким индексом риска нужно проводить согласование с предыдущим руководителем, то при изменении руководителя UID прошлого руководителя записывается в CustomProperty09.
При создании AttestationCase проверяется CustomProperty09 на не пустое значение и если оно там записано - создается AttestationCase.
В AttestationCase CustomProperty09 сохраняется в Property4 template для того, чтобы в Workflow в шаге выяснения был ли предыдущий руководитель делать проверку на заполненность поля (NOT isnull(PropertyInfo4, N'') = N'') и после этого отправлять на согласование предыдущему руководителю.
В PropertyInfo3 AttestationCase записывается UID_Person, чтобы определить в его в шаге зачистки кастомных параметров
В Workflow на последнем шаге затирается CustomProperty09 сотрудника, чтобы аттестация не возникала снова на следующий день.
Событие Autoremove для AttestationCase - чтобы удалить членство в Бизнес ролях!
Attestation by mail
Информирование о необходимости аттестовать
Настройки в QER\Attestation\MailApproval
Надо включить QER\Attestation\MailTemplateIdents\RequestApproverByCollection для того, чтобы приходило одно письмо, а не несколько
Запуск расписания Inform approver about pending attestations для отправки писем
Условие отбора Attestation cases по дате устройства сотрудника
Выводятся PersonInOrg (членства в бизнес ролях), которые работают 3,6,9 … лет для ресертификации
select centralaccount, EntryDate, DateDiff(yy, EntryDate, GetUTCDate()) as DateDif from Person where DateDiff(dd, EntryDate, GetUTCDate()) % 1095 = 0 and DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0
Условие WHERE для Attestation Policy
(EXISTS (select top 1 1 FROM (SELECT UID_Person FROM Person WHERE RiskIndexCalculated >= 0.5 and RiskIndexCalculated \<= 1 and DateDiff(dd, EntryDate, GetUTCDate()) % 1095 = 0 and DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0 and isInActive = '0') p WHERE p.UID_Person = PersonInOrg.UID_Person))
По расписанию - запускать каждый день.
Вывод членства UNSAccount в UNSGroup (ADSAcoountInADSGroup, UNSAccountBInUNSGroupB …)
Условие WHERE для Attestation Policy
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person
WHERE
RiskIndexCalculated >= 0.5
AND RiskIndexCalculated \<= 1
)
)
)
Доп (с учетом тех, кто устроился 3,6,9 … лет от текущей даты)
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person
WHERE
RiskIndexCalculated >= 0.5
AND RiskIndexCalculated \<= 1
AND DateDiff(dd, EntryDate, GetUTCDate()) % 1097 = 0
AND DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0
AND isInActive = '0'
)
)
)
С учетом исключений
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person
WHERE
(
RiskIndexCalculated >= 0.2
AND RiskIndexCalculated \<= 0.69
AND DateDiff(dd, EntryDate, GetUTCDate()) % 1097 = 0
AND DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0
AND isInActive = '0'
)
OR (
RiskIndexCalculated >= 0.7
AND isInActive = '0'
)
)
AND UID_UNSAccount NOT IN (
SELECT
UID_ADSAccount
FROM
ADSAccount
WHERE
CCC_msExchExtAttr27 = 'CEO -1'
OR CCC_msExchExtAttr27 = 'CEO -2'
OR SAMAccountName = 'User040-3'
OR Department LIKE N'Наблюдательный совет'
)
)
)
С учетом новых случаев и кол-во дней (100) от ресертификации
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person
WHERE
(
--DefaultEmailAddress is not null
isInActive = '0'
)
OR (
RiskIndexCalculated >= 0.7
AND isInActive = '0'
)
)
AND UID_UNSAccount NOT IN (
SELECT
UID_ADSAccount
FROM
ADSAccount
WHERE
CCC_msExchExtAttr27 = 'CEO -1'
OR CCC_msExchExtAttr27 = 'CEO -2'
OR SAMAccountName = 'User040-3'
OR Department LIKE N'Наблюдательный совет'
OR Mail is null
)
AND UID_UNSAccount IN (
SELECT
UID_ADSAccount
FROM
ADSAccount
WHERE
UID_DPRNameSpace = 'ADS-DPRNameSpace-ADS'
)
)
)
AND(
not EXISTS (
SELECT
top 1 1
FROM
AttestationCase
WHERE
ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey
AND UID_AttestationRun IN (
SELECT
UID_AttestationRun
FROM
AttestationRun
WHERE
UID_AttestationPolicy = '\$UID_AttestationPolicy\$'
AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \< 100
--AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0
-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0
)
)
)
С учетом новых случаев, старше определенного года
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person
WHERE
(
--DefaultEmailAddress is not null
isInActive = '0'
)
OR (
RiskIndexCalculated >= 0.7
AND isInActive = '0'
)
)
AND UID_UNSAccount NOT IN (
SELECT
UID_ADSAccount
FROM
ADSAccount
WHERE
CCC_msExchExtAttr27 = 'CEO -1'
OR CCC_msExchExtAttr27 = 'CEO -2'
OR SAMAccountName = 'User040-3'
OR Department LIKE N'Наблюдательный совет'
OR Mail is null
)
)
)
AND(
Not EXISTS (
SELECT
top 1 1
FROM
AttestationCase
WHERE
ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey
AND UID_AttestationRun IN (
SELECT
UID_AttestationRun
FROM
AttestationRun
WHERE
UID_AttestationPolicy = '\$UID_AttestationPolicy\$'
AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<= 1097
--AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0
-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0
)
)
)
AND(
DateDiff(yy, XDateInserted, GetUTCDate()) > 1
)
Рабочая версия?
(
UID_UNSAccount IN (
SELECT
UID_UNSAccount
FROM
UNSAccount
WHERE
UID_Person IN (
SELECT
UID_Person
FROM
Person p
WHERE
UID_Department NOT IN (
SELECT
UID_Department
FROM
Department
WHERE
DepartmentName = N'Supply Chain' -- Наблюдательный совет
)
AND (
--DefaultEmailAddress is not null
isInActive = '0'
AND p.CentralAccount = 'User040'
)
OR (
RiskIndexCalculated >= 0.7
AND isInActive = '0'
)
)
AND UID_UNSAccount NOT IN (
SELECT
UID_ADSAccount
FROM
ADSAccount
WHERE
CCC_msExchExtAttr27 = 'CEO -1'
OR CCC_msExchExtAttr27 = 'CEO -2'
OR SAMAccountName = 'User040-3'
OR Department LIKE N'Наблюдательный совет'
-- OR Mail IS NULL
)
)
)
AND(
NOT EXISTS (
SELECT
top 1 1
FROM
AttestationCase
WHERE
ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey
AND UID_AttestationRun IN (
SELECT
UID_AttestationRun
FROM
AttestationRun
WHERE
UID_AttestationPolicy = '\$UID_AttestationPolicy\$'
AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<= 2 --AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0
-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0
)
)
)
--AND(DateDiff(yy, XDateInserted, GetUTCDate()) > 1)
Убрать колонку RiskIndex на портале при согласовании аттестации
-
Конфигурационный параметр Display columns of table "Attestation case"
-
В компоненте VI_Attestation_EditCases_Default убрать RiskIndex
В модуле VI_Attestation удалить как расширение RiskIndex колонку
В компоненте VI_Attestation_AttestationCase_ViewMultiplyPolicy
Добавить колонку Product для отображения в кейсах аттестации
- В Manager зайти в Attestation, Attestation Procedures и в нужной процедуре Grouping Column (template) =\$FK(UID_UNSGroup).FK(UID_AccProduct).Ident_AccProduct\$
Grouping Column = Product
- В WebDesigner сделать копию компонента VI_Attestation_AttestationCase_ViewMultiplyPolicy и добавить колонку дополнительную
Изменения в модулях аттестации
VI_Attestation
- Удаление в кастомной конфигурации Column22 - RiskIndex
- Удаление ContainerColumnTemplate2
- Добавлен редирект на Form2 - вместо того, чтобы сначала отображать типы объектов ресертификации
CCC_Attestation_AttestationCaseViewMultiplePolicy
-
Удалена колонка RiskIndex (Column1)
-
Добавлена виртуальная функция DenySelectAllValue() в ComponentInterface1
-
В VI_Common_DecisionControl - DenySelectAll() = DenySelectAllValue() (значение которого передается из компонента CCC_Attestation_AttestationCase)
CCC_Attestation_AttestationCase
- Удален Case1, Case2
-
Case2 скопирован в Case4
-
В Case4 удален Tab Page (Iteration) - AttestationPolicy
- Добавлен Tab Page (Iteration) - ProductCategory
-
Добавлена таблица ProductCategory (на основе AccProductGroup)
-
Загрузка категорий происходит
Workflow согласования - учет контейнера AD и предыдущего менеджера
- В Manager зайти в Attestation, Attestation Procedures и в нужной процедуре Property3 (template) = \$FK(UID_UNSAccount).FK(UID_UNSContainer).cn\$
Property3 = CN ADS_Container
Property4 (template) = \$FK(UID_UNSAccount).FK(UID_Person).CustomProperty09\$
Property4 = Previous Manager
Вид на портале
Не удается указать кастомную Approval Policy для Attestation Policy
Нужно временно у Approval Policy указать Approval Workflow одной из Approval Policy, которую можно назначить
Затем, в Attestation Procedures назначить (Assign Approval Policy) кастомную Approval Policy (которая должна отобразиться)
Обратно вернуть кастомный Approval Workflow для кастомной Approval Policy.
But you can create a custom approval procedure and copy the query from the approval procedure "OR" to your custom approval procedure and assign the necessary tables. Than use your custom approval procedure in your workflow.
Расчет согласования предыдущего руководителя - Approval procedure
select pers.CustomProperty09 as UID_Person ,dbo.QER_FGIPWORulerOrigin(p.XObjectKey) as UID_PWORulerOrigin
from AttestationCase ac join ADSAccountInADSGroup p on ac.ObjectKeyBase = p.XObjectKey join ADSAccount adsa on p.UID_ADSAccount = adsa.UID_ADSAccount join Person pers on adsa.UID_Person = pers.UID_Person
where ac.UID_AttestationCase = @UID_AttestationCase
!На основе истории TimeTrace
SELECT
top 1 wprop.ContentShort AS UID_Person,
dbo.QER_FGIPWORulerOrigin(p.XObjectKey) AS UID_PWORulerOrigin
FROM
attestationCase ac
JOIN UNSAccountInUNSGroup p ON ac.ObjectKeyBase = p.XObjectKey
JOIN Person pers ON pers.UID_Person = ac.PropertyInfo2
JOIN DialogWatchOperation wop ON SUBSTRING(wop.ObjectKeyOfRow, 22, 36) = pers.UID_Person
JOIN DialogWatchProperty wprop ON wprop.UID_DialogWatchOperation = wop.UID_DialogWatchOperation
WHERE
ac.UID_AttestationCase = @UID_AttestationCase
AND wprop.UID_DialogColumn = 'QER-76BFB981AA5F4D69BE4E9014D1605E56'
AND wop.OperationType = 'U'
ORDER BY
wop.OperationDate DESC
//
.UID_DialogColumn = 'QER-76BFB981AA5F4D69BE4E9014D1605E56' - это по изменению колонки UID_PersonHead (руководитель)
OperationType = 'U' - это Update
SUBSTRING(wop.ObjectKeyOfRow, 22, 36) - откусить UID_Person
wop.OperationDate DESC - сначала свежие записи - последний руководитель
----
Не вызываются события на таблице AttestationCase
Причина в том, что не хватает прав на вызов событий.
Можно из Workflow генерировать кастомное событие, которое будет подхватываться процессом на таблице AttestationCase, как вариант.
Форма на портале
CCC_Attestation
Form4 - для отображения категорий продуктов
Form5 - для отфильтрованных по категориям продуктов AttestationCases
Запуск AttestationCases
I would create a script that creates the attestation cases for your attestation policy. The script can use a method available at enabled AttestationPolicy objects that allow you to specify the object keys you want to attest.
You can check the available methods in the object properties windows, tab called Methods. The method for your case would be CreateAttestations(String[] objectKeys) which takes an string array of object keys you want to attest using the current attestation policy. It returns an array of DBObjectKey objects.
So you just need to call the script using the SOAP / REST API.
Или из скрипта
Public Function CCC_AttestationPolicy_CreateForSingleObject(ByVal uidAttestationPolicy As String, ByVal objectkey As String) As String
Try
Dim policy As ISingleDbObject = Connection.CreateSingle("AttestationPolicy", uidAttestationPolicy)
Dim objectKeyAttestationCase As String = policy.Custom.CallMethod("CreateAttestation", objectkey).ToString
Return objectKeyAttestationCase
Catch ex As Exception
Return String.Empty
End Try
End Function
Here uidAttestationPolicy is the policy you want to trigger and objectkey is pointing to the record you want policy to be triggered against.
Hope it helps.
Вызов метода CreateAttestations из скрипта
Public Function CCC_AttestationPolicy_CreateForSingleObject(ByVal uidAttestationPolicy As String, ByVal objectkey As String) As String
Dim dbAttestationPolicy As IEntity
Dim arrObjectkey() As String = {objectkey}
dbAttestationPolicy = Session.Source.Get("AttestationPolicy", uidAttestationPolicy)
dbAttestationPolicy.CallMethod("CreateAttestations", arrObjectkey)
dbAttestationPolicy.Save(Session)
Return "OK"
End Function
При отказе от доступа обычным пользователем при ресертификации выходит ошибка на портале
Error executing script 'VI_AttestationCase_GetRemoveMembershipActions'.
Could not create single object for table ADSAccountInADSGroup.
Object of type Учетные записи пользователей Active Directory: назначения групп does not exist in database or you do not have the relevant viewing permissions.
(2022-06-17 16:34:08)
Проблема связана с тем, что в процессе согласования (Workflow) есть шаг с вызовом события AUTOREMOVE.
На портале при присутствии этого шага запускается скрипт проверки, чтобы высветить сообщение о возможном удалении из групп. Этот скрипт дает сбой. Это баг, есть лечение - Error executing AutoRemove Actions with script VI_AttestationCase_GetRemoveMembershipActions (299351) (oneidentity.com)
Проблему можно обойти, если сделать вызов кастомного события и по нему запуск процесса с копией шага, который удаляет членство (для таблицы AttestationCase).
Не корректно отображаются кнопки Утвердить все, Отказать все (ApproveAll, DenyAll)
Причина в том, что не корректно передается параметр DenySelectAll() для компонента VI_Common_DecisionControl
Я создал копию VI_Common_DecisionControl и в нем создал ещё один ComponentInterface DenySelectAllValue().
Значения передавал в него.
В условиях отображения кнопок учитывал значение DenySelectAllValue().
Адрес на портале - список аттестаций
Отправка письма о завершении ресертификации
Проблема была в том, что нужно отправлять одно письмо по нескольким AttestationCases.
Если делать просто в конце процесса согласования отправку письма, то будет отправлено столько писем, сколько случаев аттестаций.
Решение:
Сначала идет рандомная задержка в пределах 10 сек, через скрипт (элемент процесса выдает одинаковое значение задержки)
Потом AttCase закрывается с позитивным результатом.
Потом идет скрипт проверки -
Если остались открытые AttCases для этого AttRun - то возвращается False и письмо не отправляется.
Если открытых AttCases не осталось - идет проверка.
Получаем дату и время самого старого AttCase и сравниваем эту дату с датой текущего AttCase, который обрабатывается.
Если даты совпадают - значит AttCase самый старый и отправляем письмо.
Скрипт задержки (Delay process - Script)
Public Sub CCC_Recertification_Delay
Dim Random As Integer = CInt(Int((10000 * Rnd())))
Threading.Thread.Sleep(Random)
'MsgBox(Random)
End Sub
--
Make Positive Decision - стандартный
--
Check exists opened Att Cases via Script
Public Function CCC_RecertCheckLastAttCase (ByVal UidAttCase As String, ByVal UidRecertPerson As String, ByVal AttRun As String) As Boolean
Dim f As ISqlFormatter = Session.SqlFormatter
Dim ClosedAttestationCases As IEntityCollection
Dim DateHead As String
Dim DatesClosedAtt As New List(Of String)
Dim dtHead As String = ""
Dim LastDateHead As String
Dim CountOpenAttCases As Integer = 0
Dim Random As Integer = CInt(Int((10000 * Rnd())))
Threading.Thread.Sleep(Random)
Dim qCountOpenAttCases = Query.From("AttestationCase") _
.Where(Function (c) c.Column("PropertyInfo2") = UidRecertPerson And c.Column("UID_AttestationRun") = AttRun And c.Column("IsClosed") = "False") _
.SelectCount()
CountOpenAttCases = Session.Source.GetCount(qCountOpenAttCases)
If CountOpenAttCases > 0 Then
Return False
End If
Dim qClosedAttestationCases = Query.From("AttestationCase") _
.Where(Function (c) c.Column("PropertyInfo2") = UidRecertPerson And c.Column("UID_AttestationRun") = AttRun And c.Column("IsClosed") = "True") _
.OrderBy("DateHead") _
.SelectAll()
ClosedAttestationCases = Session.Source.GetCollection(qClosedAttestationCases)
For Each colElement As IEntity In ClosedAttestationCases
DateHead = colElement.GetValue("DateHead").ToString()
DatesClosedAtt.Add(DateHead)
Next
Dim WhereClause As String = f.UidComparison("UID_AttestationCase", UidAttCase)
Session.Source().TryGetSingleValue(Of String)("AttestationCase","DateHead",WhereClause,dtHead)
LastDateHead = DatesClosedAtt(DatesClosedAtt.Count - 1).ToString()
If LastDateHead = dtHead Then
Return True
Else
Return False
End If
End Function
Send mail - стандартный
Для Delay process - Script, Make Positive decision, Check Exists установлен флаг DBQueue does not wait
Не отзываются права при достижении Timeout
Должно быть включено расписание "Checks reminder interval and timeout of attestation cases"
Проверка изменения значения колонки на основе исторических данных (TimeTrace)
SELECT
COUNT(OperationDate)
FROM
DialogWatchProperty wprop
JOIN DialogWatchOperation wop ON wprop.UID_DialogWatchOperation = wop.UID_DialogWatchOperation
JOIN Person pers ON SUBSTRING(wop.ObjectKeyOfRow, 22, 36) = pers.UID_Person
WHERE
pers.UID_Person = '5544521f-27eb-4993-8679-b27b5428cfb4'
AND wprop.UID_DialogColumn = (
SELECT
UID_DialogColumn
FROM
DialogColumn
WHERE
ColumnName = 'UID_Department'
AND UID_DialogTable = 'QER-T-Person'
)
AND wop.OperationType = 'U'
AND DateDiff(dd, wop.OperationDate, GetUTCDate()) \< 1
Проблемки при переводе сотрудника и ресертификации его доступов:
-
При условии, что предыдущий руководитель \<> текущему может быть ситуация, когда у сотрудника нет руководителя и он появляется - условие удовлетворяется, но фактически перевод не состоится в другое подразделение. То есть, триггер смены руководителя не всегда означает смену подразделения.
-
Перевод сотрудника, через увольнение
-
Если уволился текущий руководитель сотрудника
-
Если сотрудник уволен и потом принят в тот же департамент - считать ли это переводом? У него перед прошлым был департамент 123, потом департамент стал 0, потом департамент снова становится 123
-
Надо учитывать дату мероприятия. Может быть случай, когда у сотрудника поменялся новый департамент на null?
/media/image1.png)
/media/image2.png)
/media/image3.png)
/media/image4.png)
/media/image5.png)
/media/image6.png)
![CCC_Attestation_AttestationCase_ViewMuItipIePoIicy Configuration Definition Initializer Control list Gridl Grid band: AttestationCase Extended properties Database access options List view ControlList2 Title Actions Content GridFiItersI Row definitions DisplayName StructureOispIa}I [E]uu Header cell A Product Ce112 A from AttestationCase select current DisplayVaIue(StructureDispIayI) UID_AttestationPoIicy AttestationStateDispIay IsNotApproved8eforeProxy](../media/4. Attestation (Recertification)/media/image7.png)
/media/image8.png)
/media/image9.png)
/media/image10.png)
/media/image11.png)
/media/image12.png)
/media/image13.png)
/media/image14.png)
/media/image15.png)
/media/image16.png)
/media/image17.png)
/media/image18.png)