首页 > 解决方案 > Odoo python,仅当前订单中的产品价格历史

问题描述

我是一个没有开发技能的 odoo 用户。我有一个有问题的自定义模块。我解释了模块的工作原理:我可以通过在新扫描字段中扫描条形码来添加具有自定义价格和数量的采购订单产品行。如果我扫描更多时间相同的条形码,在相同的产品线中增加数量。在新的扫描条形码字段中,在扫描条形码之前,我可以输入新产品价格和扫描条形码后。将添加新价格的产品线。如果我扫描条形码 1 次,将添加数量为 1 的产品,并默认供应商价格。如果我输入新的扫描字段新价格并再次扫描条形码,将更新产品线,增加 1 个数量和新价格。如果没有 priceHistory 功能,如果我再次扫描条形码(不输入新价格),将增加 1 数量和先前更新的新价格,它将替换为默认供应商价格。使用 priceHistory,我可以保持(固定)更新的新价格,如果我再次扫描条形码,新价格将无法替代。问题是:新价格也适用于其他供应商的其他采购订单,而不仅仅是当前采购订单。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 我可以持有(固定)更新的新价格,如果我再次扫描条形码,新价格将无法替代。问题是:新价格也适用于其他供应商的其他采购订单,而不仅仅是当前采购订单。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 我可以持有(固定)更新的新价格,如果我再次扫描条形码,新价格将无法替代。问题是:新价格也适用于其他供应商的其他采购订单,而不仅仅是当前采购订单。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 新价格不能替代。问题是:新价格也适用于其他供应商的其他采购订单,而不仅仅是当前采购订单。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 新价格不能替代。问题是:新价格也适用于其他供应商的其他采购订单,而不仅仅是当前采购订单。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 不仅在当前的采购订单中。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 不仅在当前的采购订单中。我需要 priceHistory 仅在当前采购订单中修复价格历史。每个订单都有自己的 priceHistory 数据。目前代码工作,如果产品鞋我应用新价格 1 美元与供应商 A 订购 PO1,何时我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)。何时添加product Shoes,priceHistory 始终适用 1$(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 当我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)时。当我添加产品鞋时,priceHistory 始终适用 1 美元(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢 当我将与其他供应商 B、供应商 C、D 等创建新订单(PO2、PO3 等)时。当我添加产品鞋时,priceHistory 始终适用 1 美元(供应商 A 的价格 PO1)。这就是问题所在,我只需要在供应商 A 的 PO1 中申请 1 美元,而不是按所有顺序(PO2,PO3,其他供应商)我不是开发人员,请任何人都可以帮助更正代码?并写给我修改做。非常感谢

在所有完整代码下方

# -*- coding: utf-8 -*-

from odoo import api, fields, models
from odoo.exceptions import Warning
import math
import dateutil.relativedelta
import datetime
import locale

# added the price history map
priceHistory = {}

class PurchaseOrder(models.Model):
    """Inherit Purchase Order."""

    _inherit = "purchase.order"
    barcode = fields.Char(string='Barcode', size=50)

    def _add_product(self, product, qty, price):
        corresponding_line = self.order_line.filtered(lambda r: r.product_id.id == product.id)
        supplierinfo = product.mapped('seller_ids')[:1]
        if corresponding_line:
            corresponding_line[0].product_qty += float(qty)
            corresponding_line[0].price_unit = float(price) or supplierinfo.price
        else:
            self.order_line += self.order_line.new({
                'product_id': product.id,
                'product_qty': qty,
                'date_planned': fields.Datetime.to_string(datetime.datetime.now() - dateutil.relativedelta.relativedelta(months=1)),
                'name': product.name,
                'product_uom': product.uom_id.id,
                'price_unit': float(price) or supplierinfo.price,       
                'taxes_id': product.supplier_taxes_id,
            })
        return True

    @api.onchange('barcode')
    def barcode_scanning(self):
        """Barcode decode."""
        if self.barcode:
            scan_barcode = self.barcode
            barcode = scan_barcode
            qty_position = scan_barcode.find('*')
            price_position = scan_barcode.find('/')

            if price_position > 0:
                price = scan_barcode[:price_position].replace(',','.')
                barcode = scan_barcode[price_position + 1:]
            else:
                price = 0

            if qty_position > 0:
                qty = scan_barcode[price_position + 1:qty_position].replace(',','.')
                barcode = scan_barcode[qty_position + 1:]
            else:
                if float(price) > 0:
                    qty = 0
                else:
                    qty = 1

            #added, to search internal reference
            product_id = self.env['product.product'].search([('default_code', '=ilike', barcode)], limit=1)
            # product_id = self.env['product.product'].search([('default_code', '=', barcode)])
            if barcode and not product_id:
                product_id = self.env['product.product'].search([('barcode', '=', barcode)])
                if barcode and not product_id:
                    self.barcode = barcode = None
                    raise Warning('Barcode sconosciuto')

              if product_id:
                # get the history price
                if price_position == -1:
                    #if priceHistory.has_key(product_id.id):
                    if product_id.id in priceHistory.keys():
                        price = priceHistory[product_id.id]
                self._add_product(product_id, qty, price)
                self.barcode = barcode = None
                #save the product price
                priceHistory[product_id.id] = price
                return                

标签: pythonodoo

解决方案


def _add_product(self, product, qty, price):
    corresponding_line = self.order_line.filtered(lambda r: r.product_id.id == product.id)
    # Get all Vendor List
    supplierinfo = product.mapped('seller_ids')
    for supp_info in supplierinfo:
        # Match with current PO Vendor with assign product Vendor
        if self.partner_id.id == supp_info.id:
            # Update the Pice
            price = supp_info.price
    if corresponding_line:
        corresponding_line[0].product_qty += float(qty)
        corresponding_line[0].price_unit = float(price)
    else:
        self.order_line += self.order_line.new({
            'product_id': product.id,
            'product_qty': qty,
            'date_planned': fields.Datetime.to_string(datetime.datetime.now() - dateutil.relativedelta.relativedelta(months=1)),
            'name': product.name,
            'product_uom': product.uom_id.id,
            'price_unit': float(price),
            'taxes_id': product.supplier_taxes_id,
        })
    return True

推荐阅读