实现套件类型的物料清单使用以及送货完毕订单送货状态不变bug修复
-
商场卖可乐,可以卖百事可乐,也可以卖可口可乐,也可以打包一个百事可乐和可口可乐的套装,但是客户也可以拆开其中的一个单独买单,也可以一起买打包好的单。
1.首先我们需要定义3个产品:可口可乐、百事可乐、无忧可乐套装。注意:定义无忧可乐套装的时候要定义:供应方法生产
[img [检测到链接无效,已移除] /img]
2.定义生产物料清单。注意:物料清单类型 必须选:套件/虚项
[img [检测到链接无效,已移除] /img]
3.发生销售
[img [检测到链接无效,已移除] /img]
4.查看送货单:
[img [检测到链接无效,已移除] /img]
ok,完毕!
但是有个小问题,当发货完毕,生成发票,登记付款完毕的时候,订单不能自动变为“done”状态,这个问题待哪位大牛解决下。 -
综上所述,我决定找一个简单的解决方式:
修改:addons/sale_stock/stock.py 下stock_move :为其增加action_done 方法:(PS:为啥不直接修改stock下面的action_done方法,因为如果没有安装sale_stock模块,会造成代码无法运行)。
先把/sale/stock.py 下单方法整个抄过来:
然后再下面增加如下代码:
。。。。。。
move_ids = []
moves=[] <----增加
。。。。
move_ids.append(move.id)
moves.append(move) <----增加
。。。。。。。。。。。。。。。。。(原代码)
for id in move_ids:
wf_service.trg_trigger(uid, 'stock.move', id, cr)
#为分解打包商品后的stock.move检查是否全部为“done”,如果是,那么原来订单时注册的stock.move也改变状态为“done”
#并且注册触发器
for mv in moves:
sale_line_id=mv.sale_line_id
other_move_ids = self.search(cr, uid, [('id','!=',mv.id),('state','not in',['done','cancel']),
('sale_line_id','=',sale_line_id.id)], context=context)
phantom_mv =[]
all_done= True
for ohid in other_move_ids:
ohmv=self.browse(cr, uid, ohid, context)
if ohmv.picking_id:
all_done= False
break
phantom_mv.append(ohmv.id);
if all_done and phantom_mv and len(phantom_mv)>0 :
self.write(cr, uid, phantom_mv, {'state': 'done', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
for phid in phantom_mv:
wf_service.trg_trigger(uid, 'stock.move', phid, cr)
#增加完毕
for pick_id in picking_ids:
wf_service.trg_write(uid, 'stock.picking', pick_id, cr)
当然,这个判断不是很科学(最好的办法是拆解套件包时,记录原procurement.order.id或者stock_move.id,通过关系获取),我判断的依据是sale_line_id 下的stock_move的picking_id为空,即作为 phantom(套件)类型的发送单。改变其状态为done,正确激活订单时所注册的Triggers工作流,来完成订单状态的改变。