根据产品类别拆分采购订单

时间:2020-01-27 17:42:35

标签: python odoo odoo-12

我想根据产品类别拆分采购订单。

到目前为止,

我的代码:

_inherit ='purchase.order.line'  
split = fields.Boolean(string='Split')


_inherit ='purchase.order'
def btn_split_rfq(self):
            flag = []
            for record in self: 
                if record.order_line:
                    for rec in record.order_line:
                        rec.split = True # oles tis eggrafes true
                        flag.append(rec.product_id.categ_id.id) # lista me ta categ ids
                        newlist=[ii for n,ii in enumerate(flag) if ii not in flag[:n]] # ta krata mono mia fora an uparxoun polles
                    for index in newlist: # gia 2 katigories 8a treksi 2 fores
                        quotation_id = self.copy()
                        for index in record.order_line:
                            if index.split:
                                self.env['purchase.order.line'].browse(index.id).unlink() 
                else:
                    raise ValidationError(_('Please Select Order Line To Split'))

到目前为止,该代码已拆分为多个PO,例如如果我有2个类别的类别正在制作2个PO,而两个PO正在制作,则4个产品不仅属于产品类别(请参见下图)。

输出

enter image description here enter image description here enter image description here

但是我想要这种输出:

enter image description here enter image description here enter image description here

有解决方案吗?

2 个答案:

答案 0 :(得分:1)

我试图忽略您的代码示例,因为这对我来说很难理解。如果您想尝试我的尝试,

def button_split_by_prod_categ(self):
    self.ensure_one()
    groups = {}
    # group lines by product category
    for line in self.order_line:
        if line.product_id.categ_id not in groups:
            groups[line.product_id.categ_id] = line
        else:
            groups[line.product_id.categ_id] =| line
    skip = True
    orders = self
    for lines in groups.values():
        # skip first group
        if skip:
            skip = False
            continue
        # or create a new order without lines and connect
        # the group's lines with it
        else:
            default_values = {'order_line': []}
            new_order = self.copy(default=default_values)
            lines.write({'order_id': new_order.id})
            orders |= new_order
    # now you could return a list view with all orders
    # or just do 'nothing'
    return 

答案 1 :(得分:0)

我找到了解决问题的方法,我认为这还不错,但确实可以。感谢@CZoellner和@Charif DZ的努力!!!

   def btn_split_rfq(self):
            flag =[]
            for record in self: 
                if record.order_line:
                   for rec in record.order_line: #run for all products on purchase order
                        flag.append(rec.product_id.categ_id.id) # append product  category ids
                        categ_ids=[ii for n,ii in enumerate(flag) if ii not in flag[:n]] # filter list,keep only one time every product category id
                        categ_ids.sort() # sorting list
                   for index in categ_ids: # will run 2 times if there is 2 product categories
                           quotations_ids = [self.copy()]
                           for order_line in quotations_ids:
                               prods = self.env['purchase.order.line'].search([('product_categ_id' ,'!=',index),('order_id','=',int(order_line))])
                               for ids in prods:
                                   self.env['purchase.order.line'].browse(ids.id).unlink() 
                else:
                     raise ValidationError(_('Not Available Purchase Order Lines'))