General

¡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.

0

¿Cómo puedo modificar los valores del resumen de una factura de Odoo 15?

Avatar
Jose Ramon

Hola a todos.

Necesito saber como hacer lo siguiente en Odoo 15.

Tengo un modelo que hereda account.move.line.

El modelo tiene dos nuevos campos: x_actual y x_anterior. x_anterior se introduce directamente en la factura. Tengo otro campo que trata de sobreescribir el price_subtotal.

from odoo import models, fields, api class AccountMoveLine(models.Model): _inherit = 'account.move.line' x_actual = fields.Monetary(string="Actual", compute='_compute_x_actual', store=True) x_anterior = fields.Monetary(string="Anterior", store=True) price_subtotal = fields.Monetary(string="Líquido mes", compute='_compute_price_subtotal', store=True) @api.depends('quantity', 'price_unit', 'x_anterior') def _compute_x_actual(self): for line in self: line.x_actual = line.quantity * line.price_unit @api.depends('x_actual', 'price_unit', 'x_anterior') def _compute_price_subtotal(self): for line in self: line.price_subtotal = (line.quantity * line.price_unit) - line.x_anterior

Cuando lo ejecuto sale esto:

Base imponible: 12
Iva 21%:                2,52
Total:                    14,52


Quisiera que en el resumen saliera como base imponible el valor calculado de price_subtotal (10), el valor de los impuestos correctos(2,10), una suma correcta (12,10) y su correcta aplicación en los demás sitios en los que actuaría el cálculo de impuestos.

Llevo un tiempo con ello y no doy con la tecla y cuando he modifcado el tax_totals_json correctamente, solo lo veo bien antes del guardado, Si guardo, no guarda los datos que necesito guardar correctamente y guarda como si no restara nada al price_subtotal.

1 Comentario
Avatar
Descartar
Avatar
Raúl
-

Hola,
Realizar eso te va a costar mucho trabajo ahora y en el futuro muchos dolores de cabeza...
Tampoco tiene mucho sentido modificar la base imponible... ¿Qué ganarías con esto?

Un saludo!

1 Respuesta
0
Avatar
Jose Ramon
Mejor respuesta

Hola. Gracias por responder.

Le he preguntado a la persona que me lo pidió y lo quiere así. Dice que le hacen pagos y cobra sobre una factura general a la cual le van quitando una cantidad de una casilla que introducen ellos llamada "Anterior". Es absurdo porque para eso están los pagos de la factura.  Igual es por mantener coherencia con sus facturas anteriores  a introducir Odoo.

En fin, al final lo conseguí:

class AccountMoveLine(models.Model):
    _inherit = 'account.move.line'

    x_actual = fields.Monetary(string="Actual", compute='_compute_x_actual', store=True)
    x_anterior = fields.Monetary(string="Anterior", default=0.0, store=True)
    discount = fields.Float(string='Anterior', digits=(16, 16),  default=0.0)


    @api.depends('quantity', 'price_unit', 'x_anterior')
    def _compute_x_actual(self):
        for line in self:
            line.x_actual = line.quantity * line.price_unit


    @api.onchange('x_anterior', 'quantity', 'price_unit')
    def _onchange_x_anterior(self):
        for line in self:
            if line.x_anterior <= (line.quantity * line.price_unit):
                if line.x_anterior == 0.00:
                    line.update({
                        'discount': 0.00
                    })
                else:
                    line.update({
                        'discount': (line.x_anterior * 100)/(line.quantity * line.price_unit)
                    })
            elif(line.x_anterior > line.price_subtotal):
                raise ValidationError(_(
                "El descuento para el producto '%(product)s' debe ser menor que '%(amount)s'.",
                product=line.product_id.name,
                amount=line.quantity * line.price_unit
            ))

    @api.depends('discount')
    def _onchange_discount(self):
        for line in self:
            line.update({
                'x_anterior': (line.quantity * line.price_unit * line.discount) / 100
            })




Por si a alguien le sirve. En la base de datos todo correcto.
En factura imprimirá el descuento pero se cambia por el campo correcto y listo. Un saludo
Avatar
Descartar

Su respuesta

Intente dar una respuesta sustancial. Si desea hacer un comentario sobre la pregunta o la respuesta, utilice la herramienta de comentarios. Recuerde que siempre puede revisar sus respuestas , no es necesario responder dos veces a la misma pregunta. No olvide votar , ayuda a seleccionar las mejores preguntas y respuestas