Search code examples
odooodoo-10

Planned(assigned) quantity , search


I have calculated 2 fields with my method. it calculates the number of products that are assigned.

class ProductProduct(models.Model):
    _inherit = 'product.product'

    planned_qty_cust = fields.Float(compute='_calculate_planned_qty', string='Planned Qty Customer', )
    planned_qty_supl = fields.Float(compute='_calculate_planned_qty', string='Planned Qty Suplier', )


    @api.multi
    def _calculate_planned_qty(self):
        for product in self:
            stock_move_obj = self.env['stock.move']
            domain = [('product_id', '=', product.id),
                                                 ('state', 'not in', ['cancel', 'done','draft']),
                                                 ('location_dest_id.usage', '=', 'customer'),
                                                 ]
            stock_moves_cust = stock_move_obj.search(domain)
            qty = sum(stock_moves_cust.mapped('product_uom_qty'))
            product.planned_qty_cust = qty
            domain2 = [('product_id', '=', product.id),
                      ('state', 'not in', ['cancel', 'done', 'draft']),
                      ('location_dest_id.usage', '=', 'supplier'),
                      ]
            stock_moves_cust = stock_move_obj.search(domain2)
            qty = sum(stock_moves_cust.mapped('product_uom_qty'))
            product.planned_qty_supl = qty

the thing is that I need to filter on these fields, and probably I need to create search function but it's kinda complicated.

maybe someone can help me with this how this method should look, or maybe there is already a module for this type of calculation?


Solution

  • This is how I managed to solve this problem

        planned_qty_cust = fields.Float(
        compute='_calculate_planned_qty',
        string='Planned Qty Customer',
        search='_search_name_qty_cust',
    )
    planned_qty_supl = fields.Float(
        compute='_calculate_planned_qty', string='Planned Qty Suplier',
        search='_search_name_qty_sup',
    )
    
    def _calc_planned_qty(self, domain, operator, value):
        move_data = self.env['stock.move'].read_group(
            [
                ('product_uom_qty', operator, value),
                ('state', 'not in', ['cancel', 'done', 'draft']),
                domain,
            ],
            ['product_id'],
            ['product_id'],
        )
        res = [data['product_id'][0] for data in move_data]
        return res
    
    def _search_name_qty_cust(self, operator, value):
        domain = ('location_dest_id.usage', '=', 'customer')
        res = self._calc_planned_qty(domain,operator,value)
        return [('id', 'in', res)]
    
    def _search_name_qty_sup(self, operator, value):
        domain = ('location_dest_id.usage', '=', 'supplier')
        res = self._calc_planned_qty(domain, operator, value)
        return [('id', 'in', res)]