from odoo import models, fields, api, _ import logging _logger = logging.getLogger(__name__) class SaleOrder(models.Model): _inherit = 'sale.order' def _add_uber_delivery_fee(self, amount): """Add the delivery fee using Odoo's standard delivery system to satisfy checkout validation""" _logger.info("Uber: Syncing delivery fee %s to order %s", amount, self.name) # 1. Ensure fulfillment type is set if hasattr(self, 'fulfilment_type'): self.write({'fulfilment_type': 'delivery'}) # 2. Find or Create the Uber Delivery carrier Carrier = self.env['delivery.carrier'].sudo() config = self.env['uber.config'].sudo().search([('active', '=', True)], limit=1) carrier = Carrier.search([('name', 'ilike', 'Uber')], limit=1) if not carrier: # Fallback to any active carrier if no Uber one exists carrier = Carrier.search([('active', '=', True)], limit=1) if not carrier and config and config.delivery_product_id: # Create a basic Uber carrier if strictly needed carrier = Carrier.create({ 'name': 'Uber Delivery', 'delivery_type': 'fixed', 'product_id': config.delivery_product_id.id, 'website_published': True, }) if carrier: # 3. Use Odoo's standard method to set delivery # This satisfies the requirement for website_sale's 'No shipping method' check _logger.info("Uber: Setting carrier %s with fee %s", carrier.name, amount) self.sudo().set_delivery_line(carrier, amount) # Force the price again in case set_delivery_line used its own price delivery_line = self.order_line.filtered(lambda l: l.is_delivery) if delivery_line: delivery_line.write({ 'price_unit': amount, 'name': 'Uber Delivery Fee (Distance Based)' }) self.write({'carrier_id': carrier.id}) else: _logger.warning("Uber: No delivery carrier found to apply fee") return True