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

Split Purchase Order according to Product Category

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

到目前为止我的代码:

_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'))

到目前为止,代码已拆分为多个采购订单,例如如果我有 2 种类型的类别正在制作 2 个 PO,但两个 PO 正在使用并且 4 个产品不仅属于产品类别(见下图)。

输出:

但我想要这种输出:

有什么解决办法吗?

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

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 

我找到了我的问题的解决方案,我认为不是很好,但它确实有效。感谢@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'))