diff --git a/stock_delivery_planner/__manifest__.py b/stock_delivery_planner/__manifest__.py
index 9f535541..ac46a9d7 100644
--- a/stock_delivery_planner/__manifest__.py
+++ b/stock_delivery_planner/__manifest__.py
@@ -1,7 +1,7 @@
{
'name': 'Stock Delivery Planner',
'summary': 'Get rates and choose carrier for delivery.',
- 'version': '14.0.1.0.0',
+ 'version': '14.0.1.1.0',
'author': "Hibou Corp.",
'category': 'Warehouse',
'license': 'AGPL-3',
diff --git a/stock_delivery_planner/views/stock_views.xml b/stock_delivery_planner/views/stock_views.xml
index 985dbd14..a65334dd 100644
--- a/stock_delivery_planner/views/stock_views.xml
+++ b/stock_delivery_planner/views/stock_views.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/stock_delivery_planner/wizard/stock_delivery_planner.py b/stock_delivery_planner/wizard/stock_delivery_planner.py
index 65f84852..8c65c0a4 100644
--- a/stock_delivery_planner/wizard/stock_delivery_planner.py
+++ b/stock_delivery_planner/wizard/stock_delivery_planner.py
@@ -1,4 +1,4 @@
-from odoo import api, fields, models
+from odoo import api, fields, models, _
from odoo.tools import safe_eval
import logging
_logger = logging.getLogger(__name__)
@@ -10,6 +10,16 @@ class StockDeliveryPlanner(models.TransientModel):
picking_id = fields.Many2one('stock.picking', 'Transfer')
plan_option_ids = fields.One2many('stock.delivery.planner.option', 'plan_id', 'Options')
+ packages_planned = fields.Boolean(compute='_compute_packages_planned')
+
+ @api.depends('plan_option_ids.selection')
+ def _compute_packages_planned(self):
+ for wiz in self:
+ packages = wiz.picking_id.package_ids
+ if not packages:
+ wiz.packages_planned = False
+ selected_options = wiz.plan_option_ids.filtered(lambda p: p.selection == 'selected')
+ wiz.packages_planned = len(selected_options) == len(packages)
def create(self, values):
planner = super(StockDeliveryPlanner, self).create(values)
@@ -25,9 +35,12 @@ class StockDeliveryPlanner(models.TransientModel):
_logger.warning(rate.get('error_message'))
for rate in filter(lambda r: r.get('success'), rates):
rate = self.calculate_delivery_window(rate)
+ # added late in API dev cycle
+ package = rate.get('package') or self.env['stock.quant.package'].browse()
planner.plan_option_ids |= planner.plan_option_ids.create({
'plan_id': self.id,
'carrier_id': rate['carrier'].id,
+ 'package_id': package.id,
'price': rate['price'],
'date_planned': rate['date_planned'],
'requested_date': rate['date_delivered'],
@@ -48,6 +61,12 @@ class StockDeliveryPlanner(models.TransientModel):
rate['date_delivered'] = carrier.calculate_date_delivered(date_planned, rate.get('transit_days'))
return rate
+ def action_plan(self):
+ self.ensure_one()
+ selected_package_options = self.plan_option_ids.filtered(lambda o: o.package_id and o.selection == 'selected')
+ selected_package_options._plan()
+ return {"type": "ir.actions.act_window_close"}
+
class StockDeliveryOption(models.TransientModel):
_name = 'stock.delivery.planner.option'
@@ -55,17 +74,45 @@ class StockDeliveryOption(models.TransientModel):
plan_id = fields.Many2one('stock.delivery.planner', 'Plan', ondelete='cascade')
carrier_id = fields.Many2one('delivery.carrier', 'Delivery Method')
+ package_id = fields.Many2one('stock.quant.package', 'Package')
price = fields.Float('Shipping Price')
date_planned = fields.Datetime('Planned Date')
requested_date = fields.Datetime('Expected Delivery Date')
transit_days = fields.Integer('Transit Days')
sale_requested_date = fields.Datetime('Sale Order Delivery Date', related='plan_id.picking_id.sale_id.requested_date')
days_different = fields.Float('Days Different', compute='_compute_days_different') # use carrier calendar
+ selection = fields.Selection([
+ ('', 'None'),
+ ('selected', 'Selected'),
+ ('deselected', 'De-selected')
+ ])
+
+ def _plan(self):
+ # this is intended to be used during selecting a whole plan
+ for option in self:
+ option.package_id.write({
+ 'carrier_id': option.carrier_id.id,
+ })
def select_plan(self):
- for option in self.filtered('carrier_id'):
- option.plan_id.picking_id.carrier_id = option.carrier_id
- return
+ self.ensure_one()
+ self.selection = 'selected'
+ if self.package_id:
+ # need to deselect other options for this package
+ deselected = self.plan_id.plan_option_ids.filtered(lambda o: o.package_id == self.package_id and o != self)
+ deselected.write({'selection': 'deselected'})
+ return {
+ 'name': _('Delivery Rate Planner'),
+ 'type': 'ir.actions.act_window',
+ 'view_mode': 'form',
+ 'res_model': 'stock.delivery.planner',
+ 'res_id': self.plan_id.id,
+ 'target': 'new',
+ }
+ else:
+ # Select plan for whole shipment
+ self.plan_id.picking_id.carrier_id = self.carrier_id
+ return {"type": "ir.actions.act_window_close"}
@api.depends('requested_date', 'sale_requested_date', 'carrier_id')
def _compute_days_different(self):
diff --git a/stock_delivery_planner/wizard/stock_delivery_planner_views.xml b/stock_delivery_planner/wizard/stock_delivery_planner_views.xml
index c7e26afd..6b942319 100644
--- a/stock_delivery_planner/wizard/stock_delivery_planner_views.xml
+++ b/stock_delivery_planner/wizard/stock_delivery_planner_views.xml
@@ -6,22 +6,34 @@
form