enlightx ha scritto:product e location nel tuo esempio sono m2o e non o2m, ma non mi riferivo comunque ai singoli campi.
Ciò che intendevo era avere una tabella righe inventario, esattamente come il form dell'inventario standard di openerp.
Con un o2m puoi creare facilmente una seconda linea vuota.
In effetti non mi è chiaro come mai non usi il form standard.
ok adesso ho capito.
Non uso il form standard perchè è piu macchinoso del wizard che uso. Ho 8000 pz da inventariare e per ognuno con il form standard dovrei inserire la location dove si trova il pezzo e la quantità. Con il mio form mi limito ad inserire ogni volta solo il condice a barre, poichè gli altri campi rimangono valorizzati con i valori precedenti.
Siccome gli 8000 pezzi non è detto che siano in ordine, se dopo averne fatti 1000 me ne capita uno che ho già inventariato, nel form standard è un delirio trovare gli articoli già inseriti poichè non è presente neanche un filtro di ricerca.
La action che ho definito sul bottone cerca se il prodotto è già tra le linee inserite, in caso positivo incrementa la quantità, in caso negativo inserisce una linea nuova. Questa è la action che ho usato perchè non ho trovato un metodo più veloce per fare quello che mi serve.
versione onlineclass stock_inventory_barcode(osv.osv_memory):
_name = 'stock.inventory.barcode'
_description = 'stock.inventory.barcode'
_columns = {
'product_id': fields.many2one('product.product', 'Product', on_delete='cascade', required=True),
'location_id': fields.many2one('stock.location', 'Location', on_delete='cascade', required=True),
'qty': fields.integer('Qty', required=True),
}
_defaults = {
'qty': 1,
}
def act_insert(self, cr, uid, ids, context={}):
location = self.browse(cr, uid, ids, context)[0].location_id
qty = self.browse(cr, uid, ids, context)[0].qty
product = self.browse(cr, uid, ids, context)[0].product_id
inventory_line = self.pool.get('stock.inventory.line')
inventory_id = context and context.get('active_id', False)
assert inventory_id, _('Active ID is not set in Context')
inv_ids = inventory_line.search(cr, uid, ['&', '&', ('product_id', '=', product.id),
('location_id', '=', location.id),
('inventory_id', '=', inventory_id)])
if inv_ids:
# prodotto gia in inventory_line aggiorno qta
if not isinstance(inv_ids, list):
inv_ids = [inv_ids]
if len(inv_ids) == 1:
inv_ids = inv_ids[0]
prod_inv = inventory_line.browse(cr, uid, inv_ids, context=context)
inventory_line.write(cr, uid, inv_ids, {'product_qty': prod_inv.product_qty + qty}, context=context)
else:
#prodotto non c'e' lo creo
values = {
'inventory_id' : inventory_id,
'product_qty' : qty,
'location_id' : location.id,
'product_id' : product.id,
'product_uom' : product.uom_id.id,
}
inventory_line.create(cr, uid,values, context=context)
#non trovo come pulire self.browse(cr, uid, ids, context)[0].product_id
def act_close(self, cr, uid, ids, context={}):
return {}
stock_inventory_barcode()
p.s. ogni suggerimento per migliorare il codice è benvenuto.