From 150d7730f8470a64526d9fc49c51885eeee5ecdd Mon Sep 17 00:00:00 2001 From: William Henrotin <whe@odoo.com> Date: Fri, 15 Mar 2019 14:21:56 +0000 Subject: [PATCH] [FIX] delivery: free_over management The commit 9a9cb9e refactored the way delivery carrier price are added on sale orders. The management of free delivery price was not taken into account past then. This commit put the free price message directly on the sale order line and on the wizard. The carrier price is showed on the wizard but is 0 on the SO. Task : 1943480 closes odoo/odoo#31315 Signed-off-by: pimodoo <pimodoo@users.noreply.github.com> --- addons/delivery/models/delivery_carrier.py | 4 +++- addons/delivery/models/sale_order.py | 7 +++++-- addons/delivery/views/delivery_view.xml | 7 ------- .../delivery/wizard/choose_delivery_carrier.py | 18 ++++++++++++------ .../wizard/choose_delivery_carrier_views.xml | 6 +++++- 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/addons/delivery/models/delivery_carrier.py b/addons/delivery/models/delivery_carrier.py index 191d86e62298..910a8e900085 100644 --- a/addons/delivery/models/delivery_carrier.py +++ b/addons/delivery/models/delivery_carrier.py @@ -127,9 +127,11 @@ class DeliveryCarrier(models.Model): res = getattr(self, '%s_rate_shipment' % self.delivery_type)(order) # apply margin on computed price res['price'] = float(res['price']) * (1.0 + (float(self.margin) / 100.0)) + # save the real price in case a free_over rule overide it to 0 + res['carrier_price'] = res['price'] # free when order is large enough if res['success'] and self.free_over and order._compute_amount_total_without_delivery() >= self.amount: - res['warning_message'] = _('Info:\nThe shipping is free because the order amount exceeds %.2f.\n(The actual shipping cost is: %.2f)') % (self.amount, res['price']) + res['warning_message'] = _('The shipping is free since the order amount exceeds %.2f.') % (self.amount) res['price'] = 0.0 return res diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index c772f967bdde..8eb988d8447b 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -80,11 +80,13 @@ class SaleOrder(models.Model): self.delivery_message = res.get('warning_message', False) else: raise UserError(res['error_message']) + delivery_line.name = self.carrier_id.with_context(lang=self.partner_id.lang).name if self.carrier_id.invoice_policy == 'real': - delivery_line.name = self.carrier_id.with_context(lang=self.partner_id.lang).name delivery_line.name += _(' (Estimated Cost: %s )') % self._format_currency_amount(res['price']) else: delivery_line.price_unit = res['price'] + if self.carrier_id.free_over and self._compute_amount_total_without_delivery() >= res['price']: + delivery_line.name += '\nFree Shipping' self.recompute_delivery_price = False def _create_delivery_line(self, carrier, price_unit, price_unit_in_description=False): @@ -114,7 +116,8 @@ class SaleOrder(models.Model): values['name'] += _(' (Estimated Cost: %s )') % self._format_currency_amount(price_unit) else: values['price_unit'] = price_unit - + if carrier.free_over and self._compute_amount_total_without_delivery() >= price_unit: + values['name'] += '\n' + 'Free Shipping' if self.order_line: values['sequence'] = self.order_line[-1].sequence + 1 sol = SaleOrderLine.sudo().create(values) diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml index f52a571b52f7..28702c4eb54c 100644 --- a/addons/delivery/views/delivery_view.xml +++ b/addons/delivery/views/delivery_view.xml @@ -295,13 +295,6 @@ <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <data> - <xpath expr="//field[@name='payment_term_id']" position="after"> - <div name='carrier_selection'> - <div class="alert alert-info" role="status" attrs="{'invisible': [('delivery_message','=',False)]}"> - <field name='delivery_message' force_save="1"/> - </div> - </div> - </xpath> <xpath expr="//field[@name='partner_id']" position='after'> <field name="delivery_set" invisible="1"/> <field name="recompute_delivery_price" invisible="1"/> diff --git a/addons/delivery/wizard/choose_delivery_carrier.py b/addons/delivery/wizard/choose_delivery_carrier.py index e2c6372a29df..454190a101e7 100644 --- a/addons/delivery/wizard/choose_delivery_carrier.py +++ b/addons/delivery/wizard/choose_delivery_carrier.py @@ -18,23 +18,27 @@ class ChooseDeliveryCarrier(models.TransientModel): required=True, ) delivery_type = fields.Selection(related='carrier_id.delivery_type') - delivery_price = fields.Float(string='Cost', readonly=True) + delivery_price = fields.Float() + display_price = fields.Float(string='Cost', readonly=True) currency_id = fields.Many2one('res.currency', related='order_id.currency_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.carrier_id.rate_shipment(self.order_id) if vals.get('success'): - if vals['warning_message']: - self.order_id.delivery_message = vals['warning_message'] - else: - self.delivery_price = vals['price'] + if vals.get('warning_message'): + self.delivery_message = vals['warning_message'] + self.delivery_price = vals['price'] + self.display_price = vals['carrier_price'] else: return {'error': vals['error_message']} else: + self.display_price = 0 self.delivery_price = 0 @api.depends('carrier_id') @@ -55,8 +59,9 @@ class ChooseDeliveryCarrier(models.TransientModel): vals = self.carrier_id.rate_shipment(self.order_id) if vals.get('success'): if vals['warning_message']: - self.order_id.delivery_message = vals['warning_message'] + self.delivery_message = vals['warning_message'] self.delivery_price = vals['price'] + self.display_price = vals['carrier_price'] else: raise UserError(vals['error_message']) return { @@ -70,4 +75,5 @@ class ChooseDeliveryCarrier(models.TransientModel): def button_confirm(self): self.order_id.carrier_id = self.carrier_id + self.order_id.delivery_message = self.delivery_message self.order_id.set_delivery_line(self.carrier_id, self.delivery_price) diff --git a/addons/delivery/wizard/choose_delivery_carrier_views.xml b/addons/delivery/wizard/choose_delivery_carrier_views.xml index 3b25fc50d28e..e34849eccbe4 100644 --- a/addons/delivery/wizard/choose_delivery_carrier_views.xml +++ b/addons/delivery/wizard/choose_delivery_carrier_views.xml @@ -11,7 +11,8 @@ <field name="delivery_type" invisible="1"/> <field name="currency_id" invisible="1"/> <field name="order_id" invisible="1"/> - <field name='delivery_price' string="Cost" widget="monetary" options="{'currency_field': 'currency_id'}" attrs="{'invisible': [('carrier_id','=', False)]}" force_save="1"/> + <field name='delivery_price' invisible="1"/> + <field name='display_price' string="Cost" widget="monetary" options="{'currency_field': 'currency_id'}" attrs="{'invisible': [('carrier_id','=', False)]}"/> </group> <button name="update_price" type="object" attrs="{'invisible': [('delivery_type','in', ('fixed', 'base_on_rule'))]}"> <i class="fa fa-arrow-right"/> @@ -20,6 +21,9 @@ <div role="alert" class="alert alert-warning" attrs="{'invisible': [('invoicing_message', '=', '')]}"> <field name="invoicing_message" nolabel="1"/> </div> + <div role="alert" class="alert alert-info" attrs="{'invisible': [('delivery_message', '=', False)]}"> + <field name="delivery_message" nolabel="1"/> + </div> <footer> <button name="button_confirm" type="object" string="Add" class="btn-primary"/> <button string="Discard" special="cancel" class="btn-secondary"/> -- GitLab