You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							235 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							235 lines
						
					
					
						
							11 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
							 | 
						|
								#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import math
							 | 
						|
								import re
							 | 
						|
								
							 | 
						|
								from odoo import Command, fields, models
							 | 
						|
								from odoo.exceptions import ValidationError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class SplitOrder(models.TransientModel):
							 | 
						|
								    """ Split manufacture order by different methods"""
							 | 
						|
								    _name = 'split.order'
							 | 
						|
								    _description = "Split Orders"
							 | 
						|
								
							 | 
						|
								    splitting_method = fields.Selection([
							 | 
						|
								        ('by_no_of_quantity', 'By Number of Quantity'),
							 | 
						|
								        ('by_no_of_split', 'By Number of Split'),
							 | 
						|
								        ('split_manually', 'Split Manually')], string="Splitting Method",
							 | 
						|
								        required=True, help="To select splitting method")
							 | 
						|
								    no_of_quantity = fields.Integer(string="No of Quantity",
							 | 
						|
								                                    help="Number of quantity splitting")
							 | 
						|
								    no_of_split = fields.Integer(string="No of Split",
							 | 
						|
								                                 help="Number of splits quantity")
							 | 
						|
								    order_id = fields.Many2one('mrp.production', string="Order",
							 | 
						|
								                               help="Manufacturing production order")
							 | 
						|
								    split_manually = fields.Char(string="Splitting Quantities",
							 | 
						|
								                                 help="Can split mrp manually")
							 | 
						|
								    work_center_id = fields.Many2one('mrp.workcenter',
							 | 
						|
								                                     string="Work Center",
							 | 
						|
								                                     required=True, help="work center")
							 | 
						|
								    works = fields.Boolean(string="Works",
							 | 
						|
								                           help="For visible work center on wizard")
							 | 
						|
								
							 | 
						|
								    def action_split_done(self):
							 | 
						|
								        """ Split by no of quantity,If no of quantity
							 | 
						|
								         is greater than product quantity no action required."""
							 | 
						|
								        vals = {
							 | 
						|
								            'workcenter_id': self.work_center_id.id,
							 | 
						|
								            'product_uom_id': self.order_id.product_uom_id.id,
							 | 
						|
								            'name': self.work_center_id.name,
							 | 
						|
								        }
							 | 
						|
								        order = self.order_id
							 | 
						|
								        qty = order.product_qty
							 | 
						|
								        no_qty = self.no_of_quantity
							 | 
						|
								        no_split = self.no_of_split
							 | 
						|
								        manually = self.split_manually
							 | 
						|
								        if qty > 1 and no_qty:
							 | 
						|
								            if no_qty > qty:
							 | 
						|
								                raise ValidationError("Choose Valid Quantity")
							 | 
						|
								            elif no_qty == qty:
							 | 
						|
								                return False
							 | 
						|
								            else:
							 | 
						|
								                if order.move_raw_ids and not order.bom_id:
							 | 
						|
								                    move_raw_ids_list = []
							 | 
						|
								                    for res in order.move_raw_ids:
							 | 
						|
								                        uom = math.floor(
							 | 
						|
								                            ((1 / qty) * (qty - no_qty)) * res.product_uom_qty)
							 | 
						|
								                        by_product_uom = res.product_uom_qty - uom
							 | 
						|
								                        components = {
							 | 
						|
								                            'product_id': res.product_id.id,
							 | 
						|
								                            'product_uom_qty': uom
							 | 
						|
								                        }
							 | 
						|
								                        res.update(components)
							 | 
						|
								                        move_raw_ids_list.append({
							 | 
						|
								                            'product_id': res.product_id.id,
							 | 
						|
								                            'product_uom_qty': abs(by_product_uom)
							 | 
						|
								                        })
							 | 
						|
								                    self.env['mrp.production'].create({
							 | 
						|
								                        'product_qty': no_qty,
							 | 
						|
								                        'product_id': order.product_id.id,
							 | 
						|
								                        'product_uom_id': order.product_uom_id.id,
							 | 
						|
								                        'move_raw_ids': [Command.create(data) for data in
							 | 
						|
								                                         move_raw_ids_list],
							 | 
						|
								                    })
							 | 
						|
								                    order.write(
							 | 
						|
								                        {
							 | 
						|
								                            'product_qty': qty - no_qty,
							 | 
						|
								                        })
							 | 
						|
								                else:
							 | 
						|
								                    order.write(
							 | 
						|
								                        {
							 | 
						|
								                            'product_qty': qty - no_qty,
							 | 
						|
								                            'workorder_ids': [Command.create(vals)]
							 | 
						|
								                        })
							 | 
						|
								                    self.env['mrp.production'].create({
							 | 
						|
								                        'product_qty': no_qty,
							 | 
						|
								                        'product_id': order.product_id.id,
							 | 
						|
								                        'product_uom_id': order.product_uom_id.id,
							 | 
						|
								                    })
							 | 
						|
								        """Split manufacture order by no of splits,If no of quantity
							 | 
						|
								         is greater than product quantity no action required."""
							 | 
						|
								        if qty > 1 and no_split:
							 | 
						|
								            if no_split > qty:
							 | 
						|
								                raise ValidationError("Choose Valid Quantity")
							 | 
						|
								            elif no_split == qty:
							 | 
						|
								                return False
							 | 
						|
								            else:
							 | 
						|
								                split = qty // no_split
							 | 
						|
								                reminder = qty % no_split
							 | 
						|
								                value = qty - reminder
							 | 
						|
								                if order.move_raw_ids and not order.bom_id:
							 | 
						|
								                    mrp_order=False
							 | 
						|
								                    if value == 0:
							 | 
						|
								                        return False
							 | 
						|
								                    else:
							 | 
						|
								                        for val in range(int(split)):
							 | 
						|
								                            move_raw_ids_list = []
							 | 
						|
								                            for rec in order.move_raw_ids:
							 | 
						|
								                                by_product_split = rec.product_uom_qty // no_split
							 | 
						|
								                                by_product_reminder = rec.product_uom_qty % no_split
							 | 
						|
								                                by_product_value = rec.product_uom_qty - by_product_reminder
							 | 
						|
								                                by_product_split_qty = by_product_value // by_product_split
							 | 
						|
								                                move_raw_ids_list.append({
							 | 
						|
								                                    'product_id': rec.product_id.id,
							 | 
						|
								                                    'product_uom_qty': by_product_split_qty
							 | 
						|
								                                })
							 | 
						|
								                            mrp_order=self.env[
							 | 
						|
								                                'mrp.production'].create(
							 | 
						|
								                                {
							 | 
						|
								                                    'product_qty': value // split,
							 | 
						|
								                                    'product_id': order.product_id.id,
							 | 
						|
								                                    'workorder_ids': [Command.create(vals)],
							 | 
						|
								                                    'move_raw_ids': [Command.create(data)
							 | 
						|
								                                                     for data in
							 | 
						|
								                                                     move_raw_ids_list],
							 | 
						|
								                                })
							 | 
						|
								                    if reminder > 0:
							 | 
						|
								                        order.write(
							 | 
						|
								                            {
							 | 
						|
								                                'product_qty': reminder,
							 | 
						|
								                                'workorder_ids': [Command.create(vals)]
							 | 
						|
								                            })
							 | 
						|
								                    else:
							 | 
						|
								                        order.unlink()
							 | 
						|
								                        if mrp_order:
							 | 
						|
								                            return {
							 | 
						|
								                                "type": "ir.actions.act_window",
							 | 
						|
								                                "res_model": "mrp.production",
							 | 
						|
								                                "res_id": mrp_order.id,
							 | 
						|
								                                "view_mode": "form",
							 | 
						|
								                                "views": [[False, "form"]],
							 | 
						|
								                                "target": "current",
							 | 
						|
								                            }
							 | 
						|
								                else:
							 | 
						|
								                    split = qty // no_split
							 | 
						|
								                    reminder = qty % no_split
							 | 
						|
								                    value = qty - reminder
							 | 
						|
								                    if value == 0:
							 | 
						|
								                        return False
							 | 
						|
								                    else:
							 | 
						|
								                        for val in range(int(split)):
							 | 
						|
								                            create_mo_split = self.env['mrp.production'].create(
							 | 
						|
								                                {
							 | 
						|
								                                    'product_qty': value // split,
							 | 
						|
								                                    'product_id': order.product_id.id
							 | 
						|
								                                })
							 | 
						|
								                            create_mo_split.write(
							 | 
						|
								                                {'workorder_ids': [Command.create(vals)]})
							 | 
						|
								                    if reminder > 0:
							 | 
						|
								                        order.write(
							 | 
						|
								                            {
							 | 
						|
								                                'product_qty': reminder,
							 | 
						|
								                                'workorder_ids': [Command.create(vals)]
							 | 
						|
								                            })
							 | 
						|
								                    else:
							 | 
						|
								                        order.unlink()
							 | 
						|
								        """ Split manufacture order by Manually"""
							 | 
						|
								        if qty > 1 and manually:
							 | 
						|
								            split_value = manually.split(",")
							 | 
						|
								            total = sum(map(int, split_value))
							 | 
						|
								            split_sum = 0
							 | 
						|
								            val = []
							 | 
						|
								            split_manually = self.split_manually
							 | 
						|
								            pattern = r'^[\d,]+$'
							 | 
						|
								            validation = re.match(pattern, split_manually) is not None
							 | 
						|
								            if total<qty:
							 | 
						|
								                raise ValidationError("The total of split must be equal to the order quantity")
							 | 
						|
								            if validation:
							 | 
						|
								                for rec in split_value:
							 | 
						|
								                    split_sum += int(rec)
							 | 
						|
								                    val.append(int(rec))
							 | 
						|
								                    for record in val:
							 | 
						|
								                        if record == 0:
							 | 
						|
								                            val.remove(0)
							 | 
						|
								                if split_sum > qty or split_sum == 0:
							 | 
						|
								                    raise ValidationError("Choose Valid Quantity")
							 | 
						|
								                if order.move_raw_ids and not order.bom_id:
							 | 
						|
								                    for rec in val:
							 | 
						|
								                        move_raw_ids_list = []
							 | 
						|
								                        for c in order.move_raw_ids:
							 | 
						|
								                            move_raw_ids_list.append({
							 | 
						|
								                                'product_id': c.product_id.id,
							 | 
						|
								                                'product_uom_qty': round(
							 | 
						|
								                                    (1 / split_sum) * c.product_uom_qty * rec)
							 | 
						|
								                            })
							 | 
						|
								                        self.env['mrp.production'].create({
							 | 
						|
								                            'product_qty': int(rec),
							 | 
						|
								                            'product_id': order.product_id.id,
							 | 
						|
								                            'move_raw_ids': [Command.create(data) for data in
							 | 
						|
								                                             move_raw_ids_list],
							 | 
						|
								                        })
							 | 
						|
								                    order.unlink()
							 | 
						|
								                else:
							 | 
						|
								                    order.write(
							 | 
						|
								                        {
							 | 
						|
								                            'product_qty': int(val[0]),
							 | 
						|
								                            'workorder_ids': [Command.create(vals)],
							 | 
						|
								                        })
							 | 
						|
								                    val.pop(0)
							 | 
						|
								                    for rec in val:
							 | 
						|
								                        self.env['mrp.production'].create({
							 | 
						|
								                            'product_qty': int(rec),
							 | 
						|
								                            'product_id': order.product_id.id
							 | 
						|
								                        })
							 | 
						|
								            else:
							 | 
						|
								                raise ValidationError("Enter the correct value")
							 | 
						|
								
							 |