parent
58ee4af23c
commit
e4449ce90f
|
@ -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>
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Reference in New Issue