Как добавить значение в счет из addons/stock_account/stock.py в Odoo

В модели stock.piking у меня есть персонализированное значение, хранящееся в базе данных: sbf_releve

Мне нужно отправить это значение в account.invoice, когда он создает новый счет

Данные счета-фактуры готовятся по адресу addons/stock_account/stock.py.

class stock_picking(osv.osv):
    _inherit = 'stock.picking'

    def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, origin, context=None):
        if context is None:
            context = {}
        partner, currency_id, company_id, user_id = key
        if inv_type in ('out_invoice', 'out_refund'):
            account_id = partner.property_account_receivable.id
            payment_term = partner.property_payment_term.id or False
        else:
            account_id = partner.property_account_payable.id
            payment_term = partner.property_supplier_payment_term.id or False
        return {
            'origin': origin,
            'date_invoice': context.get('date_inv', False),
            'user_id': user_id,
            'partner_id': partner.id,
            'account_id': account_id,
            'payment_term': payment_term,
            'type': inv_type,
            'fiscal_position': partner.property_account_position.id,
            'company_id': company_id,
            'currency_id': currency_id,
            'journal_id': journal_id,
        }

В моем собственном модуле я пытаюсь переопределить этот метод:

from openerp.osv import fields, osv

class stock_picking(osv.osv):
    _name = "stock.picking"
    _inherit = 'stock.picking'

    _columns = {
        'sbf_regroupement': fields.boolean('Regroupement', copy=True),
        'sbf_releve': fields.boolean('Relevé', copy=True),
    }

    def create(self, cr, user, vals, context=None):
        context = context or {}
        if ('name' not in vals) or (vals.get('name') in ('/', False)):
            ptype_id = vals.get('picking_type_id', context.get('default_picking_type_id', False))
            sequence_id = self.pool.get('stock.picking.type').browse(cr, user, ptype_id, context=context).sequence_id.id
            vals['name'] = self.pool.get('ir.sequence').get_id(cr, user, sequence_id, 'id', context=context)
        opartner = self.pool.get('res.partner').browse(cr, user, vals['partner_id'])
        if ('sbf_releve' not in vals):
            vals['sbf_releve'] = opartner.sbf_releve
        if ('sbf_regroupement' not in vals):
            vals['sbf_regroupement'] = opartner.sbf_regroupement
            # self.pool.get('product.product').browse(cr, uid, [prod_id], context=ctx)[0]
        return super(stock_picking, self).create(cr, user, vals, context)


    def _get_invoice_vals(self, cr, uid, key, inv_type, journal_id, origin, context=None):



        if context is None:
            context = {}
        partner, currency_id, company_id, user_id = key
        if inv_type in ('out_invoice', 'out_refund'):
            account_id = partner.property_account_receivable.id
            payment_term = partner.property_payment_term.id or False
        else:
            account_id = partner.property_account_payable.id
            payment_term = partner.property_supplier_payment_term.id or False

        sbf_releve = partner.sbf_releve
        vals = super(stock_picking, self)._get_invoice_vals(cr, uid, key, inv_type, journal_id, origin, context)

        vals['sbf_releve'] = True

        return vals

Но это просто не работает. Почему? Это работает при копировании значений из sale.order в stock.picking, но не в account.invoice.


person Paulo Farinha Silva    schedule 03.11.2014    source источник


Ответы (2)


Чтобы переопределить функцию-член, вам нужно создать подкласс:

class my_stock_picking(stock_picking):

    def get_invoice_vals(<your parameters>):
          <your function body>

Для любой функции, не определенной в вашем подклассе, вместо нее будет использоваться исходная функция stock_picking.

person LindaJeanne    schedule 03.11.2014

Насколько я понимаю, вы хотите перенести некоторые из ваших настраиваемых полей из stock.picking в account.invoice. Я сделал что-то подобное, но для меня я перешел от stock.move к account.invoice.line. Вы должны быть в состоянии адаптировать приведенный ниже код для своего случая.

class stock_move(osv.osv):
_inherit = "stock.move"

def _get_invoice_line_vals(self, cr, uid, move, partner, inv_type, context=None):
    ret = super(stock_move, self)._get_invoice_line_vals(cr, uid, move, partner, inv_type, context=context)

    print "blah blah blah::::",move.date_expected

    if move.date_expected:
        ret['x_delivery_date'] = move.date_expected

    return ret

Здесь date_expected для каждого товара тоже должна была передаваться в account.invoice.line. Я уже сделал пользовательский x_delivery_date в account.invoice.line. Также обновите __openerp__.py и включите «account» в раздел зависимостей. У меня тоже была проблема с этим. Надеюсь, поможет.

person Anis    schedule 14.09.2015