OpenERP V6.1中采购及库存管理相关的几个Bug修正
-
采购相关Bug修正:
1)采购数量有小数点时候的采购入库时候系统报错问题
采购入库时候,如果入库数量有小数点,实际入库数量明明和待入库数量一样多,系统却报错,不让入库。
原因是,带小数点的待入库数量和实际入库数量,表面上看是一样多,但计算机内部浮点数表示方法的原因,可能会差异0.00000001。OpenERP系统误判为待入库数量和实际入库数量不一致,不让入库。修改方法是,待入库数量和实际入库数量是否一致的判断,不可严格判断,而应该允许一定的“误差”。修改代码是:文件 addons\stock\wizard\stock_partial_picking.py,方法 do_partial中,两个判断语句不正确,修改如下:
if qty_in_line_uom <> wizard_line.quantity: => if abs(qty_in_line_uom - wizard_line.quantity) >= line_uom.rounding:
if qty_in_initial_uom <> without_rounding_qty: => if abs(qty_in_initial_uom - without_rounding_qty) >= line_uom.rounding:
2)当采购单位不同于采购产品的默认单位时候,系统生成的入库会计凭证金额错误问题
原因在于,当采购入库系统自动生成入库会计凭证时候,系统计算入库金额时候有错误。本来应该用入库数量 * 入库单位对应的单价。
但系统却用入库单位对应的单价 * 转换成产品默认单位后的数量。修改方法为:文件 addons\stock\stock.py 的方法 _get_reference_accounting_values_for_valuation 中:
reference_amount = qty * move.price_unit => reference_amount = move.product_qty * move.price_unit
3)以含税价(增值税)采购时候,系统生成的入库会计凭证的金额中未扣除税额
原因在于,以含税价(增值税)采购时候,采购订单上显示的是含税单价,但采购入库时候,入库金额应以不含税价计算。但系统在采购订单确认时候,传递给采购入库的单价却未扣除税,导致问题。修改办法是:文件 addons\purchase\purchase.py的方法_prepare_order_line_move中:
'price_unit': order_line.price_unit => 'price_unit': self.pool.get('account.tax').compute_all(cr, uid, order_line.taxes_id, order_line.price_unit, 1, order.partner_address_id.id, order_line.product_id.id, order.partner_id)['total']
此外,系统自动生成的入库会计凭证,及加权移动平均成本法计算库存成本价格时候,应采用入库单上的未含税单价,不应该取采购订单上的单价。修改办法是,addons\purchase\stock.py的方法_product_cost_for_average_update中:
'cost': move.purchase_line_id.price_unit, => 'cost': move.price_unit,
4)以含税价(增值税)采购,并基于入库单开Invoice时候,系统自动生成的Invoice的单价未从采购订单上取,而是取的入库单上的未税单价。
修改办法是,addons\purchase\stock.py的方法_get_price_unit_invoice中:
return move_line.price_unit => return move_line.purchase_line_id.price_unit
5)系统自动生成的PO,PO上的Warehouse总是取该公司的第一个Warehouse
当公司有多个Shop,每个Shop有不同的Warehouse的时候,系统根据SO生成Procument,Procument上的Location是SO上的Shop的Warehouse对应的Location,这些都没有问题。但是,当根据该Procument自动生成PO时候,系统却总是取公司的第一个Warehouse作为PO的Warehouse,而不是取Procument上的Location对应的Warehouse作为PO的Warehouse。修改方法是,文件addons\purchase\purchase.py的方法 make_po中:
warehouse_id = warehouse_obj.search(cr, uid, [('company_id', '=', procurement.company_id.id or company.id)], context=context) => warehouse_id = warehouse_obj.search(cr, uid, [('lot_stock_id', '=', procurement.location_id.id)], context=context)
6)PO上的Warehouse的Input Location不同于Stock Location时候,采购入库以后,对应的发货单立即变为可用,这是不对的。应等待手动从Input Location调拨进该Warehouse的Stock Location之后,对应出货单才能可用。
原因在于,系统总是将PO上的入库Location(Destination)作为对应的销售出库单的源Location,当入库Warehouse的Input Location不同于Stock Location时候,这不对。修改方法是,文件addons\purchase\purchase.py的方法 _create_pickings中:
order_line.move_dest_id.write({'location_id': order.location_id.id}) =>
if order.warehouse_id:
order_line.move_dest_id.write({'location_id': order.warehouse_id.lot_stock_id.id})
else:
order_line.move_dest_id.write({'location_id': order.location_id.id}) -
[quote author=NewZN link=topic=4568.msg12703#msg12703 date=1355816831]
1)采购数量有小数点时候的采购入库时候系统报错问题
[/quote]
老肖可能没有更新代码,这个问题在8月21日提交的rev:6961中已经做了处理,处理的方式如下:
if float_compare(qty_in_line_uom, wizard_line.quantity, precision_rounding=line_uom.rounding) != 0:
刚才做了一下测试,不会出错,但是仍会因为舍入误差产生back order, 那基本上又变成了另外一个bug了