You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
4.2 KiB
88 lines
4.2 KiB
from openerp import api, models, fields
|
|
from openerp.osv import osv
|
|
import openerp.addons.decimal_precision as dp
|
|
|
|
|
|
class AccountInvoice(models.Model):
|
|
_inherit = "account.invoice"
|
|
|
|
@api.one
|
|
@api.depends('invoice_line.price_subtotal', 'tax_line.amount')
|
|
def _compute_amount(self):
|
|
self.amount_untaxed = sum(line.price_subtotal for line in self.invoice_line)
|
|
self.amount_tax = sum(line.amount for line in self.tax_line)
|
|
if self.discount_type == 'percent':
|
|
self.amount_discount = ((self.amount_untaxed + self.amount_tax) * self.discount_rate) / 100
|
|
elif self.discount_type == 'amount':
|
|
self.amount_discount = self.discount_rate
|
|
self.amount_total = self.amount_untaxed + self.amount_tax - self.amount_discount
|
|
|
|
discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True,
|
|
states={'draft': [('readonly', False)]})
|
|
discount_rate = fields.Float('Discount rate', digits_compute=dp.get_precision('Account'), readonly=True,
|
|
states={'draft': [('readonly', False)]})
|
|
amount_discount = fields.Float(string='Discount', digits=dp.get_precision('Account'),
|
|
readonly=True, compute='_compute_amount')
|
|
amount_untaxed = fields.Float(string='Subtotal', digits=dp.get_precision('Account'),
|
|
readonly=True, compute='_compute_amount', track_visibility='always')
|
|
amount_tax = fields.Float(string='Tax', digits=dp.get_precision('Account'),
|
|
readonly=True, compute='_compute_amount')
|
|
amount_total = fields.Float(string='Total', digits=dp.get_precision('Account'),
|
|
readonly=True, compute='_compute_amount')
|
|
|
|
@api.onchange('discount_type', 'discount_rate')
|
|
def compute_discount(self):
|
|
for inv in self:
|
|
amount = sum(line.price_subtotal for line in self.invoice_line)
|
|
tax = sum(line.amount for line in self.tax_line)
|
|
if inv.discount_type == 'percent':
|
|
if inv.discount_rate == 100:
|
|
disc_amnt = amount + tax
|
|
else:
|
|
disc_amnt = (amount + tax) * inv.discount_rate / 100
|
|
total = amount + tax - disc_amnt
|
|
self.amount_discount = disc_amnt
|
|
self.amount_total = total
|
|
else:
|
|
total = (amount + tax) - inv.discount_rate
|
|
self.amount_discount = inv.discount_rate
|
|
self.amount_total = total
|
|
|
|
@api.model
|
|
def _prepare_refund(self, invoice, date=None, period_id=None, description=None, journal_id=None):
|
|
res = super(AccountInvoice, self)._prepare_refund(invoice, date, period_id,
|
|
description, journal_id)
|
|
res.update({
|
|
'discount_type': self.discount_type,
|
|
'discount_rate': self.discount_rate,
|
|
})
|
|
return res
|
|
|
|
|
|
class invoice_line(osv.Model):
|
|
_inherit = 'account.invoice.line'
|
|
|
|
def move_line_get(self, cr, uid, invoice_id, context=None):
|
|
res = super(invoice_line, self).move_line_get(cr, uid, invoice_id, context=context)
|
|
inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context)
|
|
|
|
if inv.type in ('out_invoice', 'out_refund') and inv.discount_type:
|
|
prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category',
|
|
context=context)
|
|
prop_id = prop and prop.id or False
|
|
account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, inv.fiscal_position or False,
|
|
prop_id)
|
|
sign = -1
|
|
|
|
res.append({
|
|
'name': 'Discount',
|
|
'price_unit': sign * inv.amount_discount,
|
|
'quantity': 1,
|
|
'price': sign * inv.amount_discount,
|
|
'account_id': account_id,
|
|
'product_id': False,
|
|
'uos_id': False,
|
|
'account_analytic_id': False,
|
|
'taxes': False,
|
|
})
|
|
return res
|
|
|