Ir al contenido

¡Bienvenido a los foros Aeodoo!

Somos la comunidad de Odoo internacional hispanohablante.
Estos foros son para compartir y debatir dudas técnicas, funcionales y mejores prácticas para Odoo. Recuerda que no están permitidos los insultos, descalificaciones o spam, cualquier conducta reprobable supondrá el baneo del usuario.

 
Ocultar IntroRegistro

Esta pregunta ha sido marcada
2 Respuestas
214 Vistas

 he revisado documnetacion para corregir  un campo debido a la necesidad de que en la propiedad stone=False me muestra datos de determinado campo en este caso campo 'carga' originalmente este campo tiene fecha y se podria filtrar por la misma para acomodo de la informacion de los viajes, se pidio que agregara hora patio y hora carga entones muestra 3 datos, pero no esta activo el filtro a raiz de este cambio revisando el codigo 

carga_info = fields.Html(string='Programación Carga', compute='_compute_carga_info', store=False )

  si cambio a True si aparece el filtro pero ya no me manda los datos en la vista o sea manda el campo vacio solo ese, leyendo y haciendo pruebas trato de entender del por que no lo hace, puedeser que write no recalcule archivos viejos, no recalcule compute almacnados o sea el cmpo existe, el filtro si aparece, los datos siguen vacios solo si colvemos stone a True, descubri que write maneja what app para notificaciones, maneja cambios de estado y guarda los logs vi una linea 

# Guarda en BD

    res = super(LogisticaOperacion, self).write(vals)  

OTRA COSA QUE  he revisado es que en odoo los cmpos 'compute' y 'store=True' no llenan con write (), se llenan en automatico con @api.depends;  'write()' no es la solucion correcta para este caso donde se pretende que ese campo muestre los datos y se pueda filtrar por fecha 


y otra cosa depsues de mover stone a True modificar el @api.depends aacrualiar repo no hace nada  

fragmento donde se ve write 

def write(self, vals):


    if 'estatus_mv' in vals:

        vals['last_whatsapp_update'] = fields.Datetime.now()


    if 'mensaje_formateado' in vals and len(vals) == 1:

        return super(LogisticaOperacion, self).write(vals)


    estatus_anterior_map = {}

    if 'state' in vals:

        for operacion in self:

            estatus_anterior_map[operacion.id] = operacion._get_state_label(operacion.state)


    # Guarda en BD

    res = super(LogisticaOperacion, self).write(vals)


    if 'state' in vals:

        estatus_nuevo_label = self._get_state_label(vals['state'])

        for operacion in self:

            if operacion.id in estatus_anterior_map:

                self.env['logistica.operacion.log'].create({

                    'operacion_id': operacion.id,

                    'fecha': fields.Datetime.now(),

                    'estatus_anterior': estatus_anterior_map[operacion.id],

                    'estatus_nuevo': estatus_nuevo_label,

                    'usuario_id': self.env.user.id,

                })


    # LOGISTICA: recompute carga_info para permitir filtros

    if any(k in vals for k in [

        'fecha_de_carga',

        'cita_en_patio',

        'cita_de_carga',


    ]):

        self._compute_carga_info()

    return res


fragmento de comoe sta @api.depends

  @api.depends('fecha_de_carga', 'cita_en_patio', 'cita_de_carga')

    def _compute_carga_info(self):

        for record in self:

            info = []

            if record.fecha_de_carga:

                info.append(record.fecha_de_carga.strftime('%d/%m/%Y'))

            if record.cita_en_patio or record.cita_en_patio == 0:

                hours = int(record.cita_en_patio)

                minutes = int((record.cita_en_patio * 60) % 60)

                info.append(f"Patio: {hours:02d}:{minutes:02d}")


            if record.cita_de_carga or record.cita_de_carga == 0:

                hours = int(record.cita_de_carga)

                minutes = int((record.cita_de_carga * 60) % 60)

                info.append(f"Carga: {hours:02d}:{minutes:02d}")

            record.carga_info = "<br/>".join(info)


lo que solicito es rero de como solucionar esta parte para poder tener el filtro de ese campo 'carga' o que muestre los datos que solicitan espero haberme explicado

Avatar
Descartar
Autor

 por si le s interesa y llegan a tener este problema se soluciono entrando a modo desarrollador en el modulo d odoo pestana de tecnico y nos fuimos ala opcion tecnico/automatizaciones/acciones planificadas y se ecribio este codigo

 records = env['logistica.operacion'].search([])

records._compute_carga_info()

escogiendo el modelo indicado en mi caso Op viaje 


saludos cordiales cualquier consulta estoy a la orden en el siguente mail  falconavellana@gmail.com


Avatar
Descartar

Hola Adolfo, según he entendido hay un filtro sobre el campo 'carga_info' que era un campo calculado y almacenado y necesitas ampliar la función que calcula este campo  '_compute_carga_info'.


En primer lugar plantéate si puedes utilizar los campos almacenados ('fecha_de_carga', 'cita_en_patio','cita_de_carga') para cualquier filtro, en lugar del campo calculado 'carga_info'.


En la dirección en la que vas actualmente, si quieres mantener el filtro sobre 'carga_info' necesitas que el campo sea almacenado (store=True) o no habrá datos que filtrar.


Tendrías que asegurar que se ejecute '_compute_carga_info' para todos los registros existentes y para los nuevos registros ya se calcularía según el  @api.depends cuando se agreguen o modifiquen los campos 'fecha_de_carga', 'cita_en_patio' o 'cita_de_carga'. No hay necesidad de forzar la ejecución de '_compute_carga_info' en el 'write'.


Puedes ejecutar un fragmento de código que ejecute '_compute_carga_info' para los registros que necesites mediante las migraciones de versiones:  https://www.odoo.com/documentation/18.0/developer/reference/upgrades/upgrade_scripts.html



Avatar
Descartar
Autor

Gracias Miguel, analizare tus comentarios de momento ya tengo otra peticion del cliente. en reumen la peticion es de la carta porte que se genera del mudulo orden de servicio(modulo adptado no viene con odoo y dicho modulo puede ser alimentado por el cliente para pedir su viaje(sitio web en oddo) o asu vez por el area comercial quien capta al cliente) bueno te decia generar carta porte-timbrar-facturar, no tengo bien claro este proceso en odoo y estoy revisando la estructura en mi proyecto que manejamos de testing (custom addons)hay 3 carpetas (gestion_logistica en esta es donde encontre denro de modelos /logistica_operacion.py que es el archivos que afectan a mi modulo de logistica(tambien modelo hecho a la medida en oddo para mi empresa); otra carpeta logistica_360, dentro de modelo encuentro el archivo carta_porte.py que me imagino es la que lleva la logica para generar la cata porte, ok de ahi despues de generar la carta porte y timbrar eso no me queda claro se genera la factura, actualmente lo hacen con un software externo (tractosoft) y quieren traerse ese proceso y que se valide en odoo ya esta avanzado estoy en la parte de validacion pero necesito entender lo del timbrado y que se genera la factura