[IMP] Add a method half-up for uom conversion in case we want to convert from default UoM to something else + remaining_qty round + default factor on UoM
This commit is contained in:
parent
49c8fc21ba
commit
c255fe3384
|
@ -156,13 +156,14 @@ class product_uom(osv.osv):
|
||||||
'rounding': 0.01,
|
'rounding': 0.01,
|
||||||
'factor': 1,
|
'factor': 1,
|
||||||
'uom_type': 'reference',
|
'uom_type': 'reference',
|
||||||
|
'factor': 1.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
_sql_constraints = [
|
_sql_constraints = [
|
||||||
('factor_gt_zero', 'CHECK (factor!=0)', 'The conversion ratio for a unit of measure cannot be 0!')
|
('factor_gt_zero', 'CHECK (factor!=0)', 'The conversion ratio for a unit of measure cannot be 0!')
|
||||||
]
|
]
|
||||||
|
|
||||||
def _compute_qty(self, cr, uid, from_uom_id, qty, to_uom_id=False, round=True):
|
def _compute_qty(self, cr, uid, from_uom_id, qty, to_uom_id=False, round=True, rounding_method='UP'):
|
||||||
if not from_uom_id or not qty or not to_uom_id:
|
if not from_uom_id or not qty or not to_uom_id:
|
||||||
return qty
|
return qty
|
||||||
uoms = self.browse(cr, uid, [from_uom_id, to_uom_id])
|
uoms = self.browse(cr, uid, [from_uom_id, to_uom_id])
|
||||||
|
@ -170,9 +171,9 @@ class product_uom(osv.osv):
|
||||||
from_unit, to_unit = uoms[0], uoms[-1]
|
from_unit, to_unit = uoms[0], uoms[-1]
|
||||||
else:
|
else:
|
||||||
from_unit, to_unit = uoms[-1], uoms[0]
|
from_unit, to_unit = uoms[-1], uoms[0]
|
||||||
return self._compute_qty_obj(cr, uid, from_unit, qty, to_unit, round=round)
|
return self._compute_qty_obj(cr, uid, from_unit, qty, to_unit, round=round, rounding_method=rounding_method)
|
||||||
|
|
||||||
def _compute_qty_obj(self, cr, uid, from_unit, qty, to_unit, round=True, context=None):
|
def _compute_qty_obj(self, cr, uid, from_unit, qty, to_unit, round=True, rounding_method='UP', context=None):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
if from_unit.category_id.id != to_unit.category_id.id:
|
if from_unit.category_id.id != to_unit.category_id.id:
|
||||||
|
@ -184,7 +185,7 @@ class product_uom(osv.osv):
|
||||||
if to_unit:
|
if to_unit:
|
||||||
amount = amount * to_unit.factor
|
amount = amount * to_unit.factor
|
||||||
if round:
|
if round:
|
||||||
amount = ceiling(amount, to_unit.rounding)
|
amount = float_round(amount, precision_rounding=to_unit.rounding, rounding_method=rounding_method)
|
||||||
return amount
|
return amount
|
||||||
|
|
||||||
def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False):
|
def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False):
|
||||||
|
|
|
@ -1242,7 +1242,7 @@ class stock_picking(osv.osv):
|
||||||
need_rereserve = True
|
need_rereserve = True
|
||||||
elif ops.product_id.id:
|
elif ops.product_id.id:
|
||||||
#Check moves with same product
|
#Check moves with same product
|
||||||
qty_to_assign = uom_obj._compute_qty_obj(cr, uid, ops.product_uom_id, ops.product_qty, ops.product_id.uom_id, round=False, context=context)
|
qty_to_assign = uom_obj._compute_qty_obj(cr, uid, ops.product_uom_id, ops.product_qty, ops.product_id.uom_id, context=context)
|
||||||
for move_dict in prod2move_ids.get(ops.product_id.id, []):
|
for move_dict in prod2move_ids.get(ops.product_id.id, []):
|
||||||
move = move_dict['move']
|
move = move_dict['move']
|
||||||
for quant in move.reserved_quant_ids:
|
for quant in move.reserved_quant_ids:
|
||||||
|
@ -1298,7 +1298,8 @@ class stock_picking(osv.osv):
|
||||||
if op.product_id and op.product_uom_id and op.product_uom_id.id != product.uom_id.id:
|
if op.product_id and op.product_uom_id and op.product_uom_id.id != product.uom_id.id:
|
||||||
if op.product_uom_id.factor > product.uom_id.factor: #If the pack operation's is a smaller unit
|
if op.product_uom_id.factor > product.uom_id.factor: #If the pack operation's is a smaller unit
|
||||||
uom_id = op.product_uom_id.id
|
uom_id = op.product_uom_id.id
|
||||||
qty = uom_obj._compute_qty_obj(cr, uid, product.uom_id, remaining_qty, op.product_uom_id)
|
#HALF-UP rounding as only rounding errors will be because of propagation of error from default UoM
|
||||||
|
qty = uom_obj._compute_qty_obj(cr, uid, product.uom_id, remaining_qty, op.product_uom_id, rounding_method='HALF-UP')
|
||||||
picking = op.picking_id
|
picking = op.picking_id
|
||||||
res = {
|
res = {
|
||||||
'picking_id': picking.id,
|
'picking_id': picking.id,
|
||||||
|
@ -1601,7 +1602,7 @@ class stock_move(osv.osv):
|
||||||
for record in move.linked_move_operation_ids:
|
for record in move.linked_move_operation_ids:
|
||||||
qty -= record.qty
|
qty -= record.qty
|
||||||
# Keeping in product default UoM
|
# Keeping in product default UoM
|
||||||
res[move.id] = qty
|
res[move.id] = float_round(qty, precision_rounding=move.product_id.uom_id.rounding)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _get_lot_ids(self, cr, uid, ids, field_name, args, context=None):
|
def _get_lot_ids(self, cr, uid, ids, field_name, args, context=None):
|
||||||
|
@ -2461,7 +2462,8 @@ class stock_move(osv.osv):
|
||||||
uom_obj = self.pool.get('product.uom')
|
uom_obj = self.pool.get('product.uom')
|
||||||
context = context or {}
|
context = context or {}
|
||||||
|
|
||||||
uom_qty = uom_obj._compute_qty_obj(cr, uid, move.product_id.uom_id, qty, move.product_uom)
|
#HALF-UP rounding as only rounding errors will be because of propagation of error from default UoM
|
||||||
|
uom_qty = uom_obj._compute_qty_obj(cr, uid, move.product_id.uom_id, qty, move.product_uom, rounding_method='HALF-UP', context=context)
|
||||||
uos_qty = uom_qty * move.product_uos_qty / move.product_uom_qty
|
uos_qty = uom_qty * move.product_uos_qty / move.product_uom_qty
|
||||||
|
|
||||||
defaults = {
|
defaults = {
|
||||||
|
@ -3838,7 +3840,7 @@ class stock_pack_operation(osv.osv):
|
||||||
qty = uom_obj._compute_qty_obj(cr, uid, ops.product_uom_id, ops.product_qty, ops.product_id.uom_id, context=context)
|
qty = uom_obj._compute_qty_obj(cr, uid, ops.product_uom_id, ops.product_qty, ops.product_id.uom_id, context=context)
|
||||||
for record in ops.linked_move_operation_ids:
|
for record in ops.linked_move_operation_ids:
|
||||||
qty -= record.qty
|
qty -= record.qty
|
||||||
res[ops.id] = qty
|
res[ops.id] = float_round(qty, precision_rounding=ops.product_id.uom_id.rounding)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def product_id_change(self, cr, uid, ids, product_id, product_uom_id, product_qty, context=None):
|
def product_id_change(self, cr, uid, ids, product_id, product_uom_id, product_qty, context=None):
|
||||||
|
|
Loading…
Reference in New Issue