Para que la aplicación funcione, necesitas configurar la base de datos. Por favor, sigue estos pasos:
-- 1. TABLA DE USUARIOS
-- Almacena la información de todos los usuarios: negocios, repartidores y administradores.
CREATE TABLE users (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMPTZ DEFAULT NOW(),
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
password TEXT NOT NULL, -- IMPORTANTE: En producción, usa Supabase Auth para manejar contraseñas seguras.
type TEXT NOT NULL, -- 'business', 'driver', 'admin'
active BOOLEAN DEFAULT TRUE,
photo TEXT,
phone TEXT,
lat DOUBLE PRECISION,
lng DOUBLE PRECISION,
connected BOOLEAN DEFAULT FALSE,
-- Campos de Negocio
ownerName TEXT,
address TEXT,
phone1 TEXT,
phone2 TEXT,
businessType TEXT,
subscription JSONB, -- { "plan": "Estándar", "deliveriesUsed": 10, ... }
-- Campos de Repartidor
vehicleBrand TEXT,
vehicleModel TEXT,
vehiclePlates TEXT,
vehicleColor TEXT,
vehicle TEXT, -- Descripción formateada del vehículo
paymentInfo JSONB -- { "cardNumber": "...", "cardHolder": "...", "expiryDate": "..." }
);
-- 2. TABLA DE PEDIDOS
-- Almacena todos los pedidos creados por los negocios.
CREATE TABLE orders (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
created_at TIMESTAMPTZ DEFAULT NOW(),
businessId BIGINT REFERENCES users(id) ON DELETE SET NULL,
driverId BIGINT REFERENCES users(id) ON DELETE SET NULL,
pickupAddress TEXT,
address TEXT NOT NULL,
customerName TEXT,
customerPhone TEXT,
description TEXT,
cost NUMERIC,
tip NUMERIC,
estimatedTime TEXT,
payment NUMERIC,
status TEXT DEFAULT 'Pendiente', -- 'Pendiente', 'Asignado', 'En camino', 'Entregado', 'Completado'
rating INT,
comment TEXT,
cashPaymentStatus TEXT, -- 'pending_settlement', 'settled'
isPayAsYouGo BOOLEAN,
isPaid BOOLEAN,
serviceFee NUMERIC
);
-- 3. TABLA DE CHATS
-- Almacena la metadata de cada conversación.
CREATE TABLE chats (
id TEXT PRIMARY KEY, -- Ej: 'order_101' o 'support_3'
created_at TIMESTAMPTZ DEFAULT NOW(),
type TEXT, -- 'order' o 'support'
participants BIGINT[],
orderId BIGINT,
title TEXT
);
-- 4. TABLA DE MENSAJES
-- Almacena cada mensaje de cada chat.
CREATE TABLE messages (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
chat_id TEXT REFERENCES chats(id) ON DELETE CASCADE,
senderId BIGINT,
text TEXT,
timestamp TIMESTAMPTZ DEFAULT NOW()
);
-- 5. TABLA DE PAGOS (A REPARTIDORES)
-- Registra los pagos que el administrador hace a los repartidores.
CREATE TABLE payments (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
paymentDate TIMESTAMPTZ DEFAULT NOW(),
driverId BIGINT REFERENCES users(id) ON DELETE SET NULL,
adminId BIGINT REFERENCES users(id) ON DELETE SET NULL,
amount NUMERIC
);
-- 6. TABLA DE TRANSACCIONES
-- Un registro financiero de todos los ingresos y egresos de la plataforma.
CREATE TABLE transactions (
id TEXT PRIMARY KEY,
date TIMESTAMPTZ DEFAULT NOW(),
type TEXT, -- 'income' o 'expense'
description TEXT,
amount NUMERIC,
userId BIGINT REFERENCES users(id) ON DELETE SET NULL
);
-- 7. HABILITAR PUBLICACIONES EN TIEMPO REAL (REPLICATION)
-- Esto es crucial para que la app se actualice automáticamente.
-- Asegúrate de que la publicación 'supabase_realtime' exista y luego añade las tablas.
ALTER PUBLICATION supabase_realtime ADD TABLE users, orders, chats, messages, payments, transactions;
-- 8. POLÍTICAS DE SEGURIDAD (RLS) - ¡IMPORTANTE!
-- Estas políticas permiten que cualquier persona con la clave 'anon' pueda LEER los datos.
-- Para una aplicación en producción, deberías crear políticas más restrictivas.
-- Ve a la sección 'Authentication' -> 'Policies' en tu dashboard de Supabase para habilitar RLS en cada tabla.
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all users" ON users FOR SELECT USING (true);
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all orders" ON orders FOR SELECT USING (true);
ALTER TABLE chats ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all chats" ON chats FOR SELECT USING (true);
ALTER TABLE messages ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all messages" ON messages FOR SELECT USING (true);
ALTER TABLE payments ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all payments" ON payments FOR SELECT USING (true);
ALTER TABLE transactions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public can read all transactions" ON transactions FOR SELECT USING (true);
-- También necesitamos permitir que la aplicación INSERTE y ACTUALICE datos.
-- Estas políticas son muy permisivas y deberían ajustarse en producción.
CREATE POLICY "Allow authenticated users to insert and update" ON users
FOR ALL USING (auth.role() = 'authenticated');
CREATE POLICY "Allow authenticated users to insert and update" ON orders
FOR ALL USING (auth.role() = 'authenticated');
CREATE POLICY "Allow authenticated users to insert and update" ON chats
FOR ALL USING (auth.role() = 'authenticated');
CREATE POLICY "Allow authenticated users to insert and update" ON messages
FOR ALL USING (auth.role() = 'authenticated');
CREATE POLICY "Allow authenticated users to insert and update" ON payments
FOR ALL USING (auth.role() = 'authenticated');
CREATE POLICY "Allow authenticated users to insert and update" ON transactions
FOR ALL USING (auth.role() = 'authenticated');
-- 9. INSERTAR DATOS INICIALES (opcional, para pruebas)
-- Inserta un usuario administrador para que puedas iniciar sesión.
INSERT INTO users (name, email, password, type)
VALUES ('Admin', 'admin', '1234', 'admin');
"{{ comment.comment }}"