mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
Initial commit of delivery_hibou and associated refactoring to sale_planner and delivery_stamps for 11.0
This commit is contained in:
@@ -25,6 +25,36 @@ class DeliveryCarrier(models.Model):
|
||||
if hasattr(self, '%s_get_shipping_price_for_plan' % self.delivery_type):
|
||||
return getattr(self, '%s_get_shipping_price_for_plan' % self.delivery_type)(orders, date_planned)
|
||||
|
||||
def rate_shipment_date_planned(self, order, date_planned=None):
|
||||
"""
|
||||
For every sale order, compute the price of the shipment and potentially when it will arrive.
|
||||
:param order: `sale.order`
|
||||
:param date_planned: The date the shipment is expected to leave/be picked up by carrier.
|
||||
:return: rate in the same form the normal `rate_shipment` method does BUT
|
||||
-- Additional keys
|
||||
- transit_days: int
|
||||
- date_delivered: string
|
||||
"""
|
||||
self.ensure_one()
|
||||
if hasattr(self, '%s_rate_shipment_date_planned' % self.delivery_type):
|
||||
# New API Odoo 11 - Carrier specific override.
|
||||
return getattr(self, '%s_rate_shipment_date_planned' % self.delivery_type)(order, date_planned)
|
||||
|
||||
rate = self.with_context(date_planned=date_planned).rate_shipment(order)
|
||||
if rate and date_planned:
|
||||
if rate.get('date_delivered'):
|
||||
date_delivered = rate['date_delivered']
|
||||
transit_days = self.calculate_transit_days(date_planned, date_delivered)
|
||||
if not rate.get('transit_days') or transit_days < rate.get('transit_days'):
|
||||
rate['transit_days'] = transit_days
|
||||
elif rate.get('transit_days'):
|
||||
rate['date_delivered'] = self.calculate_date_delivered(date_planned, rate.get('transit_days'))
|
||||
elif rate:
|
||||
if rate.get('date_delivered'):
|
||||
rate.pop('date_delivered')
|
||||
|
||||
return rate
|
||||
|
||||
def calculate_transit_days(self, date_planned, date_delivered):
|
||||
self.ensure_one()
|
||||
if isinstance(date_planned, str):
|
||||
@@ -36,11 +66,14 @@ class DeliveryCarrier(models.Model):
|
||||
while date_planned < date_delivered:
|
||||
if transit_days > 10:
|
||||
break
|
||||
interval = self.delivery_calendar_id.plan_days(1, date_planned, compute_leaves=True)
|
||||
|
||||
if not interval:
|
||||
current_date_planned = self.delivery_calendar_id.plan_days(1, date_planned, compute_leaves=True)
|
||||
if not current_date_planned:
|
||||
return self._calculate_transit_days_naive(date_planned, date_delivered)
|
||||
date_planned = interval[0][1]
|
||||
if current_date_planned == date_planned:
|
||||
date_planned += timedelta(days=1)
|
||||
else:
|
||||
date_planned = current_date_planned
|
||||
transit_days += 1
|
||||
|
||||
if transit_days > 1:
|
||||
@@ -59,11 +92,11 @@ class DeliveryCarrier(models.Model):
|
||||
# date calculations needs an extra day
|
||||
effective_transit_days = transit_days + 1
|
||||
|
||||
interval = self.delivery_calendar_id.plan_days(effective_transit_days, date_planned, compute_leaves=True)
|
||||
if not interval:
|
||||
last_day = self.delivery_calendar_id.plan_days(effective_transit_days, date_planned, compute_leaves=True)
|
||||
if not last_day:
|
||||
return self._calculate_date_delivered_naive(date_planned, transit_days)
|
||||
|
||||
return fields.Datetime.to_string(interval[-1][1])
|
||||
return fields.Datetime.to_string(last_day)
|
||||
|
||||
def _calculate_date_delivered_naive(self, date_planned, transit_days):
|
||||
return fields.Datetime.to_string(date_planned + timedelta(days=transit_days))
|
||||
|
||||
Reference in New Issue
Block a user