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