[IMP] Fixed the rounding precision issue using tools.float_compare() method
authorHardik Ansodariy (OpenERP) <han@tinyerp.com>
Tue, 27 Dec 2011 09:33:15 +0000 (15:03 +0530)
committerHardik Ansodariy (OpenERP) <han@tinyerp.com>
Tue, 27 Dec 2011 09:33:15 +0000 (15:03 +0530)
lp bug: https://launchpad.net/bugs/881356 fixed

bzr revid: han@tinyerp.com-20111227093315-g354u7tgf4rzivwz

addons/sale/sale.py
addons/stock/stock.py

index c359c2f..6776d53 100644 (file)
@@ -25,7 +25,7 @@ import time
 import pooler
 from osv import fields, osv
 from tools.translate import _
-from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
+from tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT, float_compare
 import decimal_precision as dp
 import netsvc
 
@@ -1233,7 +1233,8 @@ class sale_order_line(osv.osv):
 
         if not uom2:
             uom2 = product_obj.uom_id
-        if (product_obj.type=='product') and (product_obj.virtual_available * uom2.factor < qty * product_obj.uom_id.factor) \
+        comapre_qty = float_compare(product_obj.virtual_available * uom2.factor,qty * product_obj.uom_id.factor, precision_rounding=product_obj.uom_id.rounding)
+        if (product_obj.type=='product') and int(comapre_qty) == -1 \
           and (product_obj.procure_method=='make_to_stock'):
             warn_msg = _('You plan to sell %.2f %s but you only have %.2f %s available !\nThe real stock is %.2f %s. (without reservations)') % \
                     (qty, uom2 and uom2.name or product_obj.uom_id.name,
index a1a0cbc..a65bf45 100644 (file)
@@ -28,6 +28,7 @@ from osv import fields, osv
 from tools.translate import _
 import netsvc
 import tools
+from tools import float_compare
 import decimal_precision as dp
 import logging
 
@@ -459,7 +460,8 @@ class stock_location(osv.osv):
                 continue
 
             amount = results2
-            if amount > 0:
+            compare_qty = float_compare(amount, product_qty, precision_rounding=context.get('rounding'))
+            if compare_qty <> -1:
                 if amount > min(total, product_qty):
                     amount = min(product_qty, total)
                 result.append((amount, id))
@@ -2005,7 +2007,7 @@ class stock_move(osv.osv):
                 continue
             if move.state in ('confirmed', 'waiting'):
                 # Important: we must pass lock=True to _product_reserve() to avoid race conditions and double reservations
-                res = self.pool.get('stock.location')._product_reserve(cr, uid, [move.location_id.id], move.product_id.id, move.product_qty, {'uom': move.product_uom.id}, lock=True)
+                res = self.pool.get('stock.location')._product_reserve(cr, uid, [move.location_id.id], move.product_id.id, move.product_qty, {'uom': move.product_uom.id, 'rounding': move.product_uom.rounding}, lock=True)
                 if res:
                     #_product_available_test depends on the next status for correct functioning
                     #the test does not work correctly if the same product occurs multiple times