Importar usuarios usando Excel

<< Clic para mostrar Tabla de Contenidos >>

Navegación:  Bizagi Studio > Definición de Seguridad > Seguridad del Portal de Trabajo > Sincronización de usuarios >

Importar usuarios usando Excel

Introducción

Usted puede usar un archivo Excel para importar usuarios en Bizagi. Sin embargo, para hacerlo, debe crear un proceso en el que cargue el archivo y, mediante una regla de negocio, importe usuarios.

 

Qué necesitas hacer

El esquema general para construir el proceso de Bizagi mencionado anteriormente tiene tres pasos principales:

 

1. Descargue, personalice o cree un conector de Excel.

Para leer la información de los usuarios desde un archivo de Excel, necesitará un conector Bizagi especializado. Puede crear un conector con nuestro Connector Editor o descargar el que se utiliza en este ejemplo. En este punto, ya debe saber qué formato (es decir, definiciones de columnas) utilizará para la información del usuario.

 

2. Implemente los conceptos básicos del proceso de Bizagi.

Cree un proceso utilizando Bizagi Studio que espera como entrada un archivo de Excel con los usuarios que se agregarán o sincronizarán a su proyecto.

Al modelar el proceso, usted define aspectos básicos como el modelo de datos empleado y las interfaces de usuario.

En este punto, también puede agregar otros aspectos de configuración al proceso, como asegurarse de que tenga los derechos de acceso adecuados (es decir, restringidos a personas que no son administradores).

 

3. Definir reglas de procesamiento.

Defina las reglas de negocio que se ejecutarán para interpretar la información de los usuarios.

 

Ejemplo

En este ejemplo, todos los usuarios se cargan en una sola organización (la predeterminada), utilizando los siguientes atributos:

Nombre de usuario: debe ser único por usuario, cuando se combina con la información del dominio.

Correo electrónico: debe ser único por usuario.

Nombre completo

Dominio: debe ser único por usuario, cuando se combina con la información del Nombre de usuario.

Rol: esta información tiene una relación múltiple con los usuarios. Un usuario puede tener múltiples roles, y un mismo rol puede ser aplicable a muchos usuarios.

Habilitado

Stakleholder: esta información tiene una relación múltiple con los usuarios. Un usuario puede ser un Stakeholder múltiple, y un mismo Stakeholder puede ser aplicable a muchos usuarios.

 

Debido a que un solo usuario puede tener más de un rol, es mejor tener varias filas en el archivo Excel donde cada fila define un rol para un usuario (por lo que la información básica de un usuario podría repetirse dentro de varias filas).

La estructura del archivo Excel empleado en este ejemplo es:

 

ImportUsers_01

 

Si desea reutilizar este archivo de Excel para que funcione con el ejemplo de este artículo, descárguelo de: http://resources.bizagi.com/docs/UsersUploadSample.xlsx.

 

Procedimiento

Sigue estos pasos:

 

1. Descargue, personalice o cree un conector de Excel.

Descargue un conector listo para usar para usar con este ejemplo en http://resources.bizagi.com/docs/Read Users From Excel.bizc

Alternativamente, cree un conector desde cero o edite el descargado usando nuestro Connector Editor.

 

Al final, debe tener un conector que cumpla con la estructura de archivos de Excel, en un archivo .bizc:

 

ImportUsers_12

 

Cuando abra  Bizagi Studio, debe asegurarse de instalar y crear una instancia de este conector.

Su configuración no requiere configuraciones específicas:

 

ImportUsers_13

 

2. Implemente los conceptos básicos del proceso de Bizagi.

En este paso usted debe usar Bizagi Studio para implementar el proceso para importar, actualizar o deshabilitar usuarios, a través de pasos asistidos.

 

2.1 Modelar el proceso

Modele un proceso que consta de solo dos actividades: una actividad manual en la que carga el archivo de Excel y una actividad del sistema que procesa el archivo.

 

La siguiente imagen ilustra este modelo:

 

ImportUsers_02

 

2.2 Definir el modelo de datos

Defina un modelo de datos para admitir el caso de uso de este proceso. Necesita una colección para almacenar temporalmente a los usuarios, un atributo de archivo adjunto para capturar el archivo entrante de Excel y otros datos para la configuración para que pueda orientar información específica dentro del archivo Excel.

 

