<< Clic para mostrar Tabla de Contenidos >> 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é necesita 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
•Persona: esta información tiene una relación múltiple con los usuarios. Un usuario puede ser una Persona múltiple, y una misma Persona 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:
Si desea reutilizar este archivo de Excel para que funcione con el ejemplo de este artículo, descárguelo de: https://resources.bizagi.com/docs/UsersUploadSample.xlsx.
1. Descargue, personalice o cree un conector de Excel.
Descargue un conector listo para usar para usar con este ejemplo en https://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:
Cuando abra Bizagi Studio, debe asegurarse de instalar y crear una instancia de este conector.
Su configuración no requiere configuraciones específicas:
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:
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:
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.
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:
Las entradas para ejecutar el conector son las siguientes:
Las salidas para la ejecución del conector son las siguientes:
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.
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.
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:
Para hacer esto, primero declare las variables como sugerimos a continuación:
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 una Persona 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:
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.
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.
Last Updated 6/9/2023 3:30:50 AM