Correo de nuestro jefe
Nos ha llegado un nuevo correo:
Buenos días, Javier
Dentro de un par de semanas comenzaremos una nueva camapaña con la empresa vodaplone. En este caso se trata de una camapaña de ventas de terminales móviles. La campaña comenzará el 4 de noviembre y se extenderá hasta el 18 de enero de 2025.
Te paso el listado de empleados y el coordinador.
| Apellido1 | Apellido2 | Nombre | Departamento |
| Martín | Vázquez | María Carmen | Ventas |
| Molina | Alonso | Ana | Ventas |
| Domínguez | Rubio | Ana | Contabilidad |
| Alonso | Martínez | Dolores | Tecnico |
| Gómez | Cabrera | Cristina | Tecnico |
| Rodríguez | Cabrera | Carlos | Ventas |
| Gil | Cabrera | José | Ventas |
| Díaz | Castillo | Alejandro | Ventas |
| Martínez | Cárdenas | Luis | Tecnico |
| Molina | Martín | Marta | Ventas |
| Medina | Gil | María José | Contabilidad |
| Morales | Ramos | Cristina | Ventas |
| Sánchez | Domínguez | Antonio | Contabilidad |
| Prieto | Romero | Laura | Ventas |
| Ramos | Navarro | Rosa | Tecnico |
| Sánchez | Molina | Pablo | Ventas |
| Ortiz | Medina | Susana | Contabilidad |
| Molina | Fernández | Marta | Tecnico |
| Alonso | Rubio | David | Tecnico |
| Fernández | Delgado | Carlos | Contabilidad |
| Aguilar | Prieto | Carlos | Tecnico |
| Romero | Ruiz | Fernando | Tecnico |
| Gil | Fernández | Raquel | Tecnico |
| Vázquez | Molina | José Luis | Contabilidad |
| Ortiz | Castillo | Fernando | Contabilidad |
| Medina | Hernández | Alberto | Contabilidad |
| Gómez | Cabrera | Susana | Tecnico |
| Cabrera | Martín | José Antonio | Contabilidad |
| Iglesias | Rubio | Carmen | Ventas |
| Ruiz | Molina | Dolores | Contabilidad |
| Rodríguez | Reyes | Carmen | Tecnico |
| Vázquez | López | Jesús | Tecnico |
| Pérez | Domínguez | Antonio | Contabilidad |
| Prieto | Blanco | Dolores | Ventas |
| Ruiz | Domínguez | María | Tecnico |
| Rubio | Iglesias | Marta | Contabilidad |
| Rodríguez | Iglesias | Jesús | Contabilidad |
| Fernández | Martín | Raquel | Ventas |
La coordinadores es Raquel Fernández Martín.
Muchas por tu trabajo, tan bueno como siempre. Por cierto, estamos ultimando un contrato con la empresa MovisFlar en el que trabajarán unos 200 empleados. Si nos sale, nos forramos :D.
Un saludo y nos vemos en la cafetería, si no estás tan liado como siempre.
Atentamente,
Tu querido Jefe
Situación
Por lo pronto, tendremos que realizar todas las gestiones para crear los más de 20 usuarios de esta campaña, lo cual puede ser un poco engorroso. Pero es que además, nos están advirtiendo que tendremos que crear en un futuro una nueva campaña para 200 usuarios más. Eso es mucho trabajo si no lo automatizamos adecuadamente.
Hay que crear un script que agilice el trabajo de creación de usuarios proporcionados en una lista.
Ayuda
Estos datos los tenemos que saber leer de un fichero para poderlos procesar en nuestro script de forma automática.
Aquí es dónde entra la resolución de este problema que no es directamente técnico.
Solución propuesta
Elegir nomenclatura
Debemos elegir una nomenclatura, así que vamos a seleccionar la nomenclatura que se utiliza en la Comunidad Autónoma de Extremadura para cuentas educativas, que ya la conocemos:
- Primera letra del nombre de pila
- Primer apellido
- Primera letra del segundo apellido
- Número incremental. Se trata de un número de dos cifras que se utiliza para evitar que haya dos personas con el mismo nombre de cuenta de usuario.
También deberíamos tener presente algunas decisiones de administración importantes, como por ejemplo qué sucede si una compañía tiene dos campañas a la vez con el mismo trabajador.
Por ahora, vamos a decidir que esto no debería suceder y, si sucede, entenderemos que el usuario al trabajar en campañas distintas y almacenarse su directorio personal dentro del directorio home dentro del directorio de la campaña, pues consideraremos que son dos usuarios distintos, creando dos cuentas de usuario.
Por tanto, para nosotros, serán dos usuarios distintos. Ya solucionaremos esto más adelante cuando evolucionemos la administración de nuestro sistema.
Aquí hay que resaltar la importancia, por ahora, de tener los directorios personales dentro del directorio de cada campaña. Más adelante realizaremos backups por campaña, y los empleados de cada campaña almacenan información en su directorio personal que debería guardarse también. De hecho, podríamos restaurar información de cuentas de usuario en caso de repetirse campañas de forma periódica, pero esto para más adelante….
Fichero de cuentas de usuario
Lo primero que deberíamos tener claro es cómo vamos a insertar los nombres de usuario en nuestro script. Como hemos visto, recibimos un correo con un listado de usuarios y el departamento al que pertenecen. Si pudiéramos contar con ese listado en un fichero de texto plano, separando los campos de alguna forma podríamos tener acceso a la información de forma automática.
En nuestro caso, la forma más sencilla, sería tomar los datos del correo, copiarlos y pegarlos como texto en un fichero de texto, tal cuál vienen.
Si hacemos esto, nos quedará algo así

