问:大家好,我被困在覆盖属性字段中,实际上,我的问题是,当成本计算方法从自定义字段设置为平均值时,我想计算成本汇率(standard_price),而不是从采购订单中的line.price.unit(price)计算。在此先感谢您的帮助。
答:这正是我要创建的另一个解决方案...希望能对其他人有所帮助...在此代码中,当成本计算方法设置为购买时的其他字段的平均价格(如checke_tax)时,我计算了“ standard_price”(也称为成本价)订购...
采购订单类(osv.osv):
_inherit ='购买顺序'
def _prepare_order_line_move(自己,cr,uid,order,order_line,picking_id,group_id,context = None):
'''准备来自PO行的库存移动数据。该函数返回准备在stock中使用的字典列表.move的create()'''
product_uom = self.pool.get('product.uom')
checke_tax = order_line.checke_tax
如果order_line.product_uom.id!= order_line.product_id.uom_id.id:
checke_tax * = order_line.product_uom.factor / order_line.product_id.uom_id.factor
如果order.currency_id.id!= order.company_id.currency_id.id:
#我们不对price_unit进行四舍五入,因为我们可能希望以比货币允许的位数更多的位数来存储标准价格
checke_tax = self.pool.get('res.currency')。compute(cr,uid,order.currency_id.id,order.company_id.currency_id.id,checke_tax,round = False,context = context)
res = []
move_template = {
'名称':order_line.name或'',
'product_id':order_line.product_id.id,
'product_uom':order_line.product_uom.id,
'product_uos':order_line.product_uom.id,
“日期”:order.date_order,
'date_expected':fields.date.date_to_datetime(自身,cr,uid,order_line.date_planned,上下文),
'location_id':order.partner_id.property_stock_supplier.id,
'location_dest_id':order.location_id.id,
'picking_id':picking_id,
'partner_id':order.dest_address_id.id,
'move_dest_id':错误,
'状态':'草稿',
“ purchase_line_id”:order_line.id,
'company_id':order.company_id.id,
'checke_tax':checke_tax,
'picking_type_id':order.picking_type_id.id,
'group_id':group_id,
'procurement_id':错误,
'origin':order.name,
'route_ids':order.picking_type_id.warehouse_id和[[6,0,[x.id for order.picking_type_id.warehouse_id.route_ids])]或[],
'warehouse_id':order.picking_type_id.warehouse_id.id,
'invoice_state':order.invoice_method =='picking'和'2binvoiced'或'none',
}
diff_quantity = order_line.product_qty
用于在order_line.procurement_ids中进行采购:
sourcing_qty = product_uom._compute_qty(cr,uid,purchase.product_uom.id,purchase.product_qty,to_uom_id = order_line.product_uom.id)
tmp = move_template.copy()
tmp.update({
'product_uom_qty':min(采购数量,差异数量),
'product_uos_qty':min(采购数量,差异数量),
'move_dest_id':采购.move_dest_id.id,#move目的地与采购目的地相同
'group_id':purchase.group_id.id或group_id,#move组与采购组相同(如果存在),否则请使用另一个组
'procurement_id':采购编号,
'invoice_state':采购.rule_id.invoice_state或(procurement.location_id和purchase.location_id.usage =='customer'和采购.invoice_state =='2binvoiced'和'2binvoiced')或(order.invoice_method =='picking'和'2binvoiced')或'none',#dropship案例取自销售
'propagate':采购.rule_id.propagate,
})
diff_quantity-= min(采购数量,diff_quantity)
res.append(tmp)
#如果订单行的数量大于采购的数量(手动更改或最小数量),则
#将未来库存移动分成两部分,因为遵循的路线可能不同。
如果float_compare(diff_quantity,0.0,precision_rounding = order_line.product_uom.rounding)> 0:
move_template ['product_uom_qty'] = diff_quantity
move_template ['product_uos_qty'] = diff_quantity
res.append(move_template)
返回资源
_columns = {
'order_line':fields.one2many('purchase.order.line','order_id','Order Lines,
States = {'approved':[('readonly',True)],
'done':[('readonly',True)]},
copy = True),
}
从openerp.osv导入字段,osv
从openerp.tools.translate导入_
从openerp导入SUPERUSER_ID,api
导入日志
_logger = logging.getLogger(__ name__)
stock_move类(osv.osv):
_inherit =“ stock.move”
def action_done(self,cr,uid,ids,context = None):
self.product_price_update_before_done(cr,uid,id,context = context)
res =超级(stock_move,self).action_done(cr,uid,ids,context = context)
返回资源
def product_price_update_before_done(self,cr,uid,ids,context = None):
product_obj = self.pool.get('product.product')
tmpl_dict = {}
对于self.browse(cr,uid,ids,context = context)的移动:
如果产品cost_method为“平均”,则#adapt传入移动的标准价格
如果(move.location_id.usage =='供应商')和(move.product_id.cost_method =='平均'):
产品= move.product_id
prod_tmpl_id = move.product_id.product_tmpl_id.id
qty_available = move.product_id.product_tmpl_id.qty_available
如果tmpl_dict.get(prod_tmpl_id):
product_avail =可用数量+ tmpl_dict [prod_tmpl_id]
其他:
tmpl_dict [prod_tmpl_id] = 0
product_avail =数量可用
如果product_avail <= 0:
new_std_price = move.checke_tax
其他:
#获取标准价格
数量单位= product.standard_price
new_std_price =((数量单位* product_avail)+(move.checke_tax * move.product_qty))/(product_avail + move.product_qty)
tmpl_dict [prod_tmpl_id] + = move.product_qty
#将标准价格写为SUPERUSER_ID,因为仓库经理可能无权写产品
ctx = dict(上下文或{},force_company = move.company_id.id)
product_obj.write(cr,SUPERUSER_ID,[product.id],{'standard_price':new_std_price},context = ctx)
_columns = {
'checke_tax':fields.float('Unit Price',help =“用于记录用户在领料确认期间设置的产品成本的技术字段(当使用的成本核算方法为“平均价格”或“实际”时)。给定值以公司货币和产品单位表示。”),#,因为它是技术领域,所以我们故意不提供digits属性
}