Per quello che voglio fare penso di no. La soluzione da te proposta la vedo più da "compro un prosciutto intero" circa 8 kg e lo vendo affettato.
Quello che intendo io è, ti propongo due esempi che mi capitano nel negozio tutti i giorni:
1) Semplice- Acquisto dal fornitore un cartone di birra(15 bottiglie) e le vendo singole
2) Un po più complesso, se così si può dire - Acquisto sempre un cartone di mezze birre ma questa volta il cartone ne contiene
8 conf da 3. La vendita in questo caso si complica perché ne posso vendere 1 conf(da tre) oppure 1 bottiglia.
In pratica ci sono due modi, almeno da quello che ho potuto capire.
1) Mi creo un articolo "birra" e faccio alcune distinte base (es: cartone di birra da 15) che contengono 15 birre. Oppure due distinte che contengono una "conf. da 3pz" che fa riferimento alla birretta singola, e una "Cartone da 8pz" che fa riferimento alla "conf da 3pz".
Il tutto mi sembra abbastanza lineare e fattibile ma con tanti articoli si può incorrere a grossi problemi di gestione.
In questo modo non ho neanche problemi con i lotti in ingresso perché fanno riferimento alla singola bottiglia.
2) Usare EDI dove in ogni articolo si può descrivere le varie forme di confezionamento. Usando Edi forse è tutto più lineare e soprattutto le varie confezioni sono gestibili direttamente dall'articolo senza bisogno di cercare ne database nell'eventualità di un cambio prezzo.
Penso che riscriverò in modulo passando per EDI anziché la distinta base oppure faccio un modulo ibrido per la produzione di alcuni prodotti.
Detto questo, per far capire a chi compra cosa compra in fattura dovrei rappresentare "un cartone contiene cosa" (1 ct contiene 15 pz) Più o meno come descritto all'inizio.
Il modulo, da me fatto, funziona fino ad un certo punto poi mi sono arenato. Il problema, sia se scelgo l'opzione 1 o 2, mi si ripeterà comunque ed è relativo al passaggio dei dati dalla "form" di inserimento al "tree" che appare in sale_order.
Se premo il pulsante "salva e chiudi" della form i dati vengono scritti nella tree.
Ma se modifico la linea della Tree e mi compare solo il pulsante "Salva" i dati non vengono modificati.
Come se "Salva" e "salva e chiudi" fossero due cosa diverse.
Un po di codice per capire:
La View
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="order_form_quantity" model="ir.ui.view">
<field name="name">sale.order.form.molino</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<!-- <xpath expr="//field[@name='order_line']/form/group/group/div/field[@name='product_uos_qty']" position="before">-->
<xpath expr="//field[@name='order_line']/form/group/group/label[@for='product_uos_qty']" position="before">
<field name="product_bom_qty" readonly="1"/>
<field name="product_uom_qty_tot" readonly="1"/>
</xpath>
<xpath expr="//field[@name='order_line']/tree[@string='Sales Order Lines']/field[@name='product_uom']" position="before">
<!-- <field name="product_bom_qty" readonly="1" on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, False, parent.fiscal_position, True, context)"/>-->
<field name="product_bom_qty" readonly="1" />
<!-- <field name="product_uom_qty_tot" readonly="1" on_change="product_id_change(parent.pricelist_id,product_id,product_uom_qty,product_uom,product_uos_qty,product_uos,name,parent.partner_id, False, False, parent.date_order, False, parent.fiscal_position, True, context)"/>-->
<field name="product_uom_qty_tot" readonly="1" />
</xpath>
</field>
</record>
</data>
</openerp>
Parte del Modulo
class sale_order_line(models.Model):
_inherit = 'sale.order.line'
product_uom_qty_tot = fields.Float(string='Total quantity')
product_bom_qty = fields.Float(string='Bom quantity')
# Parte ancora da fare completamente
# serve per preparare il contenuto del sale_order_line in fattura
# lo si nota quando si crea la fattura per aggiungere le righe d'ordine
@api.model
def _prepare_order_line_invoice_line(self, line, account_id=False, context=None):
res = super(sale_order_line, self)._prepare_order_line_invoice_line(line, account_id=account_id, context=context)
print "**** _prepare_order_line_invoice_line MOLINO ****"
print "**** RES ****", res
return res
@api.model
def create(self, values, context=None):
if values.get('order_id') and values.get('product_id') and any(f not in values for f in ['name', 'price_unit', 'product_uom_qty', 'product_uom', 'product_bom_qty', 'product_uom_qty_tot']):
order = self.env['sale.order'].browse( values['order_id'])
defaults = self.product_id_change(order.pricelist_id.id, values['product_id'],
qty=float(values.get('product_uom_qty', False)),
uom=values.get('product_uom', False),
qty_uos=float(values.get('product_uos_qty', False)),
uos=values.get('product_uos', False),
name=values.get('name', False),
partner_id=order.partner_id.id,
date_order=order.date_order,
fiscal_position=order.fiscal_position[0] if order.fiscal_position else False,
flag = values.get('flag', False),
context=dict(context or {})
)['value']
if defaults.get('tax_id'):
defaults['tax_id'] = [[6, 0, defaults['tax_id']]]
values = dict(defaults, **values)
return super(sale_order_line, self).create( values, context=context)
@api.multi
def product_id_change(self, pricelist, product, qty=0, uom=False, qty_uos=0, uos=False,
name='', partner_id=False, lang=False, update_tax=True, date_order=False,
packaging=False, fiscal_position=False, flag=False, context=None ):
res = super(sale_order_line, self).product_id_change(pricelist, product, qty=qty, uom=uom,
qty_uos=qty_uos, uos=uos, name=name,
partner_id=partner_id, lang=lang, update_tax=update_tax,
date_order=date_order, packaging=packaging, fiscal_position=fiscal_position,
flag=flag, context=context)
bom_qty = self.env['product.product'].browse(product).product_tmpl_id.bom_ids.bom_line_ids.product_qty
if product == False or bom_qty == False:
bom_qty = 1.0
uom_qty_tot = bom_qty * qty
else:
uom_qty_tot = bom_qty * qty
res['value'].update(product_bom_qty = bom_qty, product_uom_qty_tot = uom_qty_tot)
return res
Non ho tenuto conto se nella distinta base c'è più di un articolo, infatti mi da errore, ma non è questo il problema.
Vi ringrazio per le eventuali risposte.