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()
 | |
| 
 |