Valuando inventarios en USD

25 de abril de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Continuando con nuestros posts sobre Odoo y la gestión bi-monetaria (días atrás hablamos de como tener márgenes en la moneda de la empresa y en USD) ahora vamos a ver como tener los inventarios valuados en USD.

Odoo tiene un módulo llamado stock_account el cual se encarga de agregar la valuación en tiempo real de los inventarios, valuando cada movimiento de stock y permitiendonos consultar por el valor de nuestros inventarios. Lo que necesitamos es conocer dichos valores en dólares. Para eso desarrollamos el módulo stock_valuation_usd que nos permite solucionar dicho problema.

Supongamos tenemos la cotización del USD en 1000 ARS


Ahora vamos a crear un producto que tiene el promedio como método de costo. Y del mismo producto vamos a realizar una compra por 100,000 ARS


Y confirmamos la recepción. Al ver los inventarios por producto podemos ver como se actualiza el costo en USD por producto.


Y si consultamos por ubicación podemos ver también la valuación en USD


Por último, el módulo sirve tanto para la versión Communiy como Enterprise de Odoo.

Notas técnicas

Basicamente lo que hace el módulo es crear campos computados como lo hace el módulo margin_usd. En este caso lo primero que hacemos es agregar el campo de valor en USD (value_usd) como campo computado al modelo stock.valuation.layer (donde se almacena la valuación en USD). Se tomo como valor del stock el representado en el campo value y como fecha de valuación el campo create_date

    def _compute_values_usd(self):
for rec in self:
res = rec.company_id.currency_id._convert(
rec.value,
self.env.ref('base.USD'),
rec.company_id,
rec.create_date,
)
rec.value_usd = res
res = rec.company_id.currency_id._convert(
rec.unit_cost,
self.env.ref('base.USD'),
rec.company_id,
rec.create_date,
)
rec.unit_cost_usd = res

value_usd = fields.Float('Valor USD',compute=_compute_values_usd)
unit_cost_usd = fields.Float('Unit Cost USD',compute=_compute_values_usd)

Lo mismo se hace para el campo unit_cost.

Lo mismo se hace para el modelo stock.quant (que almacena el stock). En este caso el modelo stock.quant sumariza los valores contenidos en el modelo stock.valuation.layer. Y se extiende el modelo product.product donde se sumariza los valores por producto para el modelo stock.valuation.layer también.

class ProductProduct(models.Model):
_inherit = "product.product"

def _compute_total_value_usd(self):
for rec in self:
valuation_layers = self.env['stock.valuation.layer'].search([('product_id','=',rec.id)])
value_usd = sum(valuation_layers.mapped('value_usd'))
rec.total_value_usd = value_usd

total_value_usd = fields.Float('Valor Total USD',compute=_compute_total_value_usd)
Gustavo Orrillo 25 de abril de 2024
Compartir
Archivar
Identificarse dejar un comentario