1
votes

I am working in odoo 8, i have to update the stock move which is done. i.e. suppose the move was done and state becomes "done" but the quantity entered was incorrect, so to correct it i need to reduce the quantity of that move. I am trying to update the quantity but it gives me error as :

_('Quantities, Units of Measure, Products and Locations cannot be modified on stock moves that have already been processed (except by the Administrator).'))

I was trying as below:

move.write({'product_uos_qty':correct_qty})

I also tried this:

move.sudo().write({'product_uos_qty':correct_qty})

Always i get the same error.

Please Help

Thanks,

1
Maybe this could help you odoo.com/forum/help-1/question/…Kenly

1 Answers

0
votes

The easiest way without getting into security or removing the constrains or restrictions Odoo put in place is to use sql. Just write the raw sql that accomplishes your task and execute it where you were trying to do your write above. Not sure if it is the best way. But in your addon you can inherit stock.move and completely override the function. Or just edit the file manually and restart your server. Not sure about the other problems it might cause but it should let your write to the field.

sql = ".....YOUR SQL HERE"
self.env.cr.execute(sql)
self.env.cr.commit()

Override the write function in addons/stock/stock.py

def write(self, cr, uid, ids, vals, context=None):
    if context is None:
        context = {}
    if isinstance(ids, (int, long)):
        ids = [ids]
    # Check that we do not modify a stock.move which is done
    frozen_fields = set(['product_qty', 'product_uom', 'product_uos_qty', 'product_uos', 'location_id', 'location_dest_id', 'product_id'])
    for move in self.browse(cr, uid, ids, context=context):
        if move.state == 'done':


            #if frozen_fields.intersection(vals):
            #    raise osv.except_osv(_('Operation Forbidden!'),
            #        _('Quantities, Units of Measure, Products and Locations cannot be modified on stock moves that have already been processed (except by the Administrator).'))


    propagated_changes_dict = {}
    #propagation of quantity change
    if vals.get('product_uom_qty'):
        propagated_changes_dict['product_uom_qty'] = vals['product_uom_qty']
    if vals.get('product_uom_id'):
        propagated_changes_dict['product_uom_id'] = vals['product_uom_id']
    #propagation of expected date:
    propagated_date_field = False
    if vals.get('date_expected'):
        #propagate any manual change of the expected date
        propagated_date_field = 'date_expected'
    elif (vals.get('state', '') == 'done' and vals.get('date')):
        #propagate also any delta observed when setting the move as done
        propagated_date_field = 'date'

    if not context.get('do_not_propagate', False) and (propagated_date_field or propagated_changes_dict):
        #any propagation is (maybe) needed
        for move in self.browse(cr, uid, ids, context=context):
            if move.move_dest_id and move.propagate:
                if 'date_expected' in propagated_changes_dict:
                    propagated_changes_dict.pop('date_expected')
                if propagated_date_field:
                    current_date = datetime.strptime(move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT)
                    new_date = datetime.strptime(vals.get(propagated_date_field), DEFAULT_SERVER_DATETIME_FORMAT)
                    delta = new_date - current_date
                    if abs(delta.days) >= move.company_id.propagation_minimum_delta:
                        old_move_date = datetime.strptime(move.move_dest_id.date_expected, DEFAULT_SERVER_DATETIME_FORMAT)
                        new_move_date = (old_move_date + relativedelta.relativedelta(days=delta.days or 0)).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
                        propagated_changes_dict['date_expected'] = new_move_date
                #For pushed moves as well as for pulled moves, propagate by recursive call of write().
                #Note that, for pulled moves we intentionally don't propagate on the procurement.
                if propagated_changes_dict:
                    self.write(cr, uid, [move.move_dest_id.id], propagated_changes_dict, context=context)
    return super(stock_move, self).write(cr, uid, ids, vals, context=context)