Browse Source

Removed Rounding of amounts

pull/3/head
cybroodoo 10 years ago
parent
commit
371ec97078
  1. 31
      sale_discount_total/models/account_invoice.py
  2. 8
      sale_discount_total/models/sale.py
  3. 64
      sale_discount_total/models/sale.py~
  4. 25
      sale_discount_total/views/account_invoice_view.xml
  5. 34
      sale_discount_total/views/sale_view.xml~

31
sale_discount_total/models/account_invoice.py

@ -3,6 +3,14 @@ from openerp.osv import osv
import openerp.addons.decimal_precision as dp 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): class AccountInvoice(models.Model):
_inherit = "account.invoice" _inherit = "account.invoice"
@ -12,17 +20,21 @@ class AccountInvoice(models.Model):
disc = 0.0 disc = 0.0
for inv in self: for inv in self:
for line in inv.invoice_line: 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_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_tax = sum(line.amount for line in self.tax_line)
self.amount_discount = round(disc) self.amount_discount = disc
self.amount_total = round(self.amount_untaxed + self.amount_tax) self.amount_total = self.amount_untaxed + self.amount_tax
discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True, discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True,
states={'draft': [('readonly', False)]}) 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)]}) 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') readonly=True, compute='_compute_amount')
amount_untaxed = fields.Float(string='Subtotal', digits=dp.get_precision('Account'), amount_untaxed = fields.Float(string='Subtotal', digits=dp.get_precision('Account'),
readonly=True, compute='_compute_amount', track_visibility='always') readonly=True, compute='_compute_amount', track_visibility='always')
@ -42,9 +54,9 @@ class AccountInvoice(models.Model):
line.discount = discount line.discount = discount
disc_amnt += (line.quantity * line.price_unit) * discount / 100 disc_amnt += (line.quantity * line.price_unit) * discount / 100
total = val1 + val2 - disc_amnt total = val1 + val2 - disc_amnt
self.amount_discount = round(disc_amnt) self.amount_discount = disc_amnt
self.amount_tax = round(val2) self.amount_tax = val2
self.amount_total = round(total) self.amount_total = total
@api.onchange('discount_type', 'discount_rate') @api.onchange('discount_type', 'discount_rate')
def supply_rate(self): def supply_rate(self):
@ -59,7 +71,10 @@ class AccountInvoice(models.Model):
for line in inv.invoice_line: for line in inv.invoice_line:
total += (line.quantity * line.price_unit) total += (line.quantity * line.price_unit)
if inv.discount_rate != 0: if inv.discount_rate != 0:
print "#########################################"
discount = (inv.discount_rate / total) * 100 discount = (inv.discount_rate / total) * 100
print dp.get_precision('Discount'),
print discount
self.compute_discount(discount) self.compute_discount(discount)

8
sale_discount_total/models/sale.py

@ -22,10 +22,10 @@ class SaleOrder(osv.Model):
val1 += line.price_subtotal val1 += line.price_subtotal
val2 += self._amount_line_tax(cr, uid, line, context=context) val2 += self._amount_line_tax(cr, uid, line, context=context)
val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100 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_untaxed'] = round(cur_obj.round(cr, uid, cur, val1))
res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val2) res[order.id]['amount_tax'] = round(cur_obj.round(cr, uid, cur, val2))
res[order.id]['amount_discount'] = cur_obj.round(cr, uid, cur, val3) res[order.id]['amount_discount'] = round(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_total'] = round(res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'])
return res return res
def _get_order(self, cr, uid, ids, context=None): def _get_order(self, cr, uid, ids, context=None):

64
sale_discount_total/models/sale.py~

