diff --git a/sale_discount_total/models/account_invoice.py b/sale_discount_total/models/account_invoice.py
index a359c61fb..257a202b8 100644
--- a/sale_discount_total/models/account_invoice.py
+++ b/sale_discount_total/models/account_invoice.py
@@ -3,6 +3,14 @@ from openerp.osv import osv
import openerp.addons.decimal_precision as dp
+class AccountInvoiceLine(models.Model):
+ _inherit = "account.invoice.line"
+
+ discount = fields.Float(string='Discount (%)',
+ digits=(16, 10),
+ # digits= dp.get_precision('Discount'),
+ default=0.0)
+
class AccountInvoice(models.Model):
_inherit = "account.invoice"
@@ -12,17 +20,21 @@ class AccountInvoice(models.Model):
disc = 0.0
for inv in self:
for line in inv.invoice_line:
- disc += (line.quantity * line.price_unit) * line.discount / 100
+ print line.discount
+ disc += (line.quantity * line.price_unit) * line.discount / 100
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)
- self.amount_discount = round(disc)
- self.amount_total = round(self.amount_untaxed + self.amount_tax)
+ self.amount_discount = disc
+ self.amount_total = self.amount_untaxed + self.amount_tax
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,
+ 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'),
+ 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')
@@ -42,9 +54,9 @@ class AccountInvoice(models.Model):
line.discount = discount
disc_amnt += (line.quantity * line.price_unit) * discount / 100
total = val1 + val2 - disc_amnt
- self.amount_discount = round(disc_amnt)
- self.amount_tax = round(val2)
- self.amount_total = round(total)
+ self.amount_discount = disc_amnt
+ self.amount_tax = val2
+ self.amount_total = total
@api.onchange('discount_type', 'discount_rate')
def supply_rate(self):
@@ -59,7 +71,10 @@ class AccountInvoice(models.Model):
for line in inv.invoice_line:
total += (line.quantity * line.price_unit)
if inv.discount_rate != 0:
+ print "#########################################"
discount = (inv.discount_rate / total) * 100
+ print dp.get_precision('Discount'),
+ print discount
self.compute_discount(discount)
diff --git a/sale_discount_total/models/sale.py b/sale_discount_total/models/sale.py
index 8ede111dd..e68d28d39 100644
--- a/sale_discount_total/models/sale.py
+++ b/sale_discount_total/models/sale.py
@@ -22,10 +22,10 @@ class SaleOrder(osv.Model):
val1 += line.price_subtotal
val2 += self._amount_line_tax(cr, uid, line, context=context)
val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100
- res[order.id]['amount_untaxed'] = cur_obj.round(cr, uid, cur, val1)
- res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val2)
- res[order.id]['amount_discount'] = cur_obj.round(cr, uid, cur, val3)
- res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']
+ res[order.id]['amount_untaxed'] = round(cur_obj.round(cr, uid, cur, val1))
+ res[order.id]['amount_tax'] = round(cur_obj.round(cr, uid, cur, val2))
+ res[order.id]['amount_discount'] = round(cur_obj.round(cr, uid, cur, val3))
+ res[order.id]['amount_total'] = round(res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'])
return res
def _get_order(self, cr, uid, ids, context=None):
diff --git a/sale_discount_total/models/sale.py~ b/sale_discount_total/models/sale.py~
index e68d28d39..7ad50b7f9 100644
--- a/sale_discount_total/models/sale.py~
+++ b/sale_discount_total/models/sale.py~
@@ -16,16 +16,20 @@ class SaleOrder(osv.Model):
'amount_tax': 0.0,
'amount_total': 0.0,
}
+ val = val1 = val2 = 0.0
cur = order.pricelist_id.currency_id
- val1 = val2 = val3 = 0.0
for line in order.order_line:
val1 += line.price_subtotal
- val2 += self._amount_line_tax(cr, uid, line, context=context)
- val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100
- res[order.id]['amount_untaxed'] = round(cur_obj.round(cr, uid, cur, val1))
- res[order.id]['amount_tax'] = round(cur_obj.round(cr, uid, cur, val2))
- res[order.id]['amount_discount'] = round(cur_obj.round(cr, uid, cur, val3))
- res[order.id]['amount_total'] = round(res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'])
+ val += self._amount_line_tax(cr, uid, line, context=context)
+ if order.discount_type == 'amount':
+ val2 = order.discount_rate
+ elif order.discount_type == 'percent':
+ val2 = ((val1 + val) * order.discount_rate) / 100
+ 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_discount'] = cur_obj.round(cr, uid, cur, val2)
+ res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'] - \
+ res[order.id]['amount_discount']
return res
def _get_order(self, cr, uid, ids, context=None):
@@ -38,51 +42,45 @@ class SaleOrder(osv.Model):
'discount_type': fields.selection([
('percent', 'Percentage'),
('amount', 'Amount')], 'Discount type'),
- 'discount_rate': fields.float('Discount Rate', digits_compute=dp.get_precision('Account'),
+ 'discount_rate': fields.float('Discount Amount', digits_compute=dp.get_precision('Account'),
readonly=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ),
'amount_discount': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Discount',
- multi='sums', store=True, help="The total discount."),
+ multi='sums', help="The total discount."),
'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'),
string='Untaxed Amount',
- multi='sums', store=True, help="The amount without tax.", track_visibility='always'),
+ multi='sums', help="The amount without tax.", track_visibility='always'),
'amount_tax': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Taxes',
- multi='sums', store=True, help="The tax amount."),
+ multi='sums', help="The tax amount."),
'amount_total': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Total',
- multi='sums', store=True, help="The total amount."),
+ multi='sums', help="The total amount."),
}
_defaults = {
'discount_type': 'percent',
}
- @api.multi
- def compute_discount(self, discount):
+ @api.onchange('discount_type', 'discount_rate')
+ def compute_discount(self):
for order in self:
val1 = val2 = 0.0
- disc_amnt = 0.0
for line in order.order_line:
- val1 += (line.product_uom_qty * line.price_unit)
- line.discount = discount
+ val1 += line.price_subtotal
val2 += self._amount_line_tax(line)
- disc_amnt += (line.product_uom_qty * line.price_unit * line.discount)/100
- total = val1 + val2 - disc_amnt
- self.currency_id = order.pricelist_id.currency_id
- self.amount_discount = round(disc_amnt)
- self.amount_tax = round(val2)
- self.amount_total = round(total)
-
- @api.onchange('discount_type', 'discount_rate')
- def supply_rate(self):
- for order in self:
if order.discount_type == 'percent':
- self.compute_discount(order.discount_rate)
+ if order.discount_rate == 100:
+ disc_amnt = val1 + val2
+ else:
+ disc_amnt = (val1 + val2) * order.discount_rate / 100
+ total = val1 + val2 - disc_amnt
+ self.currency_id = order.pricelist_id.currency_id
+ self.amount_discount = disc_amnt
+ self.amount_total = total
else:
- total = 0.0
- for line in order.order_line:
- total += (line.product_uom_qty * line.price_unit)
- discount = (order.discount_rate / total) * 100
- self.compute_discount(discount)
+ total = (val1 + val2) - order.discount_rate
+ self.currency_id = order.pricelist_id.currency_id
+ self.amount_discount = order.discount_rate
+ self.amount_total = total
def _prepare_invoice(self, cr, uid, order, lines, context=None):
invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context)
diff --git a/sale_discount_total/views/account_invoice_view.xml b/sale_discount_total/views/account_invoice_view.xml
index 78aa956e5..4a4116452 100644
--- a/sale_discount_total/views/account_invoice_view.xml
+++ b/sale_discount_total/views/account_invoice_view.xml
@@ -1,11 +1,36 @@
+
+ discount.account.invoice.line.tree
+ account.invoice.line
+
+
+
+ (16, 2)
+
+
+
+
+
+ discount.account.invoice.line.form
+ account.invoice.line
+
+
+
+ (16, 2)
+
+
+
+
discount.account.invoice
account.invoice
+
+ (16, 2)
+
diff --git a/sale_discount_total/views/sale_view.xml b/sale_discount_total/views/sale_view.xml
index c74bb904c..119bee2ef 100644
--- a/sale_discount_total/views/sale_view.xml
+++ b/sale_discount_total/views/sale_view.xml
@@ -31,4 +31,4 @@
-
+
\ No newline at end of file
diff --git a/sale_discount_total/views/sale_view.xml~ b/sale_discount_total/views/sale_view.xml~
deleted file mode 100644
index 8dddae946..000000000
--- a/sale_discount_total/views/sale_view.xml~
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- discount.sale.order.form
- sale.order
-
-
-
-
-
-
-
-
-
-
-
-
- {'discount_type':discount_type,'discount_rate':discount_rate,'amount_discount':amount_discount}
-
-
-
-
-
\ No newline at end of file