Blanquear stock en Odoo pasándolo a Scrap con XMLRPC

17 de junio de 2024 por
Andres Dawidowicz
| Sin comentarios aún
 

Hay varias razones para tener la necesidad de blanquear el stock en Odoo y por ya tener movimientos, no se quiere suprimir y perder la historia.

Puede se que se quiera llevar a cero el stock por.....

  • Empezar en producción un sistema que tiene pruebas
  • Tomar un inventario hecho en Excel y no se quiere calcular las diferencias, sino volcar el Excel tal como está
  • Diferencias irreconciliable de stock entre la realidad y el stock que figura en Odoo

Una buena forma, que hice hace poco es hacer un programa con XMLRPC que calcule el stock del deposito o de la suma de los depósitos internos y hacer un pase con dicho cálculo al depósito de Scrap. 

El código es bastante sencillo y se los dejo aquí

def srap_stk():
quant_ids = models.execute_kw(dbname,uid,pwd,'stock.quant','search',[[['location_id.usage','=','internal']]])
for quant_id in quant_ids:
vals = {}
location_dest_id = models.execute_kw(dbname,uid,pwd,'stock.location','search',[[['complete_name','=','Virtual Locations/Scrap'],['company_id','=',1]]])
vals['location_dest_id'] = location_dest_id[0]
location_id = models.execute_kw(dbname,uid,pwd,'stock.location','search',[[['complete_name','=','WH/Stock']]])
vals['location_id'] = location_id[0]

quant_data = models.execute_kw(dbname,uid,pwd,'stock.quant','read',[quant_id])

vals['product_id'] = quant_data[0]['product_id'][0]
vals['product_uom_qty'] = quant_data[0]['quantity']

if quant_data[0]['quantity'] == 0:
continue

product_data = models.execute_kw(dbname,uid,pwd,'product.product','read',[quant_data[0]['product_id'][0]])

vals['product_uom'] = product_data[0].get('uom_id')[0]
vals['name'] = 'Pasar a Scrap %s' % product_data[0].get('name')
vals['company_id'] = 1
vals['state'] = 'draft'
vals['is_inventory'] = True
move_id = models.execute_kw(dbname,uid,pwd,'stock.move','create',[vals])
# Agrega al diccionario el move_id y crea la línea de mov de stock
vals['move_id'] = move_id
# asigna la unidad de medida a product_uom_id y borra product_uom
vals['product_uom_id'] = vals.get('product_uom')
vals['qty_done'] = vals.get('product_uom_qty')
del vals['product_uom']
del vals['product_uom_qty']
# borra name
del vals['name']
move_line_id = models.execute_kw(dbname,uid,pwd,'stock.move.line','create',[vals])
return_id = models.execute(dbname,uid,pwd,'stock.move','action_done',[move_id])

Primero busco los stock.quant que están en depósitos internos y recorro los registros. 

Busco los id del depósito desde y hasta por su nombre, en este caso hay un solo depósito interno y el depósito destino sería el de scrap

Busco cada artículo en el modelo product.product para tener la descripción, unidad de medida, etc.

Lleno los datos para grabar el pase de stock en las tablas de stock, stock.move y stock.move.line y luego llamo a la función action_done para confirmar el movimiento

Primer issue conque nos vamos a encontrar, el movimiento de stock debe ser confirmado. Pero no se puede invocar el método _action_done con xmlrpc debido a que el mismo retorna un valor None. Para eso creamos un módulo llamado stock_done, el cual permite llamar al método _action_donde desde xmlrpc.

Luego podemos importar el stock desde una planilla Excel, viendo el blog Importar Stock con XLMRPC




Andres Dawidowicz 17 de junio de 2024
Compartir
Archivar
Identificarse dejar un comentario