diff --git a/sale_discount_total/models/sale.py b/sale_discount_total/models/sale.py index 03e68c67f..61870b364 100644 --- a/sale_discount_total/models/sale.py +++ b/sale_discount_total/models/sale.py @@ -29,6 +29,7 @@ class SaleOrder(osv.Model): 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(cur_obj.round(cr, uid, cur, total)) + return res def _get_order(self, cr, uid, ids, context=None): result = {} diff --git a/sale_discount_total/models/sale.py~ b/sale_discount_total/models/sale.py~ index 7ad50b7f9..03e68c67f 100644 --- a/sale_discount_total/models/sale.py~ +++ b/sale_discount_total/models/sale.py~ @@ -6,9 +6,11 @@ import openerp.addons.decimal_precision as dp class SaleOrder(osv.Model): _inherit = 'sale.order' + def _amount_all(self, cr, uid, ids, field_name, arg, context=None): cur_obj = self.pool.get('res.currency') res = {} + print "_amount_all" for order in self.browse(cr, uid, ids, context=context): res[order.id] = { 'amount_untaxed': 0.0, @@ -16,21 +18,17 @@ 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 - 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 + val2 += self._amount_line_tax(cr, uid, line, context=context) + val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100 + total = val1 + val2 + 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(cur_obj.round(cr, uid, cur, total)) def _get_order(self, cr, uid, ids, context=None): result = {} @@ -42,7 +40,7 @@ class SaleOrder(osv.Model): 'discount_type': fields.selection([ ('percent', 'Percentage'), ('amount', 'Amount')], 'Discount type'), - 'discount_rate': fields.float('Discount Amount', digits_compute=dp.get_precision('Account'), + 'discount_rate': fields.float('Discount Rate', 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', @@ -60,27 +58,33 @@ class SaleOrder(osv.Model): 'discount_type': 'percent', } - @api.onchange('discount_type', 'discount_rate') - def compute_discount(self): + @api.multi + def compute_discount(self, discount): for order in self: val1 = val2 = 0.0 + disc_amnt = 0.0 for line in order.order_line: - val1 += line.price_subtotal + val1 += (line.product_uom_qty * line.price_unit) + line.discount = discount 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': - 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 + self.compute_discount(order.discount_rate) else: - total = (val1 + val2) - order.discount_rate - self.currency_id = order.pricelist_id.currency_id - self.amount_discount = order.discount_rate - self.amount_total = total + 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) def _prepare_invoice(self, cr, uid, order, lines, context=None): invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context)