69 lines
2.7 KiB
Python

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',
'partner_shipping_id': self.partner_id.id
})
else:
self.write({'partner_shipping_id': self.partner_id.id})
# 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,
'fixed_price': 0.0,
})
if carrier:
# Force carrier to be published and global to avoid "No shipping method" error
carrier.write({
'website_published': True,
'active': True,
'country_ids': [(6, 0, [])],
'state_ids': [(6, 0, [])],
})
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