Odoo 10销售订单选择/创建项目并关联分析账户技术问询
解决方案
我会分两部分实现你需要的功能:重写project_project_id字段使其草稿状态可编辑,以及添加选择现有项目/创建新项目的按钮并关联到销售订单。所有修改都基于自定义模块,不会改动核心代码。
1. 重写project_project_id字段(支持草稿状态编辑)
首先在自定义模块中继承sale.order模型,重新定义字段并补充双向同步逻辑,确保手动选择项目时能同步更新分析账户:
# models/sale_order.py from odoo import models, fields, api class SaleOrder(models.Model): _inherit = 'sale.order' project_project_id = fields.Many2one( 'project.project', string='Project associated to this sale', compute='_compute_project_project_id', inverse='_inverse_project_project_id', # 新增:手动修改字段时触发反向同步 readonly=True, states={'draft': [('readonly', False)]}, # 仅草稿状态可编辑 copy=False, store=True # 可选:存储字段值提升查询性能 ) @api.multi def _inverse_project_project_id(self): """手动选择项目时,同步更新销售订单的分析账户""" for order in self: order.analytic_account_id = order.project_project_id.analytic_account_id if order.project_project_id else False @api.multi @api.depends('analytic_account_id') def _compute_project_project_id(self): """保留原计算逻辑:从分析账户关联对应项目""" for order in self: project = self.env['project.project'].search( [('analytic_account_id', '=', order.analytic_account_id.id)], limit=1 ) order.project_project_id = project
2. 添加选择/创建项目的按钮及视图调整
修改销售订单表单视图,添加项目字段显示和两个操作按钮,同时定义选择现有项目的弹窗动作:
<!-- views/sale_order_view.xml --> <?xml version="1.0" encoding="utf-8"?> <odoo> <!-- 继承销售订单表单视图 --> <record id="view_order_form_inherit_project_selector" model="ir.ui.view"> <field name="name">Sale Order - Project Selector</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <data> <!-- 在配送地址后插入项目字段和按钮 --> <xpath expr="//field[@name='partner_shipping_id']" position="after"> <!-- 显示项目字段,仅草稿状态可编辑 --> <field name="project_project_id" attrs="{'readonly': [('state', '!=', 'draft')]}" class="mb-2"/> <!-- 选择现有项目按钮 --> <button type="action" name="action_select_project" class="fa fa-search btn btn-secondary mr-2" string="Select Existing Project" groups="base.group_user" attrs="{'invisible': [('state', '!=', 'draft'), ('project_project_id', '!=', False)]}"/> <!-- 创建新项目按钮 --> <button type="object" name="action_create_project" class="fa fa-plus btn btn-primary" string="Create New Project" groups="base.group_user" attrs="{'invisible': [('state', '!=', 'draft'), ('project_project_id', '!=', False)]}"/> </xpath> </data> </field> </record> <!-- 定义选择现有项目的弹窗动作 --> <record id="action_select_project" model="ir.actions.act_window"> <field name="name">Select Project</field> <field name="res_model">project.project</field> <field name="view_mode">tree,form</field> <field name="target">new</field> <field name="context">{'default_partner_id': active_id.partner_id.id}</field> </record> </odoo>
3. 完善创建新项目的逻辑(自动关联销售订单)
修改创建新项目的Python方法,传递销售订单上下文,并在项目创建后自动关联到当前订单:
# models/sale_order.py 中继续添加 @api.multi def action_create_project(self): """打开新项目创建表单,传递销售订单上下文""" view_id = self.env.ref('project.project_project_view_form_simplified').id context = self._context.copy() # 传递客户ID和销售订单ID到新项目表单 context.update({ 'default_partner_id': self.partner_id.id, 'default_sale_order_id': self.id, }) return { 'name': 'Create New Project', 'type': 'ir.actions.act_window', 'res_model': 'project.project', 'view_mode': 'form', 'views': [(view_id, 'form')], 'view_id': view_id, 'target': 'new', 'context': context, 'flags': {'form': {'action_buttons': True, 'options': {'mode': 'edit'}}}, }
然后在project.project模型中添加创建后的关联逻辑:
# models/project_project.py from odoo import models, api class ProjectProject(models.Model): _inherit = 'project.project' @api.model def create(self, vals): project = super(ProjectProject, self).create(vals) # 检查上下文是否包含销售订单ID,自动关联 sale_order_id = self._context.get('default_sale_order_id') if sale_order_id: self.env['sale.order'].browse(sale_order_id).write({ 'project_project_id': project.id }) return project
4. 模块配置(manifest.py)
确保自定义模块依赖所需核心模块:
# __manifest__.py { 'name': 'Sale Order Project Selector', 'version': '1.0', 'depends': ['sale', 'project', 'sale_timesheet'], 'author': 'Your Name', 'data': [ 'views/sale_order_view.xml', ], 'installable': True, 'auto_install': False, }
功能说明
- 字段权限控制:销售订单处于
draft状态时,project_project_id字段可手动选择或通过按钮操作;其他状态下字段只读。 - 选择现有项目:点击按钮弹出项目列表,选择后自动将项目的
analytic_account_id同步到销售订单。 - 创建新项目:点击按钮打开简化版项目创建表单,默认填充销售订单的客户,创建完成后自动关联到当前订单并同步分析账户。
内容的提问来源于stack exchange,提问作者Miquel