Desde luego, tenemos claro que no vamos a insertar los usuarios uno a uno a mano. Almacenamos el fichero con el nombre usuarios.txt y vamos a comprobar si lo podemos leer desde terminal.

Vamos a probar a mostrar solo la primera fila.

Como vemos funciona perfectamente, puesto que el separador es el tabulador.
Vamos a mostrar las primeras líneas

Vamos a tratar de quitar la primera línea, para ello utilizamos tail

Mostramos todas las líneas del fichero menos la primera, es decir a partir de la línea 2, para poder acceder a los datos de nombres de usuario.

Aquí podríamos tener un problema, puesto que cómo sabemos si un nombre es compuesto o no, o puede que un apellido sea compuesto o no.. Pues no, no tenemos ese problema, puesto que el separador es un tabulador. Al ser un tabulador y no un espacio, aunque ninguno de los dos se representen en pantalla, tenemos la ventaja de que cada campo, del 1 al 4, incluirán los datos que deben incluir aunque existan apellidos o nombres compuestos.
Por tanto, con esta información tenemos claro que podemos recorrer el fichero registro a registro y seleccionar cada campo del registro para trabajar con él cómo necesitemos.
Con todo esto, tengo claro que puedo recorrer el fichero accediendo a cada uno de los campos: al primer apellido, segundo apellido, nombre y departamento.
Vamos a hacer un pequeño script que muestra cada uno de los campos con una etiqueta delante.

Vamos a probar con esta aproximación

Comprobamos

Corregimos los dos fallos.

Comprobamos

Somos capaces de recorrer las líneas, ahora vamos a cortar para quedarnos con los campos.
Obtenemos la información y por ahora solo mostramos la información separada en variables distintas para un mismo empleado.

Probamos

Todo en minúsculas
Para pasar todo a minúsculas podemos utilizar el comando tr con la opción [:upper:] a [:lower:]

Que es lo que vamos a hacer, convertir todos los uppers en lowers 🙂

Vamos a probar 🙂

Texto sin tildes
Para convertir las letras con tilde a letras sin tilde podemos utilizar el comando sed que nos permitirá editar un fichero o la entrada que venga por una tubería (filtro). Podemos utilizar la operación s o de sustitución definiendo el carácter con tilde a sustituir por el carácter sin tilde.
Por ejemplo:

Nos interesa utilizar la opción s de sustituir


Vamos a añadir este filtro a nuestro script

Vamos a probarlo 🙂

Primera letra del nombre de pila y del segundo apellido
Aquí deberíamos comprobar si el nombre de pila es simple o compuesto. Para ello utilizamos wc con la opción -w para saber las palabras que forman el nombre.

A partir de ahí, tomamos la primera letra de cada palabra. Para cada palabra del nombre, añadimos la primera letra.
Con el segundo apellido hacemos lo mismo, pero sin necesidad de contar las palabras: tan solo cogemos la primera letra.
Ahora necesitamos el nombre siguiendo la nomenclatura… es decir, primera letra del nombre de pila, si es compuesta de cada una de los nombres simples, primer apellido completo y primera letra del segundo apellido.

Ya hemos hecho lo difícil, el resto es super fácil 🙂

Parece que funciona

Número del nombre: Colisiones
Como hemos dicho, vamos a tratar de evitar colisiones. Para ello, añadiremos un número comenzando por el 01, detrás del nombre de usuario que tenemos. Si existe en el sistema una cuenta de usuario con ese nombre, incrementamos en una unidad ese número y volvemos a probar. Este proceso lo repetimos hasta que no exista en el sistema una cuenta de usuario con ese nombre.
Aquí tenemos que tener presente que el número a utilizar debe tener dos dígitos siempre. Así que si el contador es menor que nueve, tendremos que añadir un cero delante a la cadena de caracteres que representa el número.

Todo esto quedaría más o menos así

Ahora vamos a ver cómo hace getUserName su trabajo

Veamos cómo getOptionalUserName hace su trabajo

Con todo esto, nos queda el siguiente script


Esto habría que refinarlo un poco más, añadiendo control de errores, y realizar la tarea que tiene que realizar, crear la cuenta de usuario 🙂
Una evolución interesante, quizá, sería meter el código que reutilizamos en un módulo aparte. Es decir, las funciones las podríamos meter en un fichero aparte y añadirlas al fichero principal de código cuando sea necesario.
Solución total
El cuerpo del script quedaría así. Se puede refinar más todavía, pero en esta primera versión nos vale

Ahora las variables y funciones que hemos empleado:





Mejoras
- Este script contiene muchas funciones, habría que documentarlas para entender qué variables globales utilizan y cuales proporcionan para que sean utilizadas por el script principal.
- Estaría bien tratar de automatizar la información de empresa, campaña, inicio y fin de campaña.
Dejar una respuesta