@ -16,16 +16,20 @@ class SaleOrder(osv.Model):
'amount_tax': 0.0, 'amount_tax': 0.0,
'amount_total': 0.0, 'amount_total': 0.0,
} }
val = val1 = val2 = 0.0
cur = order.pricelist_id.currency_id cur = order.pricelist_id.currency_id
val1 = val2 = val3 = 0.0
for line in order.order_line: for line in order.order_line:
val1 += line.price_subtotal val1 += line.price_subtotal
val2 += self._amount_line_tax(cr, uid, line, context=context) val += self._amount_line_tax(cr, uid, line, context=context)
val3 += (line.product_uom_qty * line.price_unit) * line.discount / 100 if order.discount_type == 'amount':
res[order.id]['amount_untaxed'] = round(cur_obj.round(cr, uid, cur, val1)) val2 = order.discount_rate
res[order.id]['amount_tax'] = round(cur_obj.round(cr, uid, cur, val2)) elif order.discount_type == 'percent':
res[order.id]['amount_discount'] = round(cur_obj.round(cr, uid, cur, val3)) val2 = ((val1 + val) * order.discount_rate) / 100
res[order.id]['amount_total'] = round(res[order.id]['amount_untaxed'] + res[order.id]['amount_tax']) 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 return res
def _get_order(self, cr, uid, ids, context=None): def _get_order(self, cr, uid, ids, context=None):
@ -38,51 +42,45 @@ class SaleOrder(osv.Model):
'discount_type': fields.selection([ 'discount_type': fields.selection([
('percent', 'Percentage'), ('percent', 'Percentage'),
('amount', 'Amount')], 'Discount type'), ('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, readonly=True,
states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ), states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ),
'amount_discount': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Discount', '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'), 'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'),
string='Untaxed Amount', 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', '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', '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 = { _defaults = {
'discount_type': 'percent', 'discount_type': 'percent',
} }
@api.multi @api.onchange('discount_type', 'discount_rate')
def compute_discount(self, discount): def compute_discount(self):
for order in self: for order in self:
val1 = val2 = 0.0 val1 = val2 = 0.0
disc_amnt = 0.0
for line in order.order_line: for line in order.order_line:
val1 += (line.product_uom_qty * line.price_unit) val1 += line.price_subtotal
line.discount = discount
val2 += self._amount_line_tax(line) 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_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: else:
total = 0.0 total = (val1 + val2) - order.discount_rate
for line in order.order_line: self.currency_id = order.pricelist_id.currency_id
total += (line.product_uom_qty * line.price_unit) self.amount_discount = order.discount_rate
discount = (order.discount_rate / total) * 100 self.amount_total = total
self.compute_discount(discount)
def _prepare_invoice(self, cr, uid, order, lines, context=None): def _prepare_invoice(self, cr, uid, order, lines, context=None):
invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context) invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context)

25
sale_discount_total/views/account_invoice_view.xml

@ -1,11 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<openerp> <openerp>
<data> <data>
<record id="discount_view_invoice_line_tree" model="ir.ui.view">
<field name="name">discount.account.invoice.line.tree</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
</field>
</record>
<record id="discount_view_invoice_line_form" model="ir.ui.view">
<field name="name">discount.account.invoice.line.form</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
</field>
</record>
<record id="discount_account_invoice_view_form1" model="ir.ui.view"> <record id="discount_account_invoice_view_form1" model="ir.ui.view">
<field name="name">discount.account.invoice</field> <field name="name">discount.account.invoice</field>
<field name="model">account.invoice</field> <field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/> <field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='discount']" position="attributes">
<attribute name="digits">(16, 2)</attribute>
</xpath>
<xpath expr="//group[@class='oe_subtotal_footer oe_right']" position="replace"> <xpath expr="//group[@class='oe_subtotal_footer oe_right']" position="replace">
<group col="4"> <group col="4">
<group name="discount"> <group name="discount">

34
sale_discount_total/views/sale_view.xml~

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="discount_sale_view_form" model="ir.ui.view">
<field name="name">discount.sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='sale_total']" position="replace">
<group col="4">
<group name="discount">
<field name="discount_type"/>
<field name="discount_rate"/>
</group>
<group class="oe_subtotal_footer oe_right" colspan="2" name="sale_total">
<field name="amount_untaxed" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_discount" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<field name="amount_tax" widget='monetary' options="{'currency_field': 'currency_id'}"/>
<div class="oe_subtotal_footer_separator oe_inline">
<label for="amount_total" />
<button name="button_dummy"
states="draft,sent" string="(update)" type="object" class="oe_edit_only oe_link"/>
</div>
<field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator" widget='monetary' options="{'currency_field': 'currency_id'}"/>
</group>
</group>
</xpath>
<xpath expr="//button[@string='Create Invoice']" position="attributes">
<attribute name="context">{'discount_type':discount_type,'discount_rate':discount_rate,'amount_discount':amount_discount}</attribute>
</xpath>
</field>
</record>
</data>
</openerp>
Loading…
Cancel
Save