【问题标题】:Product filter with stock quantity in sale order line in odooodoo中销售订单行中具有库存数量的产品过滤器
【发布时间】:2020-08-29 13:03:12
【问题描述】:

class sale_product_filter(models.Model):
    _inherit= "sale.order.line"
    def _get_custom_domain(self):
        return [('categ_id.branch_id','=',self.env.user.branch_id.id)]
    product_id = fields.Many2one(domain= lambda self: self._get_custom_domain())
<record id="sale_order_form_inherit" model="ir.ui.view">
        <field name="name">sale.order.form.inherit</field> 
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="priority" eval="8"/>
        <field name="arch" type="xml">
            <xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="attributes">
                <attribute name="domain"/>
            </xpath>
        </field>
    </record>
<record id="rent_order_form_inherit" model="ir.ui.view">
        <field name="name">sale.order.form.inherit</field> 
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale_renting.rental_order_primary_form_view"/>
        <field name="priority" eval="8"/>
        <field name="arch" type="xml">
            <xpath expr="//field[@name='order_line']/tree/field[@name='product_id']" position="attributes">
                <attribute name="domain"/>
            </xpath>
        </field>
    </record>

我想过滤销售订单行中的产品。当前登录用户有自己的仓库,里面有很多产品。我有很多用户的仓库。所以,我想在销售订单行中只显示登录用户的仓库产品。

我该怎么做?每个用户都有分支字段,仓库有分支字段。当我在销售订单行中添加产品时,我只想显示仓库中与当前用户的分支和产品数量相同的分支的产品在仓库中大于 0。

【问题讨论】:

  • 阅读this
  • 请根据当前用途、仓库和产品之间的关系更新您的问题。
  • @Kenly 我编辑了。请看一下。

标签: python odoo-13


【解决方案1】:

将默认的product_id 域替换为计算域以包含当前用户分支。

以下示例定义了一个计算域来过滤产品并仅显示与当前用户在同一分支中的产品。

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    def _get_custom_domain(self):
        return [('categ_id.branch_id', '=', self.env.user.branch_id.id)]

    product_id = fields.Many2one(domain=lambda self: self._get_custom_domain())

继承表单视图并替换product_id域:

<record id="view_order_form" model="ir.ui.view">
        <field name="name">sale.order.form</field>
        <field name="model">sale.order</field>
        <field name="inherit_id" ref="sale.view_order_form"/>
        <field name="arch" type="xml">
          <xpath expr="//tree/field[@name='product_id']" position="attributes">
              <attribute name="domain"/>
          </xpath>
        </field>
    </record>  

您可以通过在上下文中指定仓库来计算特定仓库中的产品可用数量:

product_obj.with_context(warehouse=warehouse_id.id).browse(product_id).qty_available

使用quantity &gt; 0 搜索产品,然后在域中使用id 字段:

[('id', 'in', filtered_product_ids)]

示例:

def _get_custom_domain(self):
    warehouse_id = self.env['stock.warehouse'].search([('branch_id', '=', self.env.user.branch_id.id)])
    product_ids = self.env['product.product'].with_context(warehouse=warehouse_id.ids).search([]).filtered(lambda p:p.qty_available > 0)
    return [('id', 'in', product_ids.ids)]

编辑:通过操作自定义域

尝试在动作上下文中添加额外的域参数:

'additional_domain': [('sale_ok', '=', True)

如果它在动作上下文中可用,则将其添加到计算域:

return [('id', 'in', product_ids.ids)] + self.env.context.get('additional_domain', [])

编辑:继承引文动作以改变上下文

<record id="sale.action_quotations_with_onboarding" model="ir.actions.act_window">
    <field name="context">{'search_default_my_quotation': 1, 'additional_domain': [('sale_ok', '=', True)]}</field>
</record>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多