2017-01-18 2 views
0

Я хочу изменить поле «invoice_status» из класса «SaleOrder», связанного с фактурой после подтверждения этого счета.Как изменить поле выбора из другого класса в odoo 9?

Проверка счета-фактуры определяется в классе «AccountInvoice», внутри счета модуля:

@api.multi 
def invoice_validate(self): 
    ... 

я понял, что поле «имя» из класса «SaleOrder» связан с «происхождения» поле из класса AccountInvoice.

Итак, я изменил функцию invoice_validate так:

@api.multi 
def invoice_validate(self): 
    for invoice in self: 
     ... 
     origin = self.origin 
     sale_order_id = self.env['sale.order'].search([('name', '=', origin)])[0].id 
     sale_order_obj = self.env['sale.order'].browse(sale_order_id) 
     sale_order_obj.write({'invoice_status': 'invoiced'}) 
    return self.write({'state': 'open'}) 

По какой-то причине парте записи не работает.

Это официальное определение поля "invoice_status" из класса SaleOrder:

invoice_status = fields.Selection([ 
    ('upselling', 'Upselling Opportunity'), 
    ('invoiced', 'Fully Invoiced'), 
    ('to invoice', 'To Invoice'), 
    ('no', 'Nothing to Invoice') 
    ], string='Invoice Status', compute='_get_invoiced', store=True, readonly=True, default='no') 

ответ

1

Вы не можете установить значение invoice_status, потому что это поле вычисления. Даже если вы установите его значение, оно будет повторно пересчитано, когда поле, от которого оно зависит, изменится и в конечном итоге найдет значение, которое оно должно иметь, - и напишите это значение вместо вашего.

Odoo сделал так, чтобы он работал (он будет выставлять счет, когда заказ выставляется фактурировать). Поэтому я не думаю, что вам нужно это делать. Если вам плохо нужно сохранить ваше значение, вы должны изменить это поле, чтобы оно больше не вычислялось, или создать другое поле.

+0

Да, я знаю, что поле будет повторно пересчитано, если изменится его поле, но когда я проверяю счет-фактуру, я никогда не изменю этот заказ на продажу или счет-фактуру, и я хочу, чтобы поле invoice_status имело это значение. Ваш ответ проясняет мне многое. Спасибо – MouTio

+1

Нажатие на кнопку вызывает запись в записи. Предположим, что поле в 'sale.order' зависит от invoice_id (ссылка). Он будет вызывать вычисление этого поля каждый раз, когда вы вызываете запись на ссылочном счете. Итак, в этой последней строке ('return self.write ({'state'; 'open'})'): после записи записи происходит вычисление, и ваше значение изменилось на значение, которое вы не хотите. – Majikat

0

Проверьте атрибут класса Selection selection_add.

Если вы хотите добавить некоторые элементы в поле выбора, вы должны переопределить его в другой класс, который наследует от одной и той же модели и объявить его как это:

invoice_status = fields.Selection(selection_add=[("state", "open")]) 

Проверьте документацию класса Выбор и поиск selection_add в вашей кодовой базе, чтобы увидеть некоторые примеры.

+0

Спасибо за ваш ответ, но это не главное. Я не хочу добавлять новые элементы в поле выбора. Я хочу изменить его с помощью другого значения его собственных значений. Избегайте части возврата, это вас путает. Я хочу установить значение «invoiced» (которое уже существует) в поле «invoice_status». – MouTio