diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index 8671f27f193..937d50014a2 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -22,8 +22,8 @@ import time from osv import fields, osv from tools.misc import DEFAULT_SERVER_DATETIME_FORMAT -from tools.translate import _ import decimal_precision as dp +from tools.translate import _ class stock_partial_picking_line(osv.TransientModel): @@ -52,16 +52,24 @@ class stock_partial_picking_line(osv.TransientModel): 'update_cost': fields.boolean('Need cost update'), 'cost' : fields.float("Cost", help="Unit Cost for this product line"), 'currency' : fields.many2one('res.currency', string="Currency", help="Currency in which Unit cost is expressed", ondelete='CASCADE'), - 'tracking': fields.function(_tracking, method=True, string='Tracking', type='boolean'), + 'tracking': fields.function(_tracking, string='Tracking', type='boolean'), } class stock_partial_picking(osv.osv_memory): _name = "stock.partial.picking" _description = "Partial Picking Processing Wizard" + + def _hide_tracking(self, cursor, user, ids, name, arg, context=None): + res = {} + for wizard in self.browse(cursor, user, ids, context=context): + res[wizard.id] = any([not(x.tracking) for x in wizard.move_ids]) + return res + _columns = { 'date': fields.datetime('Date', required=True), 'move_ids' : fields.one2many('stock.partial.picking.line', 'wizard_id', 'Product Moves'), 'picking_id': fields.many2one('stock.picking', 'Picking', required=True, ondelete='CASCADE'), + 'hide_tracking': fields.function(_hide_tracking, string='Tracking', type='boolean', help='This field is for internal purpose. It is used to decide if the column prodlot has to be shown on the move_ids field or not'), } def default_get(self, cr, uid, fields, context=None): @@ -86,7 +94,7 @@ class stock_partial_picking(osv.osv_memory): def _product_cost_for_average_update(self, cr, uid, move): """Returns product cost and currency ID for the given move, suited for re-computing the average product cost. - + :return: map of the form:: {'cost': 123.34, @@ -124,48 +132,51 @@ class stock_partial_picking(osv.osv_memory): 'delivery_date' : partial.date } picking_type = partial.picking_id.type - for move in partial.move_ids: - move_uom = move.move_id.product_uom - process_uom = move.product_uom - move_id = move.move_id.id + for wizard_line in partial.move_ids: + initial_uom = wizard_line.move_id.product_uom + line_uom = wizard_line.product_uom + move_id = wizard_line.move_id.id #Quantiny must be Positive - if move.quantity < 0: + if wizard_line.quantity < 0: raise osv.except_osv(_('Warning!'), _('Please provide Proper Quantity !')) - #Compute the wizard Quantity for respective move. - toprocess = uom_obj._compute_qty(cr, uid, process_uom.id, move.quantity, move_uom.id) + #Compute the quantity for respective wizard_line in the line uom and in the initial uom + qty_in_initial_uom = uom_obj._compute_qty(cr, uid, line_uom.id, wizard_line.quantity, initial_uom.id) + qty_in_line_uom = uom_obj._compute_qty(cr, uid, line_uom.id, wizard_line.quantity, line_uom.id) #this just do the rounding if necessary #Check rounding Quantity.ex. #picking: 1kg, uom kg rounding = 0.01 (rounding to 10g), #partial delivery: 253g #=> result= refused, as the qty left on picking would be 0.747kg and only 0.75 is accepted by the uom. - if process_uom.factor and process_uom.factor <> 0 and move_uom.factor: - without_rounding_qty = (move.quantity / process_uom.factor) * move_uom.factor - if toprocess <> without_rounding_qty: - raise osv.except_osv(_('Warning'), _('Quantity left on picking would be "%s %s" but "%s %s" is accepted by the uom.') % (without_rounding_qty, process_uom.name, toprocess, process_uom.name)) + if line_uom.factor and line_uom.factor <> 0 and initial_uom.factor: + if qty_in_line_uom <> wizard_line.quantity: + raise osv.except_osv(_('Warning'), _('The uom rounding does not allow you to ship "%s %s", only roundings of "%s %s" is accepted by the uom.') % (wizard_line.quantity, line_uom.name, line_uom.rounding, line_uom.name)) + without_rounding_qty = (wizard_line.quantity / line_uom.factor) * initial_uom.factor + if qty_in_initial_uom <> without_rounding_qty: + raise osv.except_osv(_('Warning'), _('The rounding of the initial uom does not allow you to ship "%s %s", as it would let a quantity of "%s %s" to ship and only roundings of "%s %s" is accepted by the uom.') % (wizard_line.quantity, line_uom.name, wizard_line.move_id.product_qty - without_rounding_qty, initial_uom.name, initial_uom.rounding, initial_uom.name)) if not move_id: seq_obj_name = 'stock.picking.' + picking_type move_id = stock_move.create(cr,uid,{'name' : self.pool.get('ir.sequence').get(cr, uid, seq_obj_name), - 'product_id': move.product_id.id, - 'product_qty': move.quantity, - 'product_uom': move.product_uom.id, - 'prodlot_id': move.prodlot_id.id, - 'location_id' : move.location_id.id, - 'location_dest_id' : move.location_dest_id.id, + 'product_id': wizard_line.product_id.id, + 'product_qty': wizard_line.quantity, + 'product_uom': wizard_line.product_uom.id, + 'prodlot_id': wizard_line.prodlot_id.id, + 'location_id' : wizard_line.location_id.id, + 'location_dest_id' : wizard_line.location_dest_id.id, 'picking_id': partial.picking_id.id },context=context) stock_move.action_confirm(cr, uid, [move_id], context) partial_data['move%s' % (move_id)] = { - 'product_id': move.product_id.id, - 'product_qty': move.quantity, - 'product_uom': move.product_uom.id, - 'prodlot_id': move.prodlot_id.id, + 'product_id': wizard_line.product_id.id, + 'product_qty': wizard_line.quantity, + 'product_uom': wizard_line.product_uom.id, + 'prodlot_id': wizard_line.prodlot_id.id, } - if (picking_type == 'in') and (move.product_id.cost_method == 'average'): - partial_data['move%s' % (move.move_id.id)].update(product_price=move.cost, - product_currency=move.currency.id) + if (picking_type == 'in') and (wizard_line.product_id.cost_method == 'average'): + partial_data['move%s' % (wizard_line.move_id.id)].update(product_price=wizard_line.cost, + product_currency=wizard_line.currency.id) stock_picking.do_partial(cr, uid, [partial.picking_id.id], partial_data, context=context) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/stock/wizard/stock_partial_picking_view.xml b/addons/stock/wizard/stock_partial_picking_view.xml index 4194d7129c5..5e6ac6ead8b 100644 --- a/addons/stock/wizard/stock_partial_picking_view.xml +++ b/addons/stock/wizard/stock_partial_picking_view.xml @@ -15,8 +15,20 @@ form
+ - + + + + + + + + + + + +