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