Crea tu propia máquina de fichaje en Odoo

Actualmente es fundamental realizar un seguimiento de la jornada laboral de nuestros empleados. Para ello, tenemos el módulo de asistencias de Odoo. Lo que pocas veces ponemos en práctica es cómo crear una máquina de fichaje a partir de esta herramienta de forma sencilla.

¿Qué necesitamos?

  • Una instancia de Odoo
  • Una raspberry pi con la última versión raspbian instalada
  • Una pantalla táctil compatible con nuestra raspberry

También es recomendable poner la raspberry y la pantalla en una caja unificada. Podemos encontrar varias opciones en diferentes webs de venta online.

Preparar nuestro odoo

Lo primero será ir a los Ajustes de asistencia y configurar nuestros permisos de aplicación:


El modo de asistencia nos muestra que tipos de selección nos permite. La selección manual nos permitirá seleccionar manualmente y el código de barras/RFID nos permitirá que se lea a través de nuestra tarjeta de empleado. En el caso que hagamos la selección manual, es recomendable definir el Pin de Empleado.

Si estamos en versión anterior a 17, deberemos crear un usuario y guardar su contraseña. Este usuario debe tener únicamente los permisos de Usuario: sólo modo quiosco. Lo podemos encontrar en el apartado de recursos humanos. Con este usuario, es con el que la gente podrá fichar. Por eso es importante que tenga la menor cantidad de permisos posible. Además, deberemos configurar en el usuario que su acción por defecto al loguear es ir al quiosco. Si estamos en versión 17 deberemos guardarnos la URL que nos propone Odoo.

Preparando la Raspberry

El segundo paso que deberemos hacer es acceder a nuestra raspberry e instalar algunos componentes:

$ apt-get install python3-selenium chromium-chromedriver

Esto nos instalará Selenium, un sistema que nos permite abrir el navegador de forma controlada desde una aplicación y Chromedriver, una aplicación chrome preparada para ser controlada por selenium.

Scripts

El siguiente paso será crear el script que usaremos para lanzar de forma automática. Por ello crearemos un fichero en la raspberry que llamaremos autorun.py en nuestro home.

Si estamos en la versión 16 o anterior, tendrá el siguiente código

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Replace 'your_username' and 'your_password' with your actual credentials
username = ''
password = ''
website = ''
executable_path = "chromedriver"
# Set up Chrome options for kiosk mode
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--kiosk')  # Launch in kiosk mode
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']);
chrome_options.add_experimental_option("prefs", {
    "profile.default_content_setting_values.autoplay": 1,  # Allow autoplay
    "profile.default_content_setting_values.muted": False,  # Unmute by default
    "credentials_enable_service": False,
    "profile": {
        "password_manager_enabled": False
    },
})


# Initialize the Chrome browser with kiosk mode
driver = webdriver.Chrome(executable_path=executable_path,options=chrome_options)

# Navigate to the login page
driver.get(website)

username_field = driver.find_element("name", "login")  # Adjust the locator strategy based on your HTML structure
password_field = driver.find_element("name", "password")
submit_button = driver.find_element("xpath", "//form//button")
username_field.send_keys(username)
password_field.send_keys(password)

# Submit the form
submit_button.click()
time.sleep(10)
webdriver.find_element("class name", "o_action_manager").click()

Esto lo que hará es abrir el website correcto de forma automática. Sólo tendremos que poner los valores de usuario, password y el link de nuestra instancia.

Si estamos en la versión 17, el código será más sencillo:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Replace 'your_username' and 'your_password' with your actual credentials
website = ''
executable_path = "chromedriver"
# Set up Chrome options for kiosk mode
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--kiosk')  # Launch in kiosk mode
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']);
chrome_options.add_experimental_option("prefs", {
    "profile.default_content_setting_values.autoplay": 1,  # Allow autoplay
    "profile.default_content_setting_values.muted": False,  # Unmute by default
    "credentials_enable_service": False,
    "profile": {
        "password_manager_enabled": False
    },
})


# Initialize the Chrome browser with kiosk mode
driver = webdriver.Chrome(executable_path=executable_path,options=chrome_options)

# Navigate to the login page
driver.get(website)

Por último, deberemos conseguir que se ejecute dicho script de forma automática al abrirse la raspberry. Existen varias formas de hacerlo, pero propondremos una:

$ mkdir -p ~/.config/autostart
$ cd ~/.config/autostart
$ nano attendance-machine.desktop

Dentro del fichero pondremos lo siguiente:

[Desktop Entry]
Type=Application
Name=Attendance Machine
Exec=python3 ~/autorun.py
X-GNOME-Autostart-enabled=true

Bonus track: Uso con lector de RFID

A menudo nos solicitan que permitamos el uso de lectores de tarjetas. Para ello haremos los siguientes cambios. Primero de todo se recomienda comprar dos lectors RFID idénticos (uno lo usaremos para configurar los empleados y el otro irá a a la raspberry). Si queremos, además, podemos usar una pantalla que no sea táctil si solo dejamos el modo Código de Barras/RFID. A cada empleado, le asignaremos el campo Badge ID con el valor de su tarjeta.

A partir de este momento ya podrán usar su tarjeta en nuestra máquina de fichar de forma directa.

Conclusiones

Como hemos vistos, es sencillo crear nuestro propio sistema de fichaje en odoo con herramientas sencillas. Esperamos que os sirva para crear vuestra propia máquina.

Personalización Responsable en Odoo
Cómo Maximizar el Valor de las Personalizaciones sin Comprometer la Estabilidad del Sistema