Добрый день !)

В системе существует роль "РПМ" внутри этой роли 15-20 пользователей .

 

Если отправить на визу в эту Роль то - по документации любой из этих пользователей может утвердить или отклонить эту визу. 

  • [ Роли ] — выберите из справочника определенную организационную или функциональную роль. Так любой из сотрудников, входящих в эту роль, сможет выполнить визирование.

 В данной задаче нужно чтобы в ходе процесса была виза от каждого сотрудника отдельно. 

Суть:

Если есть хотя бы одна отрицательная виза идём в другие этапы, после выполнения этих этапов снова оправляем на визу тому сотруднику от кого была получена эта отрицательная виза.

 

Сделать 20 отдельных виз со всеми исходами пока что кажется нецелесообразным . Поделитесь пожалуйста с опытом )))

Нравится

1 комментарий

Думаю, вы вполне можете добавлять визирование через элемент БП "Добавить данные", а отслеживать окончание визирование через старт БП на изменение статуса визы. Таким образом, далее уже в БП добавляете свою логику

Показать все комментарии

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.
Что уже сделал?
Сейчас контакт выглядит следующим образом

Как описано в документации добавил лэндинг. Сжато он выглядит так:

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

Нравится

5 комментариев
Лучший ответ

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

Зверев Александр,

Добрый день, подскажите как разрешить службу? Так полагаю что это что-то связанное с настройками приватности функции или что-то вроде того.

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

Зверев Александр,
исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

Похожий вопрос обсуждается тут. Но Вы обращались к стандартному веб-сервису, там всё должно уже было быть настроено. Возможно, дело именно в том, что Вы разворачиваете свою страницу с формой внутри того же сайта. Попробуйте для теста сначала размещать веб-форму на полностью другом сервере.

Показать все комментарии

В API текущего приложения, не входит каких либо инструментов для упрощенной работы с элементами организационной структуры:
"Функциональные роли", "Организационные юниты", "Пользователи" (само по себе)
Уже обсуждалось вот в этой теме
Там же я выложил первые наработки, миксин-модуля с некоторыми методами решающими классические "юзкейсы".
С тех пор его пришлось существенно доработать и расширить функционал, по этому выложу его в этой отдельной теме для тех кому может понадобиться.
Во вложении (ZIP-архив) вы найдете исчерпывающую документацию в виде HTML-страницы.
Модуль реализован в виде "миксина", т.е. без каких либо трудностей подключайте в любой схеме и пользуйтесь на здоровье :) так же в конце темы есть исходный код, а так-же Уже готовая к импорту схема в виде MD-файла.
Краткое описание:
getRelAU ([id], callback, [contactModeFlag], [scope]);
Получить информацию об административных юнитах связанных с пользователем, по его идентификатору Id или Id связанного с ним контакта, или для текущего пользователя если опустить первый аргумент.
(элементы "Организационной структуры", "Функциональные роли", "Организации", "Роли руководителей" (если он в них входит)) в виде структурированного объекта с дополнительной информацией (н/п о родительских OU/FU) будут переданы в callback вызов.
checkUserInAU (AUname, [AUtype], [UserId], callback, [scope])
Проверить принадлежит ли текущий пользователь (или произвольный по его Id) к конкретному административному юниту по его имени (элементу "Организационной структуры", "Функциональные роли", "Организации").
В целях оптимизации предусмотрен поиск только по конкретным типам Орг.юнитов. Результат передается в виде булева примитива в callback-функцию
getUsersFromRole (RoleId, [getManagerFlag], callback, [scope])
Получить всех пользователей непосредственно входящих в целевые орг.юнит или функциональную роль, в том числе руководителей (пользователей из специалищированного связанного орг.юнита).
Коллекция пользователей будет передана в callback-функцию

Исходный код:

