Ожидаемая ошибка singleton возникает при возврате более одной записи в odoo?

Этот метод для получения цены продукта из заказа на покупку, и он хорошо работает, если в заказе есть только одна запись, в противном случае я получаю эту ошибку.

raise ValueError("Expected singleton: %s" % self)

Это метод

@api.multi
def create_refund_invoice(self):
    inv_obj = self.env['account.invoice']
    for pick in self.filtered(lambda x:x.return_type):
        type = 'in_refund' if pick.return_type == 'purchase' else 'out_refund'
        inv_lines = {'type':type, 'partner_id':pick.partner_id.id, 'invoice_line_ids':[]}
        account = pick.return_type == 'sale' and pick.partner_id.property_account_receivable_id.id or pick.partner_id.property_account_payable_id.id
        inv_lines['account_id'] = account
        inv_lines['origin'] = pick.name
        inv_lines['name'] = pick.origin
        for line in pick.move_lines:
            name = line.product_id.partner_ref
            for rec in self:

                rec.order_id = line.env['purchase.order'].search([('name', '=', line.origin)]).order_line
                rec.price = rec.order_id.price_unit
            inv_lines['invoice_line_ids'] += [(0, None, {
                'product_id':line.product_id.id,
                'name':name,
                'quantity':line.quantity_done,
                'price_unit': rec.price,
                'account_id':line.product_id.product_tmpl_id.get_product_accounts()['income'].id})]
        if inv_lines['invoice_line_ids']:
            inv_id = inv_obj.create(inv_lines)
            pick.invoice_id = inv_id.id

Любая помощь будет оценена по достоинству.

1 ответ

Решение

Для odoo необходимо, чтобы при получении более одной записи вы не могли напрямую обращаться к значениям ее полей.

В вашем коде вы пытаетесь получить purchase_order_line из purchase_order Возможно, в одном заказе будет доступно много строк.

def create_refund_invoice(self):
    purchase_order_obj = self.env['purchase.order']
    inv_obj = self.env['account.invoice']
    for pick in self.filtered(lambda x:x.return_type):
        type = 'in_refund' if pick.return_type == 'purchase' else 'out_refund'
        inv_lines = {'type':type, 'partner_id':pick.partner_id.id, 'invoice_line_ids':[]}
        account = pick.return_type == 'sale' and pick.partner_id.property_account_receivable_id.id or pick.partner_id.property_account_payable_id.id
        inv_lines['account_id'] = account
        inv_lines['origin'] = pick.name
        inv_lines['name'] = pick.origin
        for line in pick.move_lines:
            name = line.product_id.partner_ref
            for rec in self:
                order_lines = purchase_order_obj.search([('name', '=', line.origin)]).order_line
                for pol in order_lines:
                    price = pol.order_id.price_unit
                    inv_lines['invoice_line_ids'] += [(0, None, {
                                            'product_id':line.product_id.id,
                                            'name':name,
                                            'quantity':line.quantity_done,
                                            'price_unit': price,
                                            'account_id':line.product_id.product_tmpl_id.get_product_accounts()['income'].id})
                                            ]
        if inv_lines['invoice_line_ids']:
            inv_id = inv_obj.create(inv_lines)
            pick.invoice_id = inv_id.id

Я обновил тест кода выше кода и обновил его в соответствии с вашими требованиями.

Другие вопросы по тегам