You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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,
}

功能说明

  1. 字段权限控制:销售订单处于draft状态时,project_project_id字段可手动选择或通过按钮操作;其他状态下字段只读。
  2. 选择现有项目:点击按钮弹出项目列表,选择后自动将项目的analytic_account_id同步到销售订单。
  3. 创建新项目:点击按钮打开简化版项目创建表单,默认填充销售订单的客户,创建完成后自动关联到当前订单并同步分析账户。

内容的提问来源于stack exchange,提问作者Miquel

火山引擎 最新活动