diff --git a/addons/dine360_uber/models/sale_order.py b/addons/dine360_uber/models/sale_order.py index 2ba4f3f..ab3aec1 100644 --- a/addons/dine360_uber/models/sale_order.py +++ b/addons/dine360_uber/models/sale_order.py @@ -7,52 +7,48 @@ class SaleOrder(models.Model): _inherit = 'sale.order' def _add_uber_delivery_fee(self, amount): - """Add the delivery fee as a line item if not already added or update it""" - _logger.info("Uber: Adding delivery fee %s to order %s", amount, self.name) + """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) - if config and config.delivery_product_id: - fee_product = config.delivery_product_id + + 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) - # Ensure product is published and sellable - if not fee_product.website_published or not fee_product.sale_ok: - _logger.info("Uber: Publishing and enabling sale for product %s", fee_product.name) - fee_product.sudo().write({ - 'website_published': True, - 'sale_ok': True - }) + 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, + }) - # Set fulfillment type on order if field exists - if hasattr(self, 'fulfilment_type'): - self.write({'fulfilment_type': 'delivery'}) - - fee_line = self.order_line.filtered(lambda l: l.product_id.id == fee_product.id) - if fee_line: - _logger.info("Uber: Updating existing fee line %s", fee_line.id) - fee_line.write({ + 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' + 'name': 'Uber Delivery Fee (Distance Based)' }) - else: - _logger.info("Uber: Creating new fee line for product %s", fee_product.id) - self.write({'order_line': [(0, 0, { - 'product_id': fee_product.id, - 'name': 'Uber Delivery Fee', - 'price_unit': amount, - 'product_uom_qty': 1, - })]}) - # Satisfy Odoo's shipping requirement by setting a carrier if none is set - if not self.carrier_id: - Carrier = self.env['delivery.carrier'].sudo() - # Try to find an 'Uber' carrier first, then fall back to any active one - carrier = Carrier.search([('name', 'ilike', 'uber')], limit=1) or Carrier.search([], limit=1) - if carrier: - _logger.info("Uber: Linking order to carrier %s", carrier.name) - self.write({'carrier_id': carrier.id}) - - # Recalculate taxes and totals + self.write({'carrier_id': carrier.id}) self._amount_all() else: - _logger.warning("Uber: Config or delivery product not found") + _logger.warning("Uber: No delivery carrier found to apply fee") return True