La siguiente imagen ilustra el modelo de datos sugerido:

 

ImportUsers_03

 

2.3 Diseñar las interfaces de usuario

La única actividad en este proceso que necesita intervención del usuario es la actividad Cargar archivo.

Cree un formulario como el siguiente para admitir la carga del archivo de Excel y la vista previa de los registros que contiene.

 

ImportUsers_04

 

Para este formulario, cree una acción para ejecutar el conector (para obtener toda la información proveniente del archivo Excel cargado).

Las acciones deben establecerse como se sugiere en la siguiente imagen:

 

ImportUsers_05

 

Las entradas para ejecutar el conector son las siguientes:

 

ImportUsers_06

 

Las salidas para la ejecución del conector son las siguientes:

 

ImportUsers_07

 

No se necesita configuración de manejo de errores.

 

2.4 Conceder derechos de acceso para la creación de casos a usuarios administradores

En este punto, le recomendamos que realice ajustes de configuración, como otorgar acceso a este proceso solo a usuarios administradores.

 

ImportUsers_14

 

3. Definir reglas de procesamiento.

Ahora que se han cubierto los aspectos básicos, puede crear reglas que procesen lo que se ha almacenado temporalmente en una colección para la entidad de usuarios finales.

 

note_pin

La actividad Procesar archivo es donde se procesa el archivo cargado.

Como se mencionó anteriormente, el archivo Excel tiene una propiedad de relación múltiple (Rol), es decir que un usuario tenga más de un rol. Por lo que el procesamiento debe asegurarse de que no se importen múltiples entradas de usuario o duplicados de usuarios existentes.

 

3.1 Definir reglas como acciones de actividad

Cree la siguiente expresión Al salir de la actividad como se muestra a continuación:

 

ImportUsers_08

 

Para hacer esto, primero declare las variables como sugerimos a continuación:

 

ImportUsers_09

 

Tipo

Nombre

Valor Inicial

int

index

Índice del elemento actual en la lista de usuarios importados

int

counter

Número de usuarios importados

string

inputXML

Cadena que se ejecutará utilizando la capa Bizagi SOA

string

inputXMLUser

Cadena con el XML de un usuario

List

CurrentUser

Colección para controlar que un usuario no se procese más de una vez

List

CurrentFullname

Colección para controlar que un usuario con múltiples roles no tenga nombres completos diferentes

List

CurrentEmail

Colección para controlar que un usuario con múltiples roles no tenga nombres completos diferentes emails

List

CurrentDomain

Colección para controlar que un usuario con múltiples roles no tenga nombres completos diferentes dominios

List

CurrentRole

Colección para controlar que un rol no se asigne más de una vez al mismo usuario

List

CurrentEnabled

Colección para controlar que un estado no se asigne más de una vez al mismo usuario

List

CurrentStakeholder

Colección para controlar que un Stakeholder no se asigne más de una vez al mismo usuario

 

3.2 Agregar el código en el primer modulo de la expresión

Para el módulo de expresión en la imagen de arriba, agregue el siguiente código:

 

// Get a collection with the users uploaded. Use this method to return a collection even if only one record is sent

var colUsers = CHelper.GetValueAsCollection(<UploadUsers.ImportedUsers>);

// number of records in the file

counter = colUsers.size();

// This collections lets you control that a user with multiple roles does not have multiple domains, full names, etc.

CurrentUser = new ArrayList();

CurrentDomain = new ArrayList();

CurrentEmail = new ArrayList();

CurrentFullname = new ArrayList();

CurrentRole = new ArrayList();

CurrentEnabled = new ArrayList();

CurrentStakeholder = new ArrayList();

// Pploading of the users is done through the Bizagi SOA Layer.

inputXML = "<BizAgiWSParam>";

inputXML += "<Entities>";

 

3.3 Configurar el elemento gráfico For

Para el elemento gráfico Iterar sobre usuarios, configure lo siguiente:

 

ImportUsers_10

 

 

3.4 Agregar el código en el segundo módulo de la expresión