define("UserUtilsMixin", ["UserUtilsMixinResources"],
        function(resources) {
                Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", {
                        "alternateClassName": "Terrasoft.UserUtilsMixin",
                        "getRelAU": function(UserId, callback, UseContactIdFlag, scope) {
                                var serviceScope;
                                if (callback === undefined) {
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof callback === "object") {
                                        scope = callback;
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UseContactIdFlag === "object") {
                                        scope = UseContactIdFlag;
                                        UseContactIdFlag = false;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                } else if (scope.scope) {
                                        serviceScope = scope;
                                        scope = scope.scope;
                                }
                                function mainLogick(UserId, callback) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        var filter = this.scope.Terrasoft.createColumnFilterWithParameter(
                                                this.scope.Terrasoft.ComparisonType.EQUAL,
                                                "SysUser",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.addColumn("SysRole");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType");
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response && response.success) {
                                                                var resultObject = {
                                                                        FuncRoles: [],
                                                                        OrgUnits: [],
                                                                        Organizations: [],
                                                                        Managers: [],
                                                                        Teams: []
                                                                };
                                                                response.collection.each(function(item) {
                                                                        var wrapObj = {
                                                                                name: item.values.AuName,
                                                                                id: item.values.SysRole.value,
                                                                                parentAU: item.values.Parent
                                                                        };
                                                                        var type = item.values.AuType;
                                                                        if (type === "Division") {
                                                                                resultObject.OrgUnits.push(wrapObj);
                                                                        } else if (type === "Функциональная роль") {
                                                                                resultObject.FuncRoles.push(wrapObj);
                                                                        } else if (type === "Organization") {
                                                                                resultObject.Organizations.push(wrapObj);
                                                                        } else if (type ===  "Manager") {
                                                                                resultObject.Managers.push(wrapObj);
                                                                        } else if (type ===  "Team") {
                                                                                resultObject.Teams.push(wrapObj);
                                                                        }
                                                                });
                                                                if (serviceScope) {
                                                                        this.callback.call(serviceScope, resultObject);
                                                                } else {
                                                                        this.callback.call(scope, resultObject);
                                                                }
                                                        }
                                                },
                                                {callback: callback, scope: this.scope}
                                        );
                                }
                                var wrapOfMainLogick = mainLogick.bind({scope: scope, callback: callback});
                                if (UseContactIdFlag) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        var filter = this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL,
                                                "Contact.Id",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response.collection.getCount() !== 1) {
                                                                this.scope.log("(getRelAU) Target Contact is not associated with User", Terrasoft.LogMessageType.ERROR);
                                                        } else {
                                                                this.mainLogick(response.collection.getByIndex(0).values.Id, this.callback);
                                                        }
                                                },
                                                {
                                                        scope: scope,
                                                        mainLogick: wrapOfMainLogick,
                                                        callback: callback
                                                }
                                        );
                                } else {
                                        wrapOfMainLogick(UserId, callback);
                                }
                        },
                        "checkUserInAU": function(AUname, AUtype, UserId, callback, scope) {
                                if (typeof AUtype === "function" && UserId === undefined) {
                                        callback = AUtype;
                                        AUtype = "ALL";
                                        if (typeof UserId === "object") {
                                                scope = UserId;
                                        }
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId === "function") {
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId !== "object") {
                                        scope = this;
                                }
                                this.getRelAU(UserId, function(result) {
                                        var CompareResult = false;
                                        switch (this.AUtype) {
                                                case "OU":
                                                        for (var OU in result.OrgUnits) {
                                                                if (this.AUname === result.OrgUnits[OU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "FR":
                                                        for (var FU in result.FuncRoles) {
                                                                if (this.AUname === result.FuncRoles[FU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "ORG":
                                                        for (var orgIndex in result.Organizations) {
                                                                if (this.AUname === result.Organizations[orgIndex].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                default:
                                                        for (var each in result) {
                                                                for (var subarray in result[each]) {
                                                                        if (this.AUname === result[each][subarray].name) {
                                                                                CompareResult = true;
                                                                        }
                                                                }
                                                        }
                                                        break;
                                        }
                                        this.callback.call(this.scope, CompareResult);
                                }, {
                                        scope: scope,
                                        AUtype: AUtype,
                                        AUname: AUname,
                                        callback: callback
                                });
                        },
                        "getUsersFromRole": function(RoleId, getManager, callback, scope) {
                                var getManagerFlag = false, filter = Terrasoft.createFilterGroup(), esq;
                                if (typeof getManager === "function") {
                                        callback = getManager;
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                } else {
                                        getManagerFlag = getManager;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                }
                                if (getManagerFlag) {
                                        filter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "ParentRole",
                                                        RoleId
                                                )
                                        );
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysAdminUnitTypeValue",
                                                        2
                                                )
                                        );
                                        esq.addColumn("Name");
                                } else {
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysRole",
                                                        RoleId
                                                )
                                        );
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Name", "UserName");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Id", "UserId");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Contact", "Contact");
                                }
                                esq.filters.addItem(filter);
                                esq.getEntityCollection(
                                        function(response) {
                                                var cleanArray = [];
                                                if (this.getManagerFlag) {
                                                        this.scope.getUsersFromRole(
                                                                response.collection.getByIndex(0).values.Id,
                                                                this.callback,
                                                                this.scope
                                                        );
                                                } else {
                                                        response.collection.each(function(elem) {
                                                                elem.values.Id = elem.values.UserId;
                                                                delete elem.values.UserId;
                                                                cleanArray.push(elem.values);
                                                        });
                                                        this.callback.call(this.scope, cleanArray);
                                                }
                                        }, {
                                                scope: scope,
                                                callback: callback,
                                                getManagerFlag: getManagerFlag
                                        }
                                );
                        }
                });
        });

