From 9aa351a9dbeaa08f9f260b88782ce69f1cf6c90d Mon Sep 17 00:00:00 2001 From: Parth Mehta Date: Wed, 17 Feb 2016 15:54:41 +0100 Subject: [PATCH] [IMP] delivery: margin on shipping price Allow users to define a percentage on shipping price, in order to cover up differences between rating and shipping actual price. Authors: Barad Mahendra Parth Mehta --- addons/delivery/models/delivery_carrier.py | 19 +++++++++++++------ addons/delivery/models/sale_order.py | 3 ++- addons/delivery/views/delivery_view.xml | 4 ++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/addons/delivery/models/delivery_carrier.py b/addons/delivery/models/delivery_carrier.py index 8a7f8fee787..e360a70ccaa 100644 --- a/addons/delivery/models/delivery_carrier.py +++ b/addons/delivery/models/delivery_carrier.py @@ -52,6 +52,11 @@ class DeliveryCarrier(models.Model): fixed_price = fields.Float(compute='_compute_fixed_price', inverse='_set_product_fixed_price', store=True, string='Fixed Price',help="Keep empty if the pricing depends on the advanced pricing per destination") shipping_enabled = fields.Boolean(string="Shipping enabled", default=True, help="Uncheck this box to disable package shipping while validating Delivery Orders") prod_environment = fields.Boolean("Environment", help="Set to True if your credentials are certified for production.") + margin = fields.Integer(help='This percentage will be added to the shipping price.') + + _sql_constraints = [ + ('margin_not_under_100_percent', 'CHECK (margin >= -100)', 'Margin cannot be lower than -100%'), + ] @api.one def toggle_prod_environment(self): @@ -99,24 +104,26 @@ class DeliveryCarrier(models.Model): order = SaleOrder.browse(order_id) if self.delivery_type not in ['fixed', 'base_on_rule']: try: - self.price = self.get_shipping_price_from_so(order)[0] + computed_price = self.get_shipping_price_from_so(order)[0] self.available = True except UserError as e: # No suitable delivery method found, probably configuration error _logger.info("Carrier %s: %s, not found", self.name, e.name) - self.price = 0.0 + computed_price = 0.0 else: carrier = self.verify_carrier(order.partner_shipping_id) if carrier: try: - self.price = carrier.get_price_available(order) + computed_price = carrier.get_price_available(order) self.available = True - except UserError, e: + except UserError as e: # No suitable delivery method found, probably configuration error _logger.info("Carrier %s: %s", carrier.name, e.name) - self.price = 0.0 + computed_price = 0.0 else: - self.price = 0.0 + computed_price = 0.0 + + self.price = computed_price * (1.0 + (float(self.margin) / 100.0)) # -------------------------- # # API for external providers # diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index b99391c1aeb..9d64c718e1e 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -65,7 +65,8 @@ class SaleOrder(models.Model): if order.company_id.currency_id.id != order.pricelist_id.currency_id.id: price_unit = order.company_id.currency_id.with_context(date=order.date_order).compute(price_unit, order.pricelist_id.currency_id) - order._create_delivery_line(carrier, price_unit) + final_price = price_unit * (1.0 + (float(self.carrier_id.margin) / 100.0)) + order._create_delivery_line(carrier, final_price) else: raise UserError(_('No carrier set for this order.')) diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml index 36be1fa7803..4e418df7c3f 100644 --- a/addons/delivery/views/delivery_view.xml +++ b/addons/delivery/views/delivery_view.xml @@ -63,6 +63,10 @@ +