Pricelists are used only in sale, purchase, pos forms, not in invoice form, for that, the field should be add to the invoice form, to override methods product_id_change depending pricelist (eventually onchange_partner_id to get automatically the good pricelist) .
Difference between product price inherited from sale, purchase, pos in an invoice (without do a product onchange after creation of this invoice), and created an invoice directly without inherithing sale, purchase, pos, is due to onchange on field product_id.
Example :
for sale, pricelist is used to calculate price :
def product_id_change(self, cr, uid, ids, 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):
.....................
price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist],
product, qty or 1.0, partner_id, {
'uom': uom or result.get('product_uom'),
'date': date_order,
})[pricelist]
...............................
for invoice, no pricelist used :
def product_id_change(self, product, uom_id, qty=0, name='', type='out_invoice',
partner_id=False, fposition_id=False, price_unit=False, currency_id=False,
company_id=None):
..................
if type in ('in_invoice', 'in_refund'):
values['price_unit'] = price_unit or product.standard_price
else:
values['price_unit'] = product.list_price
..................
It is enough clear ?
bye