Нравится

7 комментариев

Здравствуйте!

Полезная информация, спасибо.

код миксина обновлен (исправлены некоторые проблемы, добавлены некоторые решения), MD-файл из приложений убрал он не актуален.
берите код из листинга в теме.

примеры для вызова getRelAU

//Получаем результирующий объект для текущего пользователя
this.getRelAU(
         function(result) {
                console.log(result);
         }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
         function(result) {
                console.log(result);
         }
, context);
//Получаем результирующий объект для пользователя с id "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D"
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
   function(result) {
        console.log(result);
    }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
    function(result) {
        console.log(result);
    }
, context);
//Получаем результирующий объект для пользователя связанного с контактом id которого "E7D525FB-88EE-4947-94CC-D013E85D2F79"
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true
 );
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true,
    context
);

в схему корректно не выгружается кириллица, а поскольку в SysAdminUnitType одна только "Функциональная роль" названа кириллицей.
То после импорта схемы посмотрите в исходник, там где "кракозебры" замените на "Функциональная роль"
Будет время, обновлю MD-корректный

                      

Получилось запустить, но думаю стоит добавить полный код схемы с примером как его использовать. это многим поможет. дело в том, что этот код будут использовать только те кто начинает, им как раз нужна полная инф. 

Севостьянов Илья Сергеевич,

подскажите, пожалуйста, что за UserUtilsMixinResources передается в зависимости? его нужно создать отдельно?

