Odoo Help


How to calculate total amount sub total in Purchase Order and Invoice based on a new field..

on 9/18/15, 12:09 PM 869 views

My code is here and what i want to do is to calculate total sub total from item_seller_price if price_unit is 0... but when the code runs it didnt gave Description in purchase order neither Scheduled Date nor Subtotal

from openerp.osv import osv, fields

class purchase_order_line(osv.osv):

_inherit ='purchase.order.line'

_columns = {

'item_seller_price' : fields.float('Item Seller Price'),


def _amount_all(self, cr, uid, ids, field_name, arg, context=None):

res = {}


for order in self.browse(cr, uid, ids, context=context):

res[order.id] = {

'amount_untaxed': 0.0,

'amount_tax': 0.0,

'amount_total': 0.0,


val = val1 = 0.0

cur = order.pricelist_id.currency_id

for line in order.order_line:

price_unit = line.price_unit

if line.item_seller_price != 0:

price_unit = line.item_seller_price

val1 += line.price_subtotal

for c in self.pool.get('account.tax').compute_all(cr, uid, line.taxes_id, line.price_unit, line.product_qty, line.product_id, order.partner_id)['taxes']:

val += c.get('amount', 0.0)

res[order.id]['amount_tax']=cur_obj.round(cr, uid, cur, val)

res[order.id]['amount_untaxed']=cur_obj.round(cr, uid, cur, val1)

res[order.id]['amount_total']=res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']

return res

def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,

partner_id, date_order=False, fiscal_position_id=False, date_planned=False,

name=False, price_unit=False, state='draft', context=None):

value = {}

if not product_id:

return value

value = super(purchase_order_line,self).onchange_product_id(cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order, fiscal_position_id, date_planned, name, price_unit, state, context )

names = self.pool.get('product.product').browse(cr, uid,product_id, context=context)


'item_seller_price' : names.product_item_seller_price_id and names.product_item_seller_price_id.name or False,

'name' : names.product_item_seller_price_id and names.product_item_seller_price_id.name or False,

# 'sitelocation': names.sitelocation and names.sitelocation.id or False,



return {'value' : value}


class purchase_order(osv.osv):

_inherit ='purchase.order'

def _prepare_inv_line(self, cr, uid, account_id, order_line, context=None):

"""Collects require data from purchase order line that is used to create invoice line

for that purchase order line

:param account_id: Expense account of the product of PO line if any.

:param browse_record order_line: Purchase order line browse record

:return: Value for fields of invoice lines.

:rtype: dict


return {

'name': order_line.name,

'account_id': account_id,

'price_unit': order_line.price_unit or 0.0,

'quantity': order_line.product_qty,

'product_id': order_line.product_id.id or False,


'uos_id': order_line.product_uom.id or False,

'invoice_line_tax_id': [(6, 0, [x.id for x in order_line.taxes_id])],

'account_analytic_id': order_line.account_analytic_id.id or False,

'purchase_line_id': order_line.id,


def action_invoice_create(self, cr, uid, ids, context=None):

"""Generates invoice for given ids of purchase orders and links that invoice ID to purchase order.

:param ids: list of ids of purchase orders.

:return: ID of created invoice.

:rtype: int


context = dict(context or {})

inv_obj = self.pool.get('account.invoice')

inv_line_obj = self.pool.get('account.invoice.line')

res = False

uid_company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id

for order in self.browse(cr, uid, ids, context=context):

context.pop('force_company', None)

if order.company_id.id != uid_company_id:

#if the company of the document is different than the current user company, force the company in the context

#then re-do a browse to read the property fields for the good company.

context['force_company'] = order.company_id.id

order = self.browse(cr, uid, order.id, context=context)

# generate invoice line correspond to PO line and link that to created invoice (inv_id) and PO line

inv_lines = []

for po_line in order.order_line:

if po_line.state == 'cancel':


acc_id = self._choose_account_from_po_line(cr, uid, po_line, context=context)

inv_line_data = self._prepare_inv_line(cr, uid, acc_id, po_line, context=context)

inv_line_id = inv_line_obj.create(cr, uid, inv_line_data, context=context)


po_line.write({'invoice_lines': [(4, inv_line_id)]})

# get invoice data and create invoice

inv_data = self._prepare_invoice(cr, uid, order, inv_lines, context=context)

inv_id = inv_obj.create(cr, uid, inv_data, context=context)

# compute the invoice

inv_obj.button_compute(cr, uid, [inv_id], context=context, set_total=True)

# Link this new invoice to related purchase order

order.write({'invoice_ids': [(4, inv_id)]})

res = inv_id

return res

class invoice_line(osv.osv):

_inherit ='account.invoice.line'

_columns = {

'item_seller_price' : fields.float('item seller price'),


Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

1 follower(s)


Asked: 9/18/15, 12:09 PM
Seen: 869 times
Last updated: 9/18/15, 12:09 PM