forked from alaguraj/odoo-testing-addons
86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
from odoo import http
|
|
from odoo.http import request
|
|
import json
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class UberWebhookController(http.Controller):
|
|
|
|
@http.route('/uber/webhook/delivery', type='json', auth='none', methods=['POST'], csrf=False)
|
|
def uber_delivery_webhook(self, **post):
|
|
"""Handle status updates from Uber Direct"""
|
|
data = json.loads(request.httprequest.data)
|
|
_logger.info("Uber Webhook Received: %s", json.dumps(data, indent=2))
|
|
|
|
uber_delivery_id = data.get('delivery_id')
|
|
status = data.get('status') # e.g., 'picked_up', 'delivered'
|
|
|
|
if uber_delivery_id:
|
|
order = request.env['pos.order'].sudo().search([('uber_delivery_id', '=', uber_delivery_id)], limit=1)
|
|
if order:
|
|
# Map Uber status to Odoo status
|
|
status_map = {
|
|
'pickup': 'pickup',
|
|
'pickup_completed': 'delivering',
|
|
'dropoff_completed': 'delivered',
|
|
'cancelled': 'cancelled'
|
|
}
|
|
order.uber_status = status_map.get(status, order.uber_status)
|
|
return {'status': 'success'}
|
|
|
|
return {'status': 'ignored'}
|
|
|
|
|
|
|
|
class UberDeliveryController(http.Controller):
|
|
|
|
@http.route('/shop/uber/quote', type='json', auth='public', website=True, csrf=False)
|
|
def uber_quote(self, address_data, **post):
|
|
"""Get Uber quote for a website address with cleaned address formatting"""
|
|
order = request.website.sale_get_order()
|
|
if not order:
|
|
return {'success': False, 'error': 'No active order'}
|
|
|
|
config = request.env['uber.config'].sudo().search([('active', '=', True)], limit=1)
|
|
if not config:
|
|
return {'success': False, 'error': 'Uber not configured'}
|
|
|
|
company = request.website.company_id
|
|
# Build clean pickup address
|
|
pickup_parts = [company.street, company.city, company.state_id.name, company.zip, company.country_id.name]
|
|
pickup_address = ", ".join([p for p in pickup_parts if p]).strip()
|
|
|
|
# User entered address - building comprehensive string for Uber Direct
|
|
street = address_data.get('street', '').strip()
|
|
street2 = address_data.get('street2', '').strip()
|
|
full_street = f"{street}, {street2}" if street2 else street
|
|
|
|
# Clean state name (Odoo often adds '(CA)' or codes, which can confuse Uber)
|
|
state_name = address_data.get('state', '').split('(')[0].strip()
|
|
|
|
dropoff_parts = [
|
|
full_street,
|
|
address_data.get('city', '').strip(),
|
|
state_name,
|
|
address_data.get('zip', '').strip(),
|
|
address_data.get('country', 'Canada').strip()
|
|
]
|
|
dropoff_address = ", ".join([p for p in dropoff_parts if p]).strip()
|
|
|
|
_logger.info("Uber Quote Request - Pickup: %s | Dropoff: %s", pickup_address, dropoff_address)
|
|
|
|
result = config.get_uber_quote(pickup_address, dropoff_address)
|
|
|
|
if result.get('success'):
|
|
# Clear old delivery fee if different? Or just update.
|
|
# In Odoo website_sale, we usually want to add it to the cart
|
|
order.sudo()._add_uber_delivery_fee(result['fee_amount'])
|
|
return {
|
|
'success': True,
|
|
'fee': result['fee_amount'],
|
|
'eta': result.get('estimated_arrival'),
|
|
}
|
|
else:
|
|
return result
|