define("UserUtilsMixin", ["UserUtilsMixinResources"]

 

создала у себя миксин, но без этого UserUtilsMixinResources, а также изменив названия миксина в 3 местах. когда его подключаю в своем клиентском модуле, выходит ошибка.

Есть какие-то особенности при этого подключении миксина?

UserUtilsMixinResources, это имя модуля + Resources стандартная мнемоника для объявления ресурсов в зависимостях для схем.

в 3-х местах это в каких ?

Показать все комментарии

Для определения прав доступа к объектам и системным операциям используются организационные
и функциональные роли пользователей.

Организационная роль является элементом организационной структуры компании, ее подразделением, например, “Отдел продаж московского филиала” или “HR-отдел киевского филиала”.

Функциональная роль отражает должность, которую сотрудник занимает в компании, например,
роль “Менеджеры по продажам”.

Функциональная роль может включать в себя ряд организационных ролей. Например, в
функциональную роль “Менеджеры по продажам” могут входить организационные роли “Отдел
продаж московского филиала” и “Отдел продаж киевского филиала”.

Используя функциональные роли, вы можете настроить одинаковые права доступа для всех
сотрудников, которые занимают определенную должность, независимо от того, в каком
подразделении компании они работают. Например, вы можете предоставить доступ к разделу
[Продажи] для менеджеров по продажам, работающим в московском в киевском филиале
компании.

Чтобы предоставить доступ к разделу системы для определенной функциональной роли:

1.   Добавьте и настройте функциональную роль.

2.   Предоставьте доступ к объекту для добавленной функциональной роли.

Как добавить и настроить функциональную роль

Предположим, вам необходимо предоставить доступ к разделу [Продажи] для менеджеров
по продажам, работающим в московском и киевском филиалах компании. Для этого:

1.   Из дизайнера системы перейдите в раздел управления ролями и пользователями,
нажав на ссылку [Функциональные роли].

2.   На странице раздела нажмите на кнопку [Добавить]. На появившейся странице функциональной
роли определите ее параметры:

a.   Введите название роли, например, “Менеджеры по продажам”.

b.   На детали [Организационные роли] добавьте организационные роли, которые должны
входить в данную функциональную роль, например, “Отдел продаж московского филиала”
и “Отдел продаж киевского филиала”.

На заметку

Если доступ к разделу дополнительно требуется предоставить отдельным пользователям,
не входящим в добавленные организационные роли, добавьте необходимых пользователей
на детали [Пользователи].

Если необходимо определить список диапазонов IP-адресов, с которых пользователям
и их руководителям будет разрешен вход в систему, используйте деталь [Диапазон разрешенных
IP-адресов] вкладки [Правила доступа].

c.   Закройте страницу записи.

3.   Актуализируйте настроенные роли. Для этого в меню действий раздела выберите
команду [Актуализировать роли].

Актуализация ролей

Актуализация ролей

В результате в систему будет добавлена новая функциональная роль “Менеджеры по продажам”,
включающая в себя менеджеров по продажам московского и киевского филиалов.

Как предоставить доступ к разделу

Чтобы предоставить доступ к разделу:

1.   Перейдите в раздел [Доступ к объектам], используя ссылку [Права доступа на объекты]
дизайнера системы.

2.   В списке раздела выберите необходимый объект, например, “Продажа”. Объект должен
администрироваться по операциям. Если администрирование по операциям отключено, установите
признак в колонке [Администрируется по операциям] для выбранного объекта. Обратите
внимание, что установка признака может занять некоторое время.

3.   Перейдите на деталь [Доступ к объекту].

4.   Нажмите на кнопку [Добавить] панели инструментов детали и в открывшемся окне
добавьте роль, для которой будет предоставлен доступ к разделу, например, роль “Менеджеры
по продажам”.

В результате на деталь будет добавлена роль “Менеджеры по продажам”, пользователи
которой смогут читать, добавлять, изменять и удалять данные раздела [Продажи]. Если
необходимо запретить какую-либо из этих операций, например, удаление записей, установите
запрет на удаление в соответствующей колонке.

Если отдельные пользователи входят в несколько ролей одновременно, например, при
совмещении должностей, и если для таких ролей определены разные права доступа, то
будут применены права тех ролей, которые находятся выше в списке.

Например,  сотрудник одновременно входит в роль “Менеджеры по продажам” и “Менеджеры
поддержки продаж”. Для роли “Менеджеры поддержки продаж” определено право только
на чтение раздела [Продажи], а для роли “Менеджеры по продажам” — право на все операции.
Чтобы сотрудник получил максимальные права доступа, переместите роль “Менеджеры по
продажам” так, чтобы она оказалась выше роли “Менеджеры поддержки продаж”. В результате
пользователь получит доступ к разделу [Продажи] в соответствии с правами, определенными
для роли “Менеджеры по продаже”, а не “Менеджеры поддержки продаж”.

Для перемещения ролей в списке используйте кнопки [Вверх] и [Вниз] панели инструментов
детали.

Нравится

Поделиться

0 комментариев
Показать все комментарии