enter image description here

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>

Quiero filtrar productos en la línea de pedido de venta. El usuario de inicio de sesión actual tiene su propio almacén con muchos productos. Tengo muchos almacenes para muchos usuarios, por lo que quiero mostrar solo los productos del almacén del usuario de inicio de sesión en la línea de pedido de venta.

¿Cómo puedo hacer eso? Cada usuario tiene un campo de sucursal y el almacén tiene un campo de sucursal.Cuando agrego un producto en la línea de pedido de venta, quiero mostrar solo el producto que está en el almacén, cuya sucursal es la misma que la sucursal del usuario actual y la cantidad de producto en el almacén es mayor que 0.

0
Aung Ko Ko Lin 29 ago. 2020 a las 16:03

1 respuesta

La mejor respuesta

Reemplace el dominio product_id predeterminado con un dominio calculado para incluir la rama de usuario actual.

El siguiente ejemplo define un dominio calculado para filtrar productos y mostrar solo los productos que están en la misma rama con el usuario actual.

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())

Herede la vista del formulario y reemplace el dominio 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>  

Puede calcular la cantidad de producto disponible en un almacén específico especificando el almacén en el contexto:

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

Busque productos con quantity > 0 y luego use el campo id en el dominio:

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

Ejemplo :

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)]

Editar: personaliza el dominio a partir de la acción

Intente agregar un parámetro de dominio adicional al contexto de la acción:

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

Luego agréguelo al dominio calculado si está disponible en el contexto de la acción:

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

Editar: acción de heredar citas para alterar el contexto

<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>
1
Kenly 2 sep. 2020 a las 14:29