开发者社区 问答 正文

从odoo的订单线上获得产品价格?

我已经安装了一个自定义模块从Odoo商店,它会自动创建一个信用记录的产品,但这个模块从产品的形式,其中可能不包括订单的价格。 我需要改变每一行的价格的价值计算从订单线,即使它是在出售或购买。 这是创建方法:

@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
            pricelist_id = pick.partner_id.property_product_pricelist
            price = pricelist_id.get_product_price(line.product_id, 1, pick.partner_id) if pricelist_id else line.product_id.lst_price


            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

我该怎么办? 我试着设置

 price = line.env['purchase.order'].search([('name','=',line.group_id)]).order_line.price_unit

但它使价格= 0 任何帮助将不胜感激。 我使它,但它只得到一条记录,如果有不止一条记录,我得到错误

 raise ValueError("Expected singleton: %s" % self) ValueError: Expected singleton: purchase.order.line(11362, 11363)

这是新方法

@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
            order_id = line.env['purchase.order'].search([('name', '=', line.origin)]).order_line
            price = 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

问题来源StackOverflow 地址:/questions/59380022/get-product-price-from-order-line-in-odoo

展开
收起
kun坤 2019-12-30 09:58:58 667 分享 版权
阿里云 AI 助理回答

在你的代码中,你尝试从purchase.order获取价格,但是遇到了一些问题。错误信息提示你期望的是单个结果(singleton),但实际上返回了多个记录。这是因为你的搜索条件可能匹配到了多条记录,而你试图直接将查询结果赋值给一个字段,这在Odoo中是不允许的,因为它期望每个字段只有一个值。

为了解决这个问题,你需要确保只获取与当前处理的move_lines相关的那一条purchase.order.line记录。你可以通过在搜索时添加更多的限制条件来实现这一点,比如基于产品ID和数量等额外信息来精确匹配。但更简单且直接的方法是利用现有关系字段,如果move_lines已经与purchase.order.line有直接或间接关联的话。

这里提供一个修改后的思路:

  1. 直接使用关联字段:如果你的stock.move(即pick.move_lines)对象直接或间接引用了purchase.order.line,你应该利用这个关联而不是通过名称去搜索。通常,从采购到库存移动,再到发票创建,数据之间会有明确的关联字段。

  2. 修正搜索逻辑:如果必须通过搜索,确保搜索条件足够精确以返回唯一记录。例如,可以考虑同时比较产品ID、数量和其他可能区分不同行的字段。

下面是一个示例代码片段,假设move_lines有一个直接或间接指向purchase.order.line的字段(这里假设为purchase_line_id,请根据实际情况调整):

@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
            # 假设 move_lines 有一个字段指向 purchase.order.line
            purchase_line = line.purchase_line_id
            if purchase_line:
                price = purchase_line.price_unit
            else:
                # 如果没有直接关联,可能需要更复杂的逻辑来找到正确的price_unit
                continue  # 或者设置一个默认价格处理逻辑

            inv_lines['invoice_line_ids'].append(
                (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

请注意,上述代码中的line.purchase_line_id是基于假设的一个字段名,实际应用中你需要根据你的模块结构和数据库模型来确定如何正确地从stock.move(即move_lines)访问到对应的purchase.order.line记录。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: