2016-09-09 3 views
1

Я работаю в odoo 8, мне нужно обновить движение запаса, которое сделано. то есть предположим, что движение было сделано, и состояние становится «сделано», но введенное количество было неправильным, поэтому для его исправления мне нужно уменьшить количество этого перемещения. Я пытаюсь обновить количество, но он дает мне ошибку, как:Обновление запаса перемещение записи, которая делается odoo

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

Я пытался, как показано ниже:

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

Я также попытался это:

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

Всегда я получаю та же ошибка.

Пожалуйста, помогите

Спасибо,

+0

Может быть, это может помочь вам https://www.odoo.com/forum/help-1/question/have- вы-find-an-app-module-to-cancel-done-stock-move-75807 – Zety

ответ

0

Самый простой способ, не вдаваясь в безопасности или вынимая сдерживает или ограничения Odoo поставить на место является использование SQL. Просто напишите необработанный sql, который выполнит вашу задачу и выполнит ее там, где вы пытались написать выше. Не уверен, что это лучший способ. Но в вашем аддоне вы можете наследовать share.move и полностью переопределить функцию. Или просто отредактируйте файл вручную и перезапустите сервер. Не уверен в других проблемах, которые могут возникнуть, но это должно позволить вам писать на поле.

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

Override функция записи в аддонов/акции/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) 
+0

Привет, phillipstack, лучше использовать ORM. Есть ли способ с ORM – user280960

+0

Я обновил функцию. Я не знаю причину ограничения, но это может заставить вас справиться с этим. –

+0

Привет, phillipstack, я не хочу переопределять функцию, мне нужно только это в одном месте. любой способ получить права администратора – user280960

Смежные вопросы