Para inicializar los campos en el segundo módulo de la de expresión gráfica de usuario que se muestra en la imagen en el paso 3.1, agregue el siguiente código:

 

// gets the i-th user

var oUser = colUsers.get(index);

var sUsername = oUser.getXPath("Username");

// This variable is to search if a user already exists

var sSearchDomain = "";

// If the user is already in the collection, this user will not be processed

if(!CurrentUser.Contains(sUsername.ToLower())) {

 CurrentUser.Add(sUsername.ToLower());

 inputXMLUser = "<WFUSER>";

 inputXMLUser += "<userName>" + sUsername + "</userName>";

 inputXMLUser += "<Organizations><idOrg key=\"1\"/></Organizations>";

 // The collections are cleared to start over again

 CurrentFullname.Clear();

 CurrentEmail.Clear();

 CurrentRole.Clear();

 CurrentDomain.Clear();

 CurrentEnabled.Clear();

 CurrentStakeholder.Clear();

 var colUsernames = CHelper.GetValueAsCollection(<UploadUsers.ImportedUsers>);

 // New iteration to get multiple values for the current user

 for(var i = 0; i < colUsernames.size(); i++) {

         var oUsername = colUsernames.get(i);

         if(oUsername.getXPath("Username").ToLower().Trim() == sUsername.ToLower()) {

                 var sFullName = oUsername.getXPath("Fullname");

                 var sEmail = oUsername.getXPath("EmailAddress");

                 var sDomain = oUsername.getXPath("UserDomain");

                 var sRole = oUsername.getXPath("UserRole");

                 var sEnabled = oUsername.getXPath("UserEnabled");

                 //To add single attributes, the attribute must not be empty and:

                 //if the collection is empty, the attribute has to be added

                 //if the collection contains the given attribute, this will not be processed

                 //if the collection does not contain the given attribute and is not empty, an error must be thrown

                 //set domain

                 if(sDomain && !CurrentDomain.Contains(sDomain.ToLower().Trim())) {

                         CurrentDomain.Add(sDomain.ToLower().Trim());

                         // set the domain to search if the user exists

                         sSearchDomain = sDomain;

                         if(CurrentDomain.Count > 1)

                                 CHelper.ThrowValidationError("Username " + sUsername + " has different Domains");

                         sDomain = sDomain.Replace(" ", "");

                         inputXMLUser += "<domain>" + sDomain + "</domain>";

                 }

                 //set fullname

                 if(sFullName && !CurrentFullname.Contains(sFullName.ToLower().Trim())){

                         CurrentFullname.Add(sFullName.ToLower().Trim());

                         if(CurrentFullname.Count > 1)

                                 CHelper.ThrowValidationError("Username " + sUsername + " has different Fullnames");

                         inputXMLUser += "<fullName>" + sFullName.Trim() + "</fullName>";

                 }

                 //set email

                 if(sEmail && !CurrentEmail.Contains(sEmail.ToLower().Trim())){

                         CurrentEmail.Add(sEmail.ToLower().Trim());

                         if(CurrentEmail.Count > 1)

                                 CHelper.ThrowValidationError("Username " + sUsername + " has different Emails");

                         inputXMLUser += "<contactEmail>" + sEmail.Trim() + "</contactEmail>";

                 }

                 //set enabled

                 if(sEnabled && !CurrentEnabled.Contains(sEnabled.Trim())){

                         sEnabled = sEnabled.Trim();

                         if(sEnabled != "1" && sEnabled != "0")

                                 CHelper.ThrowValidationError("Username " + sUsername + " has an invalid status");

                         CurrentEnabled.Add(sEnabled);

                         if(CurrentEmail.Count > 1)

                                 CHelper.ThrowValidationError("Username " + sUsername + " has different status");

                         inputXMLUser += "<enabled>" + sEnabled + "</enabled>";

                 }

                 //To add multiple attributes, the attribute must not be empty and:

                 //if the collection is empty, the attribute has to be added

                 //if the collection contains the given attribute, it will not be processed

                 //set multiple roles

                 var sStakeholder = oUsername.getXPath("UserStakeholder");

                 if(!sStakeholder)

                         sStakeholder = "EmptyStk2018";

                 if(sRole && !CurrentRole.Contains(sRole.ToLower().Trim())){

                         CurrentRole.Add(sRole.ToLower().Trim());

                         sRole = sRole.Replace(" ", "");

                         var parameters = new FilterParameters();

                         parameters.AddParameter("@roleName", sRole.ToLower());

                         var iRoleId = CHelper.getEntityAttrib("Role","idRole","LOWER(roleName) = @roleName",parameters);

                         if(!iRoleId)

                                 CHelper.ThrowValidationError("The Role " + sRole + " does not exist.");

                         inputXMLUser += "<Roles><idRole key='" + iRoleId + "'/></Roles>";

                 }

                 //Stakeholders may be empty

                 if(!CurrentStakeholder.Contains(sStakeholder.ToLower().Trim())) {

                         CurrentStakeholder.Add(sStakeholder.ToLower().Trim());

                         if(sStakeholder != "EmptyStk2018") {

                                 sStakeholder = sStakeholder.Replace(" ", "");

                                 inputXMLUser += "<StakeHolders><"+sStakeholder+"><a></a></"+sStakeholder+"></StakeHolders>";

                         }

                 }

         }

 }

 //Validations

 //If any required user attributes is empty

 if(CurrentDomain.Count == 0)

         CHelper.ThrowValidationError("No domain was set for user " + sUsername);

 if(CurrentFullname.Count == 0)

         CHelper.ThrowValidationError("No full name was set for user " + sUsername);

 if(CurrentEmail.Count == 0)

         CHelper.ThrowValidationError("No email was set for user " + sUsername);

 if(CurrentRole.Count == 0)

         CHelper.ThrowValidationError("No roles was set for user " + sUsername);

 if(CurrentEnabled.Count == 0)

         CHelper.ThrowValidationError("No status was set for user " + sUsername);

 //Serch for the user with the domain to see if the user already exists

 var parameters = new FilterParameters();

 parameters.AddParameter("@userName", sUsername);

 parameters.AddParameter("@domain", sSearchDomain);

 var oUserCount = Me.getXPath("entity-list('WFUSER','userName = @userName AND domain = @domain')",parameters);

 if(oUserCount.size() == 1) {

         inputXMLUser = inputXMLUser.Replace("<WFUSER>", "<WFUSER businessKey=\"userName = '" + sUsername + "' AND domain = '" + sSearchDomain + "'\">");

 }

 //Close the XML of the user

 inputXMLUser += "</WFUSER>";

 //Add the user XML to the XML to be processed

 inputXML += inputXMLUser;

 <UploadUsers.ProcessEnddate> = DateTime.Now;

}

 

