Dentro de las áreas de Implementación de un Proyecto Odoo, una de las que más tiempo consume, es la configuración del Rol de pagos de los empleados.
Por acá te dejo una guía de configuración del cálculo de las reglas dependiendo del nivel de complejidad de la implementación en la que estés involucrado.
Si estás familiarizado con el formulario de la regla salarial de Odoo, esta vez nos vamos a centrar en el área señalada en la imagen siguiente:
Nueva regla con monto fijo
En este caso, en el formulario de la regla salarial, en el campo Amount type seleccionamos la opción Monto fijo o Fixed Amount, para luego establecer el monto correspondiente. En el Rol de pagos de cada empleado para quien aplique esta regla, se mostrará exactamente este valor.
Nueva regla como porcentaje de un valor
Si necesitamos que una regla se calcule como un porcentaje del sueldo en contrato, por ejemplo, en el formulario de la regla salarial, en el campo Amount type seleccionamos la opción Percentage(%), para luego establecer el porcentaje correspondiente. En el Rol de pagos de cada empleado para quien aplique esta regla, se mostrará el valor calculado de este porcentaje en función de su salario.
Nueva regla con fórmula usando categorías de regla
Este caso es muy útil si necesitamos tener en cuenta grupos de reglas en lugar de una regla en particular. Por ejemplo, para calcular todos los ingresos del empleado, aunque sean de diferente clasificación (Básico + Comisiones + Bonificaciones + Horas Extras , asumiendo que todas estas son Categorías configuradas), en ese caso a través de la variable 'categories' y conociendo el código de cada una, podemos establecer una fórmula que nos dé el monto que necesitamos.
Nueva regla con fórmula usando Entradas (Inputs)
Los tipos de entradas o Inputs pueden ser útiles al generar novedades en la nómina del período. Una vez que se configuran los tipos de inputs con su respectivo código, si necesitamos incluir otros valores no preestabecidos, hacemos uso de un tipo de entrada en particular y desde una regla salarial obtenemos el monto de esta entrada, usando la variable 'inputs' y el código de la entrada.
Nueva regla usando el valor de otra regla
Si dentro de mi Rol de pagos actual, existe una regla Subsidio por Alimentación con código SPA, y queremos crear otra regla que calcule el 20% del valor que calcula esta última, podemos hacerlo de la siguiente forma:
result = SPA * 0.2
Pero qué sucede si para otro empleado no aplica la regla SPA y nuestra nómina está automatizada para no mostrar todas las reglas aunque su valor sea 0?
Tendremos un error. Para evitar esto preguntaremos primero si esa regla está incluida en este Rol de pagos, y lo haremos usando la variable 'rules'.
spa_value = SPA if rules.SPA else 0
result = spa_value * 0.2
De esta forma solo aplicará el cálculo si la regla previa aplica para este empleado, en caso contrario el valor será 0.
Nueva regla que usa cálculos desde un método en python
Para este caso tengamos presente los objetos que podemos usar dentro este contexto:
# payslip: object containing the payslips
# employee: hr.employee object
# contract: hr.contract object
# rules: object containing the rules code (previously computed)
# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category).
# worked_days: object containing the computed worked days.
# inputs: object containing the computed inputs.
Para llamar a un método que calcula data relacionada con el contrato, en hr.contract, incluimos un nuevo método:
class HrContract(models.MOdel):
_inherit = 'hr.contract'
def calculate_custom_wage():
# Calculation code
return your_amount
En nuestra regla salarial escribiríamos:
result = contract.calculate_custom_wage()
También podemos incluir este resultado como parte de una fórmula más elaborada.
En algunas implementaciones se requiere que las reglas que no aplican o se calculen en 0, no se muestren en el rol del empleado. Para estos casos también podemos utilizar los objetos que mencionábamos anteriormente para determinar si la visibilidad queda en True, a través de una fórmula.
En caso de que esto no sea un requisito, podemos establecerlo a Always True, para que se muestre en cada caso sin importar el valor.
Eso es todo por hoy ;)