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.
		
		
		
		
		
			
		
			
				
					
					
						
							140 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							140 lines
						
					
					
						
							7.3 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Ayana kp(odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#    This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1)
							 | 
						|
								#    It is forbidden to publish, distribute, sublicense, or sell copies of the
							 | 
						|
								#    Software or modified copies of the Software.
							 | 
						|
								#
							 | 
						|
								#    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
							 | 
						|
								#    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
							 | 
						|
								#    FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
							 | 
						|
								#    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
							 | 
						|
								#    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
							 | 
						|
								#    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
							 | 
						|
								#    DEALINGS IN THE SOFTWARE.
							 | 
						|
								#
							 | 
						|
								###############################################################################
							 | 
						|
								from markupsafe import Markup
							 | 
						|
								from odoo import models, fields, _
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class StockPicking(models.Model):
							 | 
						|
								    """This class inherits from the base stock picking model in Odoo and allows
							 | 
						|
								     for additional customization and functionality to be added
							 | 
						|
								     to picking operations. """
							 | 
						|
								    _inherit = "stock.picking"
							 | 
						|
								
							 | 
						|
								    is_batch = fields.Boolean(
							 | 
						|
								        "Is Batch", store=True,
							 | 
						|
								        default=False, help="Is batch processing or not")
							 | 
						|
								
							 | 
						|
								    def send_to_shipper(self):
							 | 
						|
								        """ Overriding function for adding to check condition
							 | 
						|
								         for batch transfer """
							 | 
						|
								        self.ensure_one()
							 | 
						|
								        partner_id = self.partner_id.id
							 | 
						|
								        carrier_id = self.carrier_id.id
							 | 
						|
								        filtered_picking_ids = self.batch_id.picking_ids.filtered(
							 | 
						|
								            lambda
							 | 
						|
								                x: x.partner_id.id == partner_id and x.carrier_id.id == carrier_id)
							 | 
						|
								        if self.batch_id and len(filtered_picking_ids) > 1:
							 | 
						|
								            self._batch_send_to_shipper()
							 | 
						|
								        else:
							 | 
						|
								            res = self.carrier_id.send_shipping(self)[0]
							 | 
						|
								            if self.carrier_id.free_over and self.sale_id:
							 | 
						|
								                amount_without_delivery = self.sale_id._compute_amount_total_without_delivery()
							 | 
						|
								                if self.carrier_id._compute_currency(self.sale_id,
							 | 
						|
								                                                     amount_without_delivery,
							 | 
						|
								                                                     'pricelist_to_company') >= self.carrier_id.amount:
							 | 
						|
								                    res['exact_price'] = 0.0
							 | 
						|
								            self.carrier_price = res['exact_price'] * (
							 | 
						|
								                    1.0 + (self.carrier_id.margin / 100.0))
							 | 
						|
								            if res['tracking_number']:
							 | 
						|
								                related_pickings = self.env[
							 | 
						|
								                    'stock.picking'] if self.carrier_tracking_ref and res[
							 | 
						|
								                    'tracking_number'] in self.carrier_tracking_ref else self
							 | 
						|
								                accessed_moves = previous_moves = self.move_ids.move_orig_ids
							 | 
						|
								                while previous_moves:
							 | 
						|
								                    related_pickings |= previous_moves.picking_id
							 | 
						|
								                    previous_moves = previous_moves.move_orig_ids - accessed_moves
							 | 
						|
								                    accessed_moves |= previous_moves
							 | 
						|
								                accessed_moves = next_moves = self.move_ids.move_dest_ids
							 | 
						|
								                while next_moves:
							 | 
						|
								                    related_pickings |= next_moves.picking_id
							 | 
						|
								                    next_moves = next_moves.move_dest_ids - accessed_moves
							 | 
						|
								                    accessed_moves |= next_moves
							 | 
						|
								                without_tracking = related_pickings.filtered(
							 | 
						|
								                    lambda p: not p.carrier_tracking_ref)
							 | 
						|
								                without_tracking.carrier_tracking_ref = res['tracking_number']
							 | 
						|
								                for p in related_pickings - without_tracking:
							 | 
						|
								                    p.carrier_tracking_ref += "," + res['tracking_number']
							 | 
						|
								            order_currency = self.sale_id.currency_id or self.company_id.currency_id
							 | 
						|
								            msg = _(
							 | 
						|
								                "Shipment sent to carrier %(carrier_name)s for shipping with tracking number %(ref)s",
							 | 
						|
								                carrier_name=self.carrier_id.name,
							 | 
						|
								                ref=self.carrier_tracking_ref) + \
							 | 
						|
								                  Markup("<br/>") + \
							 | 
						|
								                  _("Cost: %(price).2f %(currency)s",
							 | 
						|
								                    price=self.carrier_price,
							 | 
						|
								                    currency=order_currency.name)
							 | 
						|
								            self.message_post(body=msg)
							 | 
						|
								            self._add_delivery_cost_to_so()
							 | 
						|
								
							 | 
						|
								    def _batch_send_to_shipper(self):
							 | 
						|
								        """ Method to batch send shipments to the shipper.
							 | 
						|
								            This method is responsible for sending shipments to the designated
							 | 
						|
								            carrier. It calculates the shipping cost, updates tracking
							 | 
						|
								            information, and posts messages related to the shipment. """
							 | 
						|
								        partner_id = self.partner_id.id
							 | 
						|
								        carrier_id = self.carrier_id.id
							 | 
						|
								        filtered_picking_ids = self.batch_id.picking_ids.filtered(
							 | 
						|
								            lambda
							 | 
						|
								                x: x.partner_id.id == partner_id and x.carrier_id.id == carrier_id)
							 | 
						|
								        res = self.carrier_id.send_shipping(self)[0]
							 | 
						|
								        if self.carrier_id.free_over and self.sale_id:
							 | 
						|
								            amount_without_delivery = self.sale_id._compute_amount_total_without_delivery()
							 | 
						|
								            if self.carrier_id._compute_currency(self.sale_id,
							 | 
						|
								                                                 amount_without_delivery,
							 | 
						|
								                                                 'pricelist_to_company') >= self.carrier_id.amount:
							 | 
						|
								                res['exact_price'] = 0.0
							 | 
						|
								        self.carrier_price = res['exact_price'] * (
							 | 
						|
								                1.0 + (self.carrier_id.margin / 100.0))
							 | 
						|
								        if res['tracking_number']:
							 | 
						|
								            related_pickings = self.env[
							 | 
						|
								                'stock.picking'] if self.carrier_tracking_ref and res[
							 | 
						|
								                'tracking_number'] in self.carrier_tracking_ref else self
							 | 
						|
								            accessed_moves = previous_moves = self.move_ids.move_orig_ids
							 | 
						|
								            while previous_moves:
							 | 
						|
								                related_pickings |= previous_moves.picking_id
							 | 
						|
								                previous_moves = previous_moves.move_orig_ids - accessed_moves
							 | 
						|
								                accessed_moves |= previous_moves
							 | 
						|
								            accessed_moves = next_moves = self.move_ids.move_dest_ids
							 | 
						|
								            while next_moves:
							 | 
						|
								                related_pickings |= next_moves.picking_id
							 | 
						|
								                next_moves = next_moves.move_dest_ids - accessed_moves
							 | 
						|
								                accessed_moves |= next_moves
							 | 
						|
								            num = 0
							 | 
						|
								            for pick in filtered_picking_ids:
							 | 
						|
								                if not pick.carrier_tracking_ref:
							 | 
						|
								                    tracking_numbers = res['tracking_number'].split(',')
							 | 
						|
								                    if num < len(tracking_numbers):
							 | 
						|
								                        pick.carrier_tracking_ref = tracking_numbers[num]
							 | 
						|
								                        num += 1
							 | 
						|
								                    else:
							 | 
						|
								                        pick.carrier_tracking_ref = res['tracking_number']
							 | 
						|
								                    order_currency = pick.sale_id.currency_id or pick.company_id.currency_id
							 | 
						|
								                    msg = _(
							 | 
						|
								                        "Shipment sent to carrier %(carrier_name)s for shipping with tracking number %(ref)s",
							 | 
						|
								                        carrier_name=pick.carrier_id.name,
							 | 
						|
								                        ref=pick.carrier_tracking_ref) + \
							 | 
						|
								                          Markup("<br/>") + \
							 | 
						|
								                          _("Cost: %(price).2f %(currency)s",
							 | 
						|
								                            price=pick.carrier_price,
							 | 
						|
								                            currency=order_currency.name)
							 | 
						|
								                    pick.message_post(body=msg)
							 | 
						|
								                    pick._add_delivery_cost_to_so()
							 | 
						|
								
							 |