File size: 3,884 Bytes
f810b2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from supabase import create_client
import os
from dotenv import load_dotenv
from typing import Dict, List, Any, Optional
import json
import logging

from utils.classes import Order
# Configurar logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class SupabaseOrderManager:
    def __init__(self, url: Optional[str] = None, key: Optional[str] = None):
        """
        Inicializa el gestor de órdenes con Supabase.
        
        Args:
            url: URL de Supabase (opcional, por defecto usa variables de entorno)
            key: Clave de API de Supabase (opcional, por defecto usa variables de entorno)
        """
        # Cargar variables de entorno
        load_dotenv()
        
        # Usar parámetros proporcionados o variables de entorno
        self.supabase_url = url or os.getenv("SUPABASE_URL")
        self.supabase_key = key or os.getenv("SUPABASE_KEY")
        
        if not self.supabase_url or not self.supabase_key:
            raise ValueError("SUPABASE_URL y SUPABASE_KEY deben estar definidos como variables de entorno o proporcionados como parámetros")
        
        # Inicializar cliente
        self.supabase = create_client(self.supabase_url, self.supabase_key)
        logger.info("Cliente Supabase inicializado correctamente")
    
    async def send_order(self, order: Order) -> Dict[str, Any]:
        """
        Envía una orden a Supabase.
        
        Args:
            order: Objeto Order del sistema del restaurante
            
        Returns:
            Diccionario con el resultado de la operación
        """
        try:
            # Convertir el objeto Order a un diccionario
            order_dict = order.to_dict()
            
            # 1. Insertar la orden principal
            order_data = {
                "order_id": order_dict["order_id"],
                "table_number": str(order_dict["table_number"]),
                "special_instructions": order_dict["special_instructions"],
                "status": "pending"
            }
            
            # Realizar la inserción de la orden
            order_response = self.supabase.table("orders").insert(order_data).execute()
            
            if not order_response.data:
                raise Exception("Error al insertar orden en Supabase")
            
            # Obtener el ID de la orden insertada
            db_order_id = order_response.data[0]["id"]
            
            # 2. Insertar los elementos de la orden
            items_to_insert = []
            for item in order_dict["items"]:
                items_to_insert.append({
                    "order_id": db_order_id,
                    "name": item["name"],
                    "quantity": item.get("quantity", 1),
                    "variations": item.get("variations", "")
                })
            
            # Realizar la inserción de los elementos
            if items_to_insert:
                items_response = self.supabase.table("order_items").insert(items_to_insert).execute()
                
                if not items_response.data:
                    # Si falla la inserción de items, eliminamos la orden para mantener consistencia
                    self.supabase.table("orders").delete().eq("id", db_order_id).execute()
                    raise Exception("Error al insertar elementos de la orden en Supabase")
            
            logger.info(f"Orden {order_dict['order_id']} enviada correctamente a Supabase")
            return {
                "success": True,
                "order_id": order_dict["order_id"],
                "database_id": db_order_id
            }
            
        except Exception as e:
            logger.error(f"Error al enviar orden a Supabase: {str(e)}")
            return {
                "success": False,
                "error": str(e)
            }