Consulta modulo stock picking

37 views
Skip to first unread message

Santiago

unread,
May 14, 2019, 7:48:49 PM5/14/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Gente estoy tratando de hacer una recepción múltiple, es decir, varias Ordenes de Compra, cargar sus "lineas" y crear el movimiento de stock. Mirando la creacion de facturas de los proveedores hay una funcionalidad que me parecio util y trate de copiarla, funciono, pero el tema esta que cuando quiero guardar la recepción me da un error con product_id.

class Picking(models.Model):
_inherit = "stock.picking"

wm_multiple = fields.Boolean(string=u'recepción Multiple ?')

wm_purchase_id = fields.Many2one(
comodel_name='purchase.order',
string='Add Purchase Order',
# readonly=True,
# states={'draft': [('readonly', False)]},
help=
'Encoding help. When selected, the associated purchase order lines are added to the vendor bill. Several PO can be selected.'
)

def _prepare_move_line_from_po_line(self, line):
print("prueba")

# Load all unsold PO lines
@api.onchange('wm_purchase_id')
def purchase_order_change(self):
import pdb
if not self.wm_purchase_id:
return {}
if not self.partner_id: # ACTUALIZO PARTNER
self.partner_id = self.wm_purchase_id.partner_id.id

# Nuevas lineas
StockMove = self.env['stock.move']
date = fields.Datetime.now()
for line in self.wm_purchase_id.order_line:
pid = self.env['product.product'].browse([line.product_id.id])
data = {
'name': line.order_id.name+': '+line.name or False,
'product_id': pid or False,
'product_uom': line.product_uom.id or False,
'product_uom_qty': line.product_qty - line.qty_received or False,
'quantity_done': 0.0 or False,
'date': date or False,
'date_expected': date or False,
'location_id': self.location_id or False,
'location_dest_id': self.location_dest_id or False,
'company_id': self.company_id.id or False,
'procure_method': "make_to_stock" or False,
}
pdb.set_trace()
new_line = StockMove.new(data)
pdb.set_trace()
# new_line._set_additional_fields(self)
StockMove += new_line

print("Antes del self move_lines")
import pdb
pdb.set_trace()
self.move_lines += StockMove
self.env.context = dict(self.env.context)
self.wm_purchase_id = False
return {}

EL CODIGO DE ERROR

Gabriel Davini

unread,
May 14, 2019, 10:07:57 PM5/14/19
to odoo-ar...@googlegroups.com
Hola Santiago,

Antes que nada para compartir código está bueno usar webs como pastebin, linkode, etc., es mucho más legible.

Luego te puedo decir que hasta hace no mucho setear one2many en onchanges no andaba, fijate de tener el Odoo actualizado. En v11 y v12 lo arreglaron a fin del año pasado, principio de este, en las demas no se.

El error q te tira es porque el campo product_id de stock.move es requerido a nivel base de datos y le está llegando como NULL, por eso falla. Asi a simple vista no encuentro el error, pero hay varias cosas q no veo bien en tu código, quizás arreglando esto le encuentres la vuelta:

Primero que lo q estas intentando hacer yo lo haría desde un wizard, seleccionar varias POs ahi y hacer lo q tengas q hacer, me parece mucho más prolijo y mantenible a largo plazo.

Te respondo entre líneas:

No es necesario meter el line.product_id.id en una lista. De hecho, no estás usando el producto en otro lado, asi q no necesitas hacer el browse()
 
data = {
'name': line.order_id.name+': '+line.name or False,
'product_id': pid or False,

Aca pid es el objeto browseado, no el id del producto. El or False es redundante aca y en el resto del código q pasaste.
 
'product_uom': line.product_uom.id or False,
'product_uom_qty': line.product_qty - line.qty_received or False,
'quantity_done': 0.0 or False,
'date': date or False,
'date_expected': date or False,
'location_id': self.location_id or False,
'location_dest_id': self.location_dest_id or False,
'company_id': self.company_id.id or False,
'procure_method': "make_to_stock" or False,
}
pdb.set_trace()
new_line = StockMove.new(data)
pdb.set_trace()
# new_line._set_additional_fields(self)
StockMove += new_line

