summaryrefslogtreecommitdiff
path: root/addons/delivery/wizard/choose_delivery_carrier.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/delivery/wizard/choose_delivery_carrier.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/delivery/wizard/choose_delivery_carrier.py')
-rw-r--r--addons/delivery/wizard/choose_delivery_carrier.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/addons/delivery/wizard/choose_delivery_carrier.py b/addons/delivery/wizard/choose_delivery_carrier.py
new file mode 100644
index 00000000..a17e2cde
--- /dev/null
+++ b/addons/delivery/wizard/choose_delivery_carrier.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models, api, _
+from odoo.exceptions import UserError
+
+
+class ChooseDeliveryCarrier(models.TransientModel):
+ _name = 'choose.delivery.carrier'
+ _description = 'Delivery Carrier Selection Wizard'
+
+ order_id = fields.Many2one('sale.order', required=True, ondelete="cascade")
+ partner_id = fields.Many2one('res.partner', related='order_id.partner_id', required=True)
+ carrier_id = fields.Many2one(
+ 'delivery.carrier',
+ string="Shipping Method",
+ help="Choose the method to deliver your goods",
+ required=True,
+ )
+ delivery_type = fields.Selection(related='carrier_id.delivery_type')
+ delivery_price = fields.Float()
+ display_price = fields.Float(string='Cost', readonly=True)
+ currency_id = fields.Many2one('res.currency', related='order_id.currency_id')
+ company_id = fields.Many2one('res.company', related='order_id.company_id')
+ available_carrier_ids = fields.Many2many("delivery.carrier", compute='_compute_available_carrier', string="Available Carriers")
+ invoicing_message = fields.Text(compute='_compute_invoicing_message')
+ delivery_message = fields.Text(readonly=True)
+
+ @api.onchange('carrier_id')
+ def _onchange_carrier_id(self):
+ self.delivery_message = False
+ if self.delivery_type in ('fixed', 'base_on_rule'):
+ vals = self._get_shipment_rate()
+ if vals.get('error_message'):
+ return {'error': vals['error_message']}
+ else:
+ self.display_price = 0
+ self.delivery_price = 0
+
+ @api.onchange('order_id')
+ def _onchange_order_id(self):
+ # fixed and base_on_rule delivery price will computed on each carrier change so no need to recompute here
+ if self.carrier_id and self.order_id.delivery_set and self.delivery_type not in ('fixed', 'base_on_rule'):
+ vals = self._get_shipment_rate()
+ if vals.get('error_message'):
+ warning = {
+ 'title': '%s Error' % self.carrier_id.name,
+ 'message': vals.get('error_message'),
+ 'type': 'notification',
+ }
+ return {'warning': warning}
+
+ @api.depends('carrier_id')
+ def _compute_invoicing_message(self):
+ self.ensure_one()
+ if self.carrier_id.invoice_policy == 'real':
+ self.invoicing_message = _('The shipping price will be set once the delivery is done.')
+ else:
+ self.invoicing_message = ""
+
+ @api.depends('partner_id')
+ def _compute_available_carrier(self):
+ for rec in self:
+ carriers = self.env['delivery.carrier'].search(['|', ('company_id', '=', False), ('company_id', '=', rec.order_id.company_id.id)])
+ rec.available_carrier_ids = carriers.available_carriers(rec.order_id.partner_shipping_id) if rec.partner_id else carriers
+
+ def _get_shipment_rate(self):
+ vals = self.carrier_id.rate_shipment(self.order_id)
+ if vals.get('success'):
+ self.delivery_message = vals.get('warning_message', False)
+ self.delivery_price = vals['price']
+ self.display_price = vals['carrier_price']
+ return {}
+ return {'error_message': vals['error_message']}
+
+ def update_price(self):
+ vals = self._get_shipment_rate()
+ if vals.get('error_message'):
+ raise UserError(vals.get('error_message'))
+ return {
+ 'name': _('Add a shipping method'),
+ 'type': 'ir.actions.act_window',
+ 'view_mode': 'form',
+ 'res_model': 'choose.delivery.carrier',
+ 'res_id': self.id,
+ 'target': 'new',
+ }
+
+ def button_confirm(self):
+ self.order_id.set_delivery_line(self.carrier_id, self.delivery_price)
+ self.order_id.write({
+ 'recompute_delivery_price': False,
+ 'delivery_message': self.delivery_message,
+ })