Para que la aplicación funcione, necesitas configurar la base de datos. Por favor, sigue estos pasos:

  1. Ve a tu proyecto de Supabase: IslaExpress Project.
  2. En el menú de la izquierda, ve a SQL Editor.
  3. Haz click en New query.
  4. Copia el siguiente código SQL, pégalo en el editor y haz click en RUN. Esto creará todas las tablas necesarias.

-- 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');
                        

¡Importante!

Este esquema no utiliza el sistema de autenticación de Supabase y almacena contraseñas en texto plano, lo cual NO es seguro para una aplicación real. Para un entorno de producción, deberías implementar Supabase Auth para un manejo seguro de usuarios y contraseñas.

También, considera configurar Row Level Security (RLS) en tus tablas para controlar quién puede ver o modificar los datos. Sin RLS, cualquier persona con la clave de API (anon key) podría acceder a toda tu base de datos.

Bienvenido a IslaExpress

Nuevo Pedido

Estado de tu Suscripción

Plan: {{ getPlanDetails(currentUser.subscription.plan).name }}

Entregas: {{ currentUser.subscription.deliveriesUsed }} / {{ getPlanDetails(currentUser.subscription.plan).deliveries }}

Has usado {{ extraDeliveries }} entregas adicionales a ${{ getPlanDetails(currentUser.subscription.plan).extra.toFixed(2) }} c/u.

No tienes una suscripción activa. Estás usando el modo Pago por Envío.

Has realizado {{ payAsYouGoStats.unpaidCount }} de 2 envíos disponibles.

Debes un total de ${{ payAsYouGoStats.debt.toFixed(2) }}.

Repartidores Cercanos

Historial de Pedidos

Detalles del Pedido Repartidor Estado Acciones

Aún no has creado ningún pedido.

Empieza creando uno desde el panel "Nuevo Pedido".

{{order.address}}

Cliente: {{ order.customerName }} | Costo: ${{order.cost}}

{{ formatDate(order.createdAt) }}

{{ order.driverName }} {{ order.driverRating.toFixed(1) }}

Sin asignar

{{order.status}}

Mapa de Entregas

Pedidos Disponibles

No hay pedidos disponibles.

De: {{order.pickupAddress}}

A: {{order.address}}

Pago: ${{order.payment.toFixed(2)}} (Tarifa: $19.00 + ${{ order.tip ? order.tip.toFixed(2) : '0.00' }} propina)

Acción Requerida

Tienes cobros en efectivo pendientes de entregar a los negocios. Debes liquidarlos antes de poder tomar nuevos pedidos.

Estás Desconectado

Conéctate para ver y aceptar nuevos pedidos.

Entrega Actual

Recogida: {{currentDelivery.pickupAddress}}

Entrega: {{currentDelivery.address}}

Cliente: {{ currentDelivery.customerName }} ({{ currentDelivery.customerPhone }})

Monto a cobrar: ${{ currentDelivery.cost.toFixed(2) }}

Estado: {{currentDelivery.status}}

Pagos Pendientes a Negocios

No tienes pagos en efectivo pendientes.

Negocio: {{ order.businessName }}

Pedido a: {{ order.address }}

Monto a entregar: ${{ order.cost.toFixed(2) }}

Pendiente

Historial de Entregas

No tienes entregas completadas.

Negocio: {{order.businessName}}

Recogida: {{order.pickupAddress}}

Entrega: {{order.address}}

Cliente: {{ order.customerName }} ({{ order.customerPhone }})

Ganancia: ${{order.payment ? order.payment.toFixed(2) : '0.00'}}

{{ formatDate(order.createdAt) }}

{{order.status}}

Pedidos Totales

{{stats.totalOrders}}

Negocios Activos

{{stats.activeBusinesses}}

Repartidores Activos

{{stats.activeDrivers}}

Ganancias Plataforma

${{stats.platformEarnings.toFixed(2)}}

Gestión de Usuarios

{{user.name}} - {{user.type}}

Pagos a Repartidores

{{ driver.name }}

Balance: ${{ driver.balance.toFixed(2) }} Tarjeta no registrada

Historial General de Pedidos

Detalles del Pedido Negocio Repartidor Estado Acciones

No se ha creado ningún pedido en la plataforma.

Pedido #{{order.id}} a {{order.address}}

Cliente: {{ order.customerName }} | Costo: ${{order.cost}}

{{ formatDate(order.createdAt) }}

{{ order.businessName }}

{{ order.driverName }}

Sin asignar

{{order.status}}

Administración Financiera

Historial de Transacciones

No hay transacciones registradas.

{{ tx.description }}

Usuario: {{ getUserName(tx.userId) }}

{{ formatDate(tx.date) }}

{{ tx.type === 'income' ? '+' : '-' }}${{ Math.abs(tx.amount).toFixed(2) }}

Mapa de Repartidores Activos

Repartidores Conectados ({{ connectedDrivers.length }})

No hay repartidores conectados en este momento.

{{ driver.name }}

{{ driver.vehicle || 'Vehículo no registrado' }}

Chats de Soporte

No hay chats de soporte activos.

{{ getUserName(chat.participants[0]) }}

{{ getChatSnippet(chat.messages) }}