Add price accuracy

bzr revid: ced-ec3d26af3d7a597f85f5de323872d03e804898e4
This commit is contained in:
ced 2006-12-28 09:44:56 +00:00
parent 58ee4af23c
commit e4449ce90f
4 changed files with 49 additions and 21 deletions

View File

@ -53,7 +53,7 @@
<record model="res.currency" id="CAD">
<field name="name">CAD</field>
<field name="rate">1.0</field>
<field name="rounding">2</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
</record>

View File

@ -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()

View File

@ -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)

View File

@ -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 = {