3.5 Agregar código en el tercer modulo de la expresión

Para el módulo Insertar valores que se muestra en la imagen en el paso 3.1, agregue el siguiente código

 

//Close the XML string

inputXML += "</Entities>";

inputXML += "</BizAgiWSParam>";

//save records

var sResult = CEntityXmlHelper.fromXmlToEntity(inputXML);

 

Ejecución

Cuando haya terminado, ejecute el proceso para probarlo en su entorno de desarrollo.

Cree un nuevo caso, cargue el archivo Excel de muestra y haga clic en el botón Cargar usuarios para obtener una vista previa de la información. Finalmente, haz clic en Siguiente.

 

ImportUsers_15

 

Una vez que haya verificado que todo funciona adecuadamente en sus entornos de desarrollo y prueba, puede implementar este proceso en entornos de producción.

 

¿Qué sigue?

El procedimiento descrito aquí se recomienda para cada proyecto.

Sin embargo, puede personalizar el proceso y cómo se ejecuta. Por ejemplo:

 

Si necesita considerar atributos de usuario adicionales, como las propiedades del usuario, debe personalizar y actualizar el conector utilizado para este propósito para que obtenga otra información. También deberá incluir estos atributos adicionales en su modelo de datos y dentro de las reglas de negocio que procesan la información cargada.

Además de este proceso, puede confiar en los servicios web SOAP de Bizagi. Esto significa que puede optar por evitar crear los casos manualmente y automatizar aún más la administración de usuarios al hacer que un cliente de servicios web SOAP invoque periódicamente el método web Bizagi SOAP createCasesAsString.