bzr revid: fp@tinyerp.com-20081207124527-q60i5wo0ymhd3u4o
This commit is contained in:
Fabien Pinckaers 2008-12-07 13:45:27 +01:00
parent 2ab038ef96
commit 75019e2eab
2 changed files with 32 additions and 29 deletions

View File

@ -113,6 +113,12 @@ class account_invoice(osv.osv):
res[id]=[x for x in l if x <> line.id] res[id]=[x for x in l if x <> line.id]
return res return res
def _get_invoice_line(self, cr, uid, ids, context={}):
result = {}
for tax in self.pool.get('account.invoice.line').browse(cr, uid, ids, context=context):
result[tax.invoice_id.id] = True
return result.keys()
def _get_invoice_tax(self, cr, uid, ids, context={}): def _get_invoice_tax(self, cr, uid, ids, context={}):
result = {} result = {}
for tax in self.pool.get('account.invoice.tax').browse(cr, uid, ids, context=context): for tax in self.pool.get('account.invoice.tax').browse(cr, uid, ids, context=context):
@ -183,18 +189,21 @@ class account_invoice(osv.osv):
store={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10),
'account.invoice.tax': (_get_invoice_tax, None, 10), 'account.invoice.tax': (_get_invoice_tax, None, 10),
'account.invoice.line': (_get_invoice_line, None, 10),
}, },
multi='all'), multi='all'),
'amount_tax': fields.function(_amount_all, method=True, digits=(16,2), string='Tax', 'amount_tax': fields.function(_amount_all, method=True, digits=(16,2), string='Tax',
store={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10),
'account.invoice.tax': (_get_invoice_tax, None, 10), 'account.invoice.tax': (_get_invoice_tax, None, 10),
'account.invoice.line': (_get_invoice_line, None, 10),
}, },
multi='all'), multi='all'),
'amount_total': fields.function(_amount_all, method=True, digits=(16,2), string='Total', 'amount_total': fields.function(_amount_all, method=True, digits=(16,2), string='Total',
store={ store={
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10), 'account.invoice': (lambda self, cr, uid, ids, c={}: ids, None, 10),
'account.invoice.tax': (_get_invoice_tax, None, 10), 'account.invoice.tax': (_get_invoice_tax, None, 10),
'account.invoice.line': (_get_invoice_line, None, 10),
}, },
multi='all'), multi='all'),
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),

View File

@ -60,38 +60,29 @@ class sale_order(osv.osv):
}) })
return super(sale_order, self).copy(cr, uid, id, default, context) return super(sale_order, self).copy(cr, uid, id, default, context)
def _amount_untaxed(self, cr, uid, ids, field_name, arg, context): def _amount_line_tax(self, cr, uid, line, context={}):
res = {} val = 0.0
cur_obj=self.pool.get('res.currency') for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, line.order_id.partner_invoice_id.id, line.product_id, line.order_id.partner_id):
for sale in self.browse(cr, uid, ids): val+= c['amount']
res[sale.id] = 0.0 return val
for line in sale.order_line:
res[sale.id] += line.price_subtotal
cur = sale.pricelist_id.currency_id
res[sale.id] = cur_obj.round(cr, uid, cur, res[sale.id])
return res
def _amount_tax(self, cr, uid, ids, field_name, arg, context): def _amount_all(self, cr, uid, ids, field_name, arg, context):
res = {} res = {}
cur_obj=self.pool.get('res.currency') cur_obj=self.pool.get('res.currency')
for order in self.browse(cr, uid, ids): for order in self.browse(cr, uid, ids):
val = 0.0 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 cur=order.pricelist_id.currency_id
for line in order.order_line: for line in order.order_line:
for c in self.pool.get('account.tax').compute(cr, uid, line.tax_id, line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, order.partner_invoice_id.id, line.product_id, order.partner_id): val1 += line.price_subtotal
val+= c['amount'] val += self._amount_line_tax(cr, uid, line, context)
res[order.id]=cur_obj.round(cr, uid, cur, val) res[order.id]['amount_tax']=cur_obj.round(cr, uid, cur, val)
return res 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']
def _amount_total(self, cr, uid, ids, field_name, arg, context):
res = {}
untax = self._amount_untaxed(cr, uid, ids, field_name, arg, context)
tax = self._amount_tax(cr, uid, ids, field_name, arg, context)
cur_obj=self.pool.get('res.currency')
for id in ids:
order=self.browse(cr, uid, [id])[0]
cur=order.pricelist_id.currency_id
res[id] = cur_obj.round(cr, uid, cur, untax.get(id, 0.0) + tax.get(id, 0.0))
return res return res
def _picked_rate(self, cr, uid, ids, name, arg, context=None): def _picked_rate(self, cr, uid, ids, name, arg, context=None):
@ -231,9 +222,12 @@ class sale_order(osv.osv):
'invoiced': fields.function(_invoiced, method=True, string='Paid', 'invoiced': fields.function(_invoiced, method=True, string='Paid',
fnct_search=_invoiced_search, type='boolean'), fnct_search=_invoiced_search, type='boolean'),
'note': fields.text('Notes'), 'note': fields.text('Notes'),
'amount_untaxed': fields.function(_amount_untaxed, method=True, string='Untaxed Amount'),
'amount_tax': fields.function(_amount_tax, method=True, string='Taxes', store=True), 'amount_untaxed': fields.function(_amount_all, method=True, string='Untaxed Amount',
'amount_total': fields.function(_amount_total, method=True, string='Total', store=True), store=True, multi='sums'),
'amount_tax': fields.function(_amount_all, method=True, string='Taxes', store=True, multi='sums'),
'amount_total': fields.function(_amount_all, method=True, string='Total', store=True, multi='sums'),
'invoice_quantity': fields.selection([('order','Ordered Quantities'),('procurement','Shipped Quantities')], 'Invoice on', help="The sale order will automatically create the invoice proposition (draft invoice). Ordered and delivered quantities may not be the same. You have to choose if you invoice based on ordered or shipped quantities. If the product is a service, shipped quantities means hours spent on the associated tasks.",required=True), 'invoice_quantity': fields.selection([('order','Ordered Quantities'),('procurement','Shipped Quantities')], 'Invoice on', help="The sale order will automatically create the invoice proposition (draft invoice). Ordered and delivered quantities may not be the same. You have to choose if you invoice based on ordered or shipped quantities. If the product is a service, shipped quantities means hours spent on the associated tasks.",required=True),
'payment_term' : fields.many2one('account.payment.term', 'Payment Term'), 'payment_term' : fields.many2one('account.payment.term', 'Payment Term'),
} }