File size: 5,013 Bytes
f810b2f
 
 
 
 
 
 
 
1b3cdee
f810b2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b3cdee
f810b2f
1b3cdee
 
 
 
 
 
 
 
f810b2f
1b3cdee
 
 
 
 
 
 
 
 
f810b2f
 
 
 
 
 
 
 
 
 
 
 
 
 
1b3cdee
 
f810b2f
 
 
 
 
 
 
 
 
1b3cdee
f810b2f
 
 
1b3cdee
f810b2f
 
 
1b3cdee
f810b2f
 
 
 
 
 
 
 
 
 
 
 
 
1b3cdee
f810b2f
 
 
 
1b3cdee
f810b2f
 
1b3cdee
 
f810b2f
 
 
 
 
1b3cdee
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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")
        
        # Validar que las credenciales existan
        if not self.supabase_url or not self.supabase_key:
            error_msg = (
                "SUPABASE_URL y SUPABASE_KEY deben estar definidos como variables de entorno "
                "o proporcionados como parámetros. "
                f"URL encontrada: {'✓' if self.supabase_url else '✗'}, "
                f"KEY encontrada: {'✓' if self.supabase_key else '✗'}"
            )
            logger.error(error_msg)
            raise ValueError(error_msg)
        
        try:
            # Inicializar cliente
            self.supabase = create_client(self.supabase_url, self.supabase_key)
            logger.info("Cliente Supabase inicializado correctamente")
                 
        except Exception as e:
            logger.error(f"Error al inicializar cliente Supabase: {e}")
            raise
         
    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()
            
            logger.info(f"Iniciando envío de orden {order_dict['order_id']} a Supabase")
            
            # 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
            logger.debug(f"Insertando orden principal: {order_data}")
            order_response = self.supabase.table("orders").insert(order_data).execute()
            
            if not order_response.data:
                raise Exception("Error al insertar orden en Supabase - respuesta vacía")
            
            # Obtener el ID de la orden insertada
            db_order_id = order_response.data[0]["id"]
            logger.info(f"Orden insertada con ID de base de datos: {db_order_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:
                logger.debug(f"Insertando {len(items_to_insert)} elementos de la orden")
                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
                    logger.error("Fallo al insertar elementos, eliminando 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"Insertados {len(items_response.data)} elementos correctamente")
            
            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,
                "items_count": len(items_to_insert)
            }
            
        except Exception as e:
            logger.error(f"Error al enviar orden a Supabase: {str(e)}")
            return {
                "success": False,
                "error": str(e)
            }