From e4449ce90f83efe199e0403439902c37ce426f7c Mon Sep 17 00:00:00 2001 From: ced <> Date: Thu, 28 Dec 2006 09:44:56 +0000 Subject: [PATCH] Add price accuracy bzr revid: ced-ec3d26af3d7a597f85f5de323872d03e804898e4 --- addons/l10n_ca-qc/account_pc_canada.xml | 2 +- addons/product/product.py | 16 +++++++------- addons/purchase/purchase.py | 24 +++++++++++++++------ addons/sale/sale.py | 28 ++++++++++++++++++------- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/addons/l10n_ca-qc/account_pc_canada.xml b/addons/l10n_ca-qc/account_pc_canada.xml index 863ef13cc22..6540814f732 100644 --- a/addons/l10n_ca-qc/account_pc_canada.xml +++ b/addons/l10n_ca-qc/account_pc_canada.xml @@ -53,7 +53,7 @@ CAD 1.0 - 2 + 0.01 4 diff --git a/addons/product/product.py b/addons/product/product.py index b0024becfca..11b6f81a750 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -33,6 +33,8 @@ import pooler import math from _common import rounding +from tools import config + def is_pair(x): return not x%2 @@ -177,8 +179,8 @@ class product_template(osv.osv): 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procure Method', required=True), 'rental': fields.boolean('Rentable product'), 'categ_id': fields.many2one('product.category','Category', required=True, change_default=True), - 'list_price': fields.float('List Price'), - 'standard_price': fields.float('Cost Price', required=True, digit=(12,6)), + 'list_price': fields.float('List Price', digits=(16, int(config['price_accuracy']))), + 'standard_price': fields.float('Cost Price', required=True, digits=(16, int(config['price_accuracy']))), 'volume': fields.float('Volume'), 'weight': fields.float('Weight'), 'cost_method': fields.selection([('standard','Standard Price'), ('average','Average Price')], 'Costing Method', required=True), @@ -299,8 +301,8 @@ class product_product(osv.osv): 'virtual_available': fields.function(_product_virtual_available, method=True, type='float', string='Virtual Stock'), 'incoming_qty': fields.function(_product_incoming_qty, method=True, type='float', string='Incoming'), 'outgoing_qty': fields.function(_product_outgoing_qty, method=True, type='float', string='Outgoing'), - 'price': fields.function(_product_price, method=True, type='float', string='Customer Price'), - 'lst_price' : fields.function(_product_lst_price, method=True, type='float', string='List price'), + 'price': fields.function(_product_price, method=True, type='float', string='Customer Price', digits=(16, int(config['price_accuracy']))), + 'lst_price' : fields.function(_product_lst_price, method=True, type='float', string='List price', digits=(16, int(config['price_accuracy']))), 'code': fields.function(_product_code, method=True, type='char', string='Code'), 'partner_ref' : fields.function(_product_partner_ref, method=True, type='char', string='Customer ref'), 'default_code' : fields.char('Code', size=64), @@ -309,8 +311,8 @@ class product_product(osv.osv): 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True), 'ean13': fields.char('EAN13', size=13), 'packaging' : fields.one2many('product.packaging', 'product_id', 'Palettization', help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."), - 'price_extra': fields.float('Price Extra'), - 'price_margin': fields.float('Price Margin'), + 'price_extra': fields.float('Price Extra', digits=(16, int(config['price_accuracy']))), + 'price_margin': fields.float('Price Margin', digits=(16, int(config['price_accuracy']))), } def _check_ean_key(self, cr, uid, ids): @@ -449,7 +451,7 @@ class pricelist_partnerinfo(osv.osv): 'name': fields.char('Description', size=64), 'suppinfo_id': fields.many2one('product.supplierinfo', 'Partner Information', required=True, ondelete='cascade'), 'min_quantity': fields.float('Minimal quantity', required=True), - 'price': fields.float('price', required=True), + 'price': fields.float('price', required=True, digits=(16, int(config['price_accuracy']))), } _order = 'min_quantity asc' pricelist_partnerinfo() diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 5cd59d9c87d..d50842d47a7 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -33,6 +33,7 @@ import netsvc import ir from mx import DateTime import pooler +from tools import config # # Model definition @@ -48,27 +49,37 @@ class purchase_order(osv.osv): def _amount_untaxed(self, cr, uid, ids, field_name, arg, context): id_set = ",".join(map(str, ids)) - cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_qty),0)::decimal(16,2) AS amount FROM purchase_order s LEFT OUTER JOIN purchase_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") + cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_qty),0) AS amount FROM purchase_order s LEFT OUTER JOIN purchase_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") res = dict(cr.fetchall()) + cur_obj=self.pool.get('res.currency') + for id in res.keys(): + order=self.browse(cr, uid, [id])[0] + cur=order.pricelist_id.currency_id + res[id]=cur_obj.round(cr, uid, cur, res[id]) return res def _amount_tax(self, cr, uid, ids, field_name, arg, context): res = {} + cur_obj=self.pool.get('res.currency') for order in self.browse(cr, uid, ids): val = 0.0 + cur=order.pricelist_id.currency_id for line in order.order_line: for tax in line.taxes_id: for c in self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit, line.product_qty, order.partner_address_id.id): - val+=c['amount'] - res[order.id]=round(val,2) + val+= cur_obj.round(cr, uid, cur, c['amount']) + res[order.id]=cur_obj.round(cr, uid, cur, val) return res def _amount_total(self, cr, uid, ids, field_name, arg, context): res = {} untax = self._amount_untaxed(cr, uid, ids, field_name, arg, context) tax = self._amount_tax(cr, uid, ids, field_name, arg, context) + cur_obj=self.pool.get('res.currency') for id in ids: - res[id] = untax.get(id, 0.0) + tax.get(id, 0.0) + order=self.browse(cr, uid, [id])[0] + cur=order.pricelist_id.currency_id + res[id] = cur_obj.round(cr, uid, cur, untax.get(id, 0.0) + tax.get(id, 0.0)) return res _columns = { @@ -277,7 +288,8 @@ class purchase_order_line(osv.osv): def _amount_line(self, cr, uid, ids, prop, unknow_none,unknow_dict): res = {} for line in self.browse(cr, uid, ids): - res[line.id] = line.price_unit * line.product_qty + cur = line.order_id.pricelist_id.currency_id + res[line.id] = float(currency(line.price_unit * line.product_qty, cur.accuracy, cur.rounding)) return res _columns = { @@ -289,7 +301,7 @@ class purchase_order_line(osv.osv): 'product_id': fields.many2one('product.product', 'Product', domain=[('purchase_ok','=',True)], change_default=True, relate=True), 'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'), 'move_dest_id': fields.many2one('stock.move', 'Reservation Destination', ondelete='set null'), - 'price_unit': fields.float('Unit Price', required=True), + 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))), 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal'), 'notes': fields.text('Notes'), 'order_id': fields.many2one('purchase.order', 'Order Ref', select=True) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index d5ca8e3ef0d..84f7e221c94 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -32,6 +32,7 @@ import netsvc from osv import fields, osv import ir from mx import DateTime +from tools import config class sale_shop(osv.osv): _name = "sale.shop" @@ -68,27 +69,37 @@ class sale_order(osv.osv): def _amount_untaxed(self, cr, uid, ids, field_name, arg, context): id_set = ",".join(map(str, ids)) - cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_uos_qty*(100-l.discount))/100.0,0)::decimal(16,2) AS amount FROM sale_order s LEFT OUTER JOIN sale_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") + cr.execute("SELECT s.id,COALESCE(SUM(l.price_unit*l.product_uos_qty*(100-l.discount))/100.0,0) AS amount FROM sale_order s LEFT OUTER JOIN sale_order_line l ON (s.id=l.order_id) WHERE s.id IN ("+id_set+") GROUP BY s.id ") res = dict(cr.fetchall()) + cur_obj=self.pool.get('res.currency') + for id in res.keys(): + order=self.browse(cr, uid, [id])[0] + cur=order.pricelist_id.currency_id + res[id]=cur_obj.round(cr, uid, cur, res[id]) return res def _amount_tax(self, cr, uid, ids, field_name, arg, context): res = {} + cur_obj=self.pool.get('res.currency') for order in self.browse(cr, uid, ids): val = 0.0 + cur=order.pricelist_id.currency_id for line in order.order_line: for tax in line.tax_id: for c in self.pool.get('account.tax').compute(cr, uid, [tax.id], line.price_unit * (1-(line.discount or 0.0)/100.0), line.product_uom_qty, order.partner_invoice_id.id): - val += round(c['amount'], 2) - res[order.id]=round(val,2) + val+= cur_obj.round(cr, uid, cur, c['amount']) + res[order.id]=cur_obj.round(cr, uid, cur, val) return res def _amount_total(self, cr, uid, ids, field_name, arg, context): res = {} untax = self._amount_untaxed(cr, uid, ids, field_name, arg, context) tax = self._amount_tax(cr, uid, ids, field_name, arg, context) + cur_obj=self.pool.get('res.currency') for id in ids: - res[id] = untax.get(id, 0.0) + tax.get(id, 0.0) + order=self.browse(cr, uid, [id])[0] + cur=order.pricelist_id.currency_id + res[id] = cur_obj.round(cr, uid, cur, untax.get(id, 0.0) + tax.get(id, 0.0)) return res _columns = { @@ -465,11 +476,14 @@ class sale_order_line(osv.osv): def _amount_line(self, cr, uid, ids, field_name, arg, context): res = {} + cur_obj=self.pool.get('res.currency') for line in self.browse(cr, uid, ids): if line.product_uos.id: res[line.id] = line.price_unit * line.product_uos_qty * (1 - (line.discount or 0.0) /100.0) else: res[line.id] = line.price_unit * line.product_uom_qty * (1 - (line.discount or 0.0) / 100.0) + cur = line.order_id.pricelist_id.currency_id + res[line.id] = cur_obj.round(cr, uid, cur, res[line.id]) return res def _number_packages(self, cr, uid, ids, field_name, arg, context): @@ -496,8 +510,8 @@ class sale_order_line(osv.osv): 'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id','invoice_id', 'Invoice Lines', readonly=True), 'invoiced': fields.boolean('Paid', readonly=True, select=True), 'procurement_id': fields.many2one('mrp.procurement', 'Procurement'), - 'price_unit': fields.float('Unit Price', required=True), - 'price_net': fields.function(_amount_line_net, method=True, string='Net Price'), + 'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))), + 'price_net': fields.function(_amount_line_net, method=True, string='Net Price', digits=(16, int(config['price_accuracy']))), 'price_subtotal': fields.function(_amount_line, method=True, string='Subtotal'), 'tax_id': fields.many2many('account.tax', 'sale_order_tax', 'order_line_id', 'tax_id', 'Taxes'), 'type': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')],'Procure Method', required=True), @@ -515,7 +529,7 @@ class sale_order_line(osv.osv): 'notes': fields.text('Notes'), 'th_weight' : fields.float('Weight'), 'state': fields.selection([('draft','Draft'),('confirmed','Confirmed'),('done','Done'),('cancel','Canceled')], 'State', required=True, readonly=True), - 'price_unit_customer': fields.float('Customer Unit Price'), + 'price_unit_customer': fields.float('Customer Unit Price', digits=(16, int(config['price_accuracy']))), } _order = 'sequence' _defaults = {