print("Antes del self move_lines")
import pdb
pdb.set_trace()
self.move_lines += StockMove
self.env.context = dict(self.env.context)

Esto no lo hagas 8-(
 
self.wm_purchase_id = False

Aca llamas recursivamente al onchange, no es nocivo porque al no estar seteado la próxima llamada al método sale enseguida, pero no lo veo como una buena práctica.
 
return {}

EL CODIGO DE ERROR

--
Recuerda siempre poner la mayor cantidad de datos para que se entienda bien que necesitas y que respondes. Algunos errores comunes:
 
- Siempre mencionar en que versión de odoo trabajas.
- Siempre mencionar si el servidor esta en LINUX o en windows y en que versión.
- No alcanza con colocar el debug del error, debes indicar que necesitas que haga el código.
- Comparte tu código en un servidor abierto como Github, Launchpad u otro.
- Si haces un manual, tutorial o algo de interés comunal, trata de usar google docs.
 
Tu tiempo es tan valioso como el de cualquiera de la comunidad. Aquí se valora el aporte que hagas. Cuanto mas ayudes mas ayuda recibirás.
 
Nuestras normas mínimas de convivencia puede leerlas en https://groups.google.com/d/forum/odoo-argentina?hl=es-ES
---
Has recibido este mensaje porque estás suscrito al grupo "odoo-Argentina - Preguntas y respuestas para personalizadores" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-argentin...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a odoo-ar...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/odoo-argentina/f77e7a51-8c70-475a-81d5-505870b2aa3e%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Gabriel.

Santiago

unread,
May 14, 2019, 10:34:49 PM5/14/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Dale lo voy a tener en cuenta para la proxima lo del codigo. Muchas gracias !
             
Te comento el browse() lo hice para probar simplemente. Ya que lo que yo hacia era ---->
'product_id': line.product_id.id or False,

Pero me daba el mismo error, y creo que eso seria lo correcto no  ?

Después los False se que son redundantes, el tema que queria ver si evitaba algun error o por lo menos que se me seteara algo en False y darme cuenta pero tenes razon.

No entiendo que es lo que me decís que no haga,
esto ??
self.env.context = dict(self.env.context)
o  esto ?
self.wm_purchase_id = False

Y lo de llamar al onchange recursivamente donde decis que se hace ? cuando seteo en false la variable purchase_id ?

Muchas gracias por responder ! Y disculpa por molestar!

Santiago

unread,
May 14, 2019, 10:36:29 PM5/14/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Me olvide de preguntarte, sobre los wizards tendras algun tuto por ahi ? Saludos
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-ar...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a odoo-ar...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/odoo-argentina/f77e7a51-8c70-475a-81d5-505870b2aa3e%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Gabriel.

Gabriel Davini

unread,
May 14, 2019, 10:46:22 PM5/14/19
to odoo-ar...@googlegroups.com
On Tue, 14 May 2019 at 23:36, Santiago <djsa...@gmail.com> wrote:
Me olvide de preguntarte, sobre los wizards tendras algun tuto por ahi ? Saludos

wizard se decía en la v6 👴, buscalo como TransientModel [0]


--
Gabriel.

Gabriel Davini

unread,
May 15, 2019, 12:06:59 AM5/15/19
to odoo-ar...@googlegroups.com
On Tue, 14 May 2019 at 23:34, Santiago <djsa...@gmail.com> wrote:
Dale lo voy a tener en cuenta para la proxima lo del codigo. Muchas gracias !
             
Te comento el browse() lo hice para probar simplemente. Ya que lo que yo hacia era ---->
'product_id': line.product_id.id or False,

Pero me daba el mismo error, y creo que eso seria lo correcto no  ?
 
Si
 
Después los False se que son redundantes, el tema que queria ver si evitaba algun error o por lo menos que se me seteara algo en False y darme cuenta pero tenes razon.

No entiendo que es lo que me decís que no haga,
esto ??
self.env.context = dict(self.env.context)

Si, para qué sobrescribir el context ? Usá with_context(). Además de q lo sorbrescribis con si mismo.
 
o  esto ?
self.wm_purchase_id = False

Y lo de llamar al onchange recursivamente donde decis que se hace ? cuando seteo en false la variable purchase_id ?

Claro, cuando haces self.wh_purchase_id = False. Quizas me equivoco, podes probar meter un print apenas entra al método y ver.

Si haces print de self.wh_purchase_id.order_line o de cada línea dentro del for qué te muestra? 

Muchas gracias por responder ! Y disculpa por molestar!
-- 
Recuerda siempre poner la mayor cantidad de datos para que se entienda bien que necesitas y que respondes. Algunos errores comunes:
 
- Siempre mencionar en que versión de odoo trabajas.
- Siempre mencionar si el servidor esta en LINUX o en windows y en que versión.
- No alcanza con colocar el debug del error, debes indicar que necesitas que haga el código.
- Comparte tu código en un servidor abierto como Github, Launchpad u otro.
- Si haces un manual, tutorial o algo de interés comunal, trata de usar google docs.
 
Tu tiempo es tan valioso como el de cualquiera de la comunidad. Aquí se valora el aporte que hagas. Cuanto mas ayudes mas ayuda recibirás.
 
Nuestras normas mínimas de convivencia puede leerlas en https://groups.google.com/d/forum/odoo-argentina?hl=es-ES
---
Has recibido este mensaje porque estás suscrito al grupo "odoo-Argentina - Preguntas y respuestas para personalizadores" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-argentin...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a odoo-ar...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Gabriel.

Santiago

unread,
May 15, 2019, 2:41:54 PM5/15/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Bueno, pude mejorar un poco el codigo y ahora funciona !


El problema ahora, es que por ejemplo cargo las lineas de la OC 1 suponete que se cargan 2 lineas. Hasta ahí todo bien, el tema es que si borro 1 de las lineas y luego selecciono de nuevo esa OC 1 (como para que cargue nuevamente esa linea que borre) me tira un error medio raro. Supongo que es algo a la hora de borrar la linea, y es como que no queda desreferenciada completamente, pero no me doy cuenta como solucionarlo.

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-ar...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a odoo-ar...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/odoo-argentina/e43f6b38-03bf-4bb8-956b-0e4b731c4db7%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Gabriel.

Gustavo Orrillo

unread,
May 15, 2019, 2:42:44 PM5/15/19
to odoo-ar...@googlegroups.com
yo iria por el wizard

Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a odoo-argentin...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a odoo-ar...@googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.


--

Santiago

unread,
May 15, 2019, 2:51:14 PM5/15/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Tenes algun video sobre eso ? jajaja .
O algun ejemplo me serviria, si es en español mejor. No tengo tanto problema con el ingles, pero me cuesta mas.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/odoo-argentina/a1febe6e-1c47-43d6-9335-3ae23b50770c%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Gabriel Davini

unread,
May 15, 2019, 8:08:18 PM5/15/19
to odoo-ar...@googlegroups.com
On Wed, 15 May 2019 at 15:41, Santiago <djsa...@gmail.com> wrote:
Bueno, pude mejorar un poco el codigo y ahora funciona !


+1!

El problema ahora, es que por ejemplo cargo las lineas de la OC 1 suponete que se cargan 2 lineas. Hasta ahí todo bien, el tema es que si borro 1 de las lineas y luego selecciono de nuevo esa OC 1 (como para que cargue nuevamente esa linea que borre) me tira un error medio raro. Supongo que es algo a la hora de borrar la linea, y es como que no queda desreferenciada completamente, pero no me doy cuenta como solucionarlo.

Quizas borrar, guardar y luego de guardar volver a hacer el onchange. Como dije antes y dijo Gustavo también, lo mejor sería un wizard. Está lleno de ejemplos en el código, buscalo como TransientModel, aca[0] te dejo un ejemplo.
 

Nunca vi este error, tendría que sentarme a debuguear extactamente eso. Fijate si podes meter un par de prints en las líneas antes de q salte el error y ver si te arroja alguna pista.

Santiago

unread,
May 15, 2019, 8:12:45 PM5/15/19
to odoo-Argentina - Preguntas y respuestas para personalizadores
Dale gracias Gabriel ! Saludos
Reply all
Reply to author
Forward
0 new messages