odoo开发技术交流群【73934270】
1、新建销售报价单
2、点击确认订单,将报价单转为销售订单,同时生成对应出库单,相关代码:
确定按钮执行的方法为 sale.order 的 action_button_confirm 方法,具体代码:
def action_button_confirm(self, cr, uid, ids, context=None): if not context: context = {} assert len(ids) == 1, 'This option should only be used for a single id at a time.' self.signal_workflow(cr, uid, ids, 'order_confirm') if context.get('send_email'): self.force_quotation_send(cr, uid, ids, context=context) return True可以看到代码有触发工作流,来确认销售订单;借住工作流视图
我们是从 draft 执行 order_confirm 进入router,此处我们打开看到,执行了 sale.order 类的 action_wait 方法,具体代码:
def action_wait(self, cr, uid, ids, context=None):#只处理自身的销售订单和产品清单的信息更新 context = context or {} for o in self.browse(cr, uid, ids): if not any(line.state != 'cancel' for line in o.order_line): raise osv.except_osv(_('Error!'),_('You cannot confirm a sales order which has no line.')) noprod = self.test_no_product(cr, uid, o, context) if (o.order_policy == 'manual') or noprod: self.write(cr, uid, [o.id], { 'state': 'manual', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)}) else: self.write(cr, uid, [o.id], { 'state': 'progress', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)}) self.pool.get('sale.order.line').button_confirm(cr, uid, [x.id for x in o.order_line if x.state != 'cancel']) return True代码逻辑很清晰,不做进一步分析,进入 router 之后,发票部分我们暂时忽略;我们来看 wait_ship 部分,通过 sale.order 类的 procurement_needed 方法的返回值来确认程序的继续走向,具体代码:
def procurement