import requests from django.conf import settings from .models import Order, OrderLine, Stage, Trip class OdooService: def __init__(self): self.base_url = f"http://{settings.ODOO_INTERNAL_URL}" def get_odoo_orders(self, team_uuid): """Получить заказы из Odoo API""" try: # Прямой вызов Odoo FastAPI url = f"{self.base_url}/fastapi/orders/api/v1/orders/team/{team_uuid}" print(f"Calling Odoo API: {url}") response = requests.get(url, timeout=10) print(f"Odoo response: {response.status_code}") if response.status_code == 200: data = response.json() print(f"Odoo data: {len(data)} orders") return data else: print(f"Odoo error: {response.text}") return [] except Exception as e: print(f"Error fetching from Odoo: {e}") return [] def get_odoo_order(self, order_uuid): """Получить заказ из Odoo API""" try: url = f"{self.base_url}/fastapi/orders/api/v1/orders/{order_uuid}" response = requests.get(url, timeout=10) if response.status_code == 200: return response.json() return None except Exception as e: print(f"Error fetching order from Odoo: {e}") return None def sync_team_orders(self, team_uuid): """Синхронизировать заказы команды с Odoo""" odoo_orders = self.get_odoo_orders(team_uuid) django_orders = [] for odoo_order in odoo_orders: # Создаем или обновляем заказ в Django order, created = Order.objects.get_or_create( uuid=odoo_order['uuid'], defaults={ 'name': odoo_order['name'], 'team_uuid': odoo_order['teamUuid'], 'user_id': odoo_order['userId'], 'source_location_uuid': odoo_order['sourceLocationUuid'], 'source_location_name': odoo_order['sourceLocationName'], 'destination_location_uuid': odoo_order['destinationLocationUuid'], 'destination_location_name': odoo_order['destinationLocationName'], 'status': odoo_order['status'], 'total_amount': odoo_order['totalAmount'], 'currency': odoo_order['currency'], 'notes': odoo_order.get('notes', ''), } ) # Синхронизируем order lines self.sync_order_lines(order, odoo_order.get('orderLines', [])) # Синхронизируем stages self.sync_stages(order, odoo_order.get('stages', [])) django_orders.append(order) return django_orders def sync_order(self, order_uuid): """Синхронизировать один заказ с Odoo""" odoo_order = self.get_odoo_order(order_uuid) if not odoo_order: return None # Создаем или обновляем заказ order, created = Order.objects.get_or_create( uuid=odoo_order['uuid'], defaults={ 'name': odoo_order['name'], 'team_uuid': odoo_order['teamUuid'], 'user_id': odoo_order['userId'], 'source_location_uuid': odoo_order['sourceLocationUuid'], 'source_location_name': odoo_order['sourceLocationName'], 'destination_location_uuid': odoo_order['destinationLocationUuid'], 'destination_location_name': odoo_order['destinationLocationName'], 'status': odoo_order['status'], 'total_amount': odoo_order['totalAmount'], 'currency': odoo_order['currency'], 'notes': odoo_order.get('notes', ''), } ) # Синхронизируем связанные данные self.sync_order_lines(order, odoo_order.get('orderLines', [])) self.sync_stages(order, odoo_order.get('stages', [])) return order def sync_order_lines(self, order, odoo_lines): """Синхронизировать строки заказа""" # Удаляем старые order.order_lines.all().delete() # Создаем новые for line_data in odoo_lines: OrderLine.objects.create( uuid=line_data['uuid'], order=order, product_uuid=line_data['productUuid'], product_name=line_data['productName'], quantity=line_data['quantity'], unit=line_data['unit'], price_unit=line_data['priceUnit'], subtotal=line_data['subtotal'], currency=line_data.get('currency', 'RUB'), notes=line_data.get('notes', ''), ) def sync_stages(self, order, odoo_stages): """Синхронизировать этапы заказа""" # Удаляем старые order.stages.all().delete() # Создаем новые for stage_data in odoo_stages: stage = Stage.objects.create( uuid=stage_data['uuid'], order=order, name=stage_data['name'], sequence=stage_data['sequence'], stage_type=stage_data['stageType'], transport_type=stage_data.get('transportType', ''), source_location_name=stage_data.get('sourceLocationName', ''), destination_location_name=stage_data.get('destinationLocationName', ''), location_name=stage_data.get('locationName', ''), selected_company_uuid=stage_data.get('selectedCompany', {}).get('uuid', '') if stage_data.get('selectedCompany') else '', selected_company_name=stage_data.get('selectedCompany', {}).get('name', '') if stage_data.get('selectedCompany') else '', ) # Синхронизируем trips self.sync_trips(stage, stage_data.get('trips', [])) def sync_trips(self, stage, odoo_trips): """Синхронизировать рейсы этапа""" for trip_data in odoo_trips: Trip.objects.create( uuid=trip_data['uuid'], stage=stage, name=trip_data['name'], sequence=trip_data['sequence'], company_uuid=trip_data.get('company', {}).get('uuid', '') if trip_data.get('company') else '', company_name=trip_data.get('company', {}).get('name', '') if trip_data.get('company') else '', planned_weight=trip_data.get('plannedWeight'), weight_at_loading=trip_data.get('weightAtLoading'), weight_at_unloading=trip_data.get('weightAtUnloading'), planned_loading_date=trip_data.get('plannedLoadingDate'), actual_loading_date=trip_data.get('actualLoadingDate'), real_loading_date=trip_data.get('realLoadingDate'), planned_unloading_date=trip_data.get('plannedUnloadingDate'), actual_unloading_date=trip_data.get('actualUnloadingDate'), notes=trip_data.get('notes', ''), )