Hi,
call the onchange product with good order pricelist, fiscal position, date order, partner_id order .... and you will have all good values like if you will do this manually in the view.
UPDATE : code written without testing
1) just do operation in create sale.order :
def create(self, cr, uid, vals, context=None):
context = context or {}
sol = self.pool.get('sale.order.line')
if vals.get('name','/')=='/':
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.order') or '/'
pricelist_id = vals.get('pricelist_id') or False
fiscal_position_id = vals.get('fiscal_position') or False
partner_id = vals.get('partner_id') or False
date_order = vals.get('date_order') or False
order_line = False
# In onchange, I put quantity = 1 because not specified, important to calculate correctly pricelist sometimes give different price_unit depending of quantity ... (specify you real quantity by product). You can loop directly on onchange I think ...
for product_id, qty in [(1, 1), (4, 1)]:
onchange = sol.product_id_change(cr, uid, [], pricelist_id, product_id, qty=qty, uom=False, qty_uos=qty, uos=False, name='', partner_id=partner_id, lang=False, update_tax=True, date_order=date_order, packaging=False, fiscal_position=fiscal_position_id , flag=False, context=context)
onchange = onchange.get('value') or False
if onchange:
tax_id = onchange.get('tax_id') or []
if tax_id:
tax_id = [[6, 0, tax_id]]
onchange['tax_id'] = tax_id
onchange['product_id'] = product_id
onchange['qty'] = qty
order_line += [(0, 0, onchange)]
if order_line:
vals['order_line'] += order_line
res = super(sale_order, self).create(cr, uid, vals, context=context)
2) to get tax (see in sol function product_id_change):
context = context or {}
lang = lang or context.get('lang', False)
if not partner_id:
raise osv.except_osv(_('No Customer Defined!'), _('Before choosing a product,\n select a customer in the sales form.'))
partner_obj = self.pool.get('res.partner')
product_obj = self.pool.get('product.product')
context = {'lang': lang, 'partner_id': partner_id}
partner = partner_obj.browse(cr, uid, partner_id)
lang = partner.lang
context_partner = {'lang': lang, 'partner_id': partner_id}
fpos = False
if not fiscal_position:
fpos = partner.property_account_position or False
else:
fpos = self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position)
if update_tax: #The quantity only have changed
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)
Bye