Ir al contenido
Menú
Se marcó esta pregunta
2 Respuestas
1235 Vistas

Hola, 

Tengo este cogido para obtener edad que me funcionó hasta Odoo 16, no logro que funcione en Odoo 18. Si alguime me puede mostrar el error. El campo de fecha de nacimiento es x_dob, el campo donde retorna la edad es x_studio_age_1. Esto es para implementar con Odoo Studio. el codigo esta en el campo calculado x_studio_age_1.

Este código lo tome de un forum anterior, no tengo el hilo.


for record in self:

    if record.x_dob:

        today = datetime.date.today()

        born = record.x_dob


        # Calcular años

        years = today.year - born.year - ((today.month, today.day) < (born.month, born.day))


        # Calcular meses

        months = today.month - born.month

        if today.day < born.day:

            months -= 1

        if months < 0:

            months += 12


        # Calcular días

        if today.day >= born.day:

            days = today.day - born.day

        else:

            previous_month = (today.replace(day=1) - timedelta(days=1)).day

            previous_month = today.month - 1

           

        record['x_studio_age_1'] = f"{years} años, {months} meses, {days} días"


    else:

        record['x_studio_age_1'] = "Sin fecha de nacimiento"

Avatar
Descartar
Mejor respuesta

te arroja algún error?

Avatar
Descartar
Autor

Hola Flavio, este es el link del error

https://www.aventuradecolores.com/documents/TbQeX3SNTSmVh0TDlaKHXwo4d

El error esta en el calculo de los día, he probado varios métodos propuestos, pero no me funciona.

Actualmente he reemplazado el codigo de calculo de días por este:

Codigo que no funciona_________________________

else:
previous_month = (today.replace(day=1) - timedelta(days=1)).day
previous_month = today.month - 1

Codigo temporal_____________________

else:
days = 31 - (born.day - today.day)

Pero esta solución solo es temporal, ya que no es exacto.

oh ya veo
previous_month = (today.replace(day=1) - timedelta(days=1)).day
en ese pedazo de código intenta
previous_month = (today.replace(day=1) - datetime.timedelta(days=1)).day
con eso debería funcionar de nuevo tu código

Autor

Muchas Gracias Flavio,
La correción funciono de maravilla.

Dejo todo el codigo para la comunidad, probado en Odoo 18.1

for record in self:
if record.x_dob:
today = datetime.date.today()
born = record.x_dob

# Calcular años
years = today.year - born.year - ((today.month, today.day) < (born.month, born.day))

# Calcular meses
months = today.month - born.month
if today.day < born.day:
months -= 1
if months < 0:
months += 12

# Calcular días
if today.day >= born.day:
days = today.day - born.day
else:
previous_month = (today.replace(day=1) - datetime.timedelta(days=1)).day
days = previous_month - born.day + today.day

record['x_studio_age_1'] = f"{years}a, {months}m, {days}d"

else:
record['x_studio_age_1'] = ""

Autor Mejor respuesta

El error esta en el calculo de los día, he probado varios métodos propuestos, pero no me funciona.

Actualmente he reemplazado el codigo de calculo de días por este:

Codigo que no funciona_________________________

else:

    previous_month = (today.replace(day=1) - timedelta(days=1)).day

    previous_month = today.month - 1


Codigo temporal_____________________

else:

    days = 31 - (born.day - today.day)


Pero esta solución solo es temporal, ya que no es exacto.

Avatar
Descartar
Publicaciones relacionadas Respuestas Vistas Actividad
2
ene 24
2127
0
jul 18
4741
2
mar 15
8349
2
ago 25
294
2
ago 25
356