diff --git a/sale_discount_total/models/sale.py b/sale_discount_total/models/sale.py index e68d28d39..8ede111dd 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'] = 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']) + 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'] 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 7ad50b7f9..e68d28d39 100644 --- a/sale_discount_total/models/sale.py~ +++ b/sale_discount_total/models/sale.py~ @@ -16,20 +16,16 @@ 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'] + 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']) return res def _get_order(self, cr, uid, ids, context=None): @@ -42,45 +38,51 @@ 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', - multi='sums', help="The total discount."), + multi='sums', store=True, help="The total discount."), 'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Untaxed Amount', - multi='sums', help="The amount without tax.", track_visibility='always'), + multi='sums', store=True, help="The amount without tax.", track_visibility='always'), 'amount_tax': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Taxes', - multi='sums', help="The tax amount."), + multi='sums', store=True, help="The tax amount."), 'amount_total': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Total', - multi='sums', help="The total amount."), + multi='sums', store=True, help="The total amount."), } _defaults = { '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)