Marketplace móvil para negocios locales mexicanos. Estructura inicial: - apps/backend (NestJS API) - apps/frontend (React Web) - apps/mobile (Expo/React Native) - apps/mcp-server (Claude MCP Server) - apps/whatsapp-service (WhatsApp Business API) - database/ (PostgreSQL DDL) - docs/ (Documentación) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
107 lines
3.4 KiB
SQL
107 lines
3.4 KiB
SQL
-- =============================================================================
|
|
-- MICHANGARRITO - 08 CUSTOMERS
|
|
-- =============================================================================
|
|
-- Clientes y sistema de fiados
|
|
-- =============================================================================
|
|
|
|
-- Clientes
|
|
CREATE TABLE IF NOT EXISTS customers.customers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
|
|
name VARCHAR(100) NOT NULL,
|
|
phone VARCHAR(20),
|
|
email VARCHAR(100),
|
|
|
|
address TEXT,
|
|
address_reference TEXT,
|
|
latitude DECIMAL(10,8),
|
|
longitude DECIMAL(11,8),
|
|
|
|
fiado_enabled BOOLEAN DEFAULT true,
|
|
fiado_limit DECIMAL(10,2),
|
|
current_fiado_balance DECIMAL(10,2) DEFAULT 0,
|
|
|
|
total_purchases DECIMAL(12,2) DEFAULT 0,
|
|
purchase_count INTEGER DEFAULT 0,
|
|
last_purchase_at TIMESTAMPTZ,
|
|
|
|
whatsapp_opt_in BOOLEAN DEFAULT false,
|
|
|
|
notes TEXT,
|
|
status VARCHAR(20) DEFAULT 'active',
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_customers_tenant ON customers.customers(tenant_id);
|
|
CREATE INDEX idx_customers_phone ON customers.customers(tenant_id, phone);
|
|
CREATE INDEX idx_customers_name ON customers.customers USING gin(to_tsvector('spanish', name));
|
|
|
|
CREATE TRIGGER update_customers_updated_at
|
|
BEFORE UPDATE ON customers.customers
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- Actualizar FK en sales
|
|
ALTER TABLE sales.sales
|
|
ADD CONSTRAINT fk_sales_customer
|
|
FOREIGN KEY (customer_id) REFERENCES customers.customers(id);
|
|
|
|
-- Fiados
|
|
CREATE TABLE IF NOT EXISTS customers.fiados (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
|
|
customer_id UUID NOT NULL REFERENCES customers.customers(id) ON DELETE CASCADE,
|
|
sale_id UUID REFERENCES sales.sales(id),
|
|
|
|
original_amount DECIMAL(10,2) NOT NULL,
|
|
paid_amount DECIMAL(10,2) DEFAULT 0,
|
|
remaining_amount DECIMAL(10,2) NOT NULL,
|
|
|
|
due_date DATE,
|
|
status VARCHAR(20) DEFAULT 'pending',
|
|
|
|
description TEXT,
|
|
|
|
last_reminder_at TIMESTAMPTZ,
|
|
reminder_count INTEGER DEFAULT 0,
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_fiados_tenant ON customers.fiados(tenant_id);
|
|
CREATE INDEX idx_fiados_customer ON customers.fiados(customer_id);
|
|
CREATE INDEX idx_fiados_status ON customers.fiados(status);
|
|
|
|
CREATE TRIGGER update_fiados_updated_at
|
|
BEFORE UPDATE ON customers.fiados
|
|
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
|
|
|
|
-- Trigger para actualizar balance del cliente
|
|
CREATE TRIGGER update_fiado_balance
|
|
AFTER INSERT OR UPDATE OR DELETE ON customers.fiados
|
|
FOR EACH ROW EXECUTE FUNCTION customers.update_customer_fiado_balance();
|
|
|
|
-- Actualizar FK en sales para fiado
|
|
ALTER TABLE sales.sales
|
|
ADD CONSTRAINT fk_sales_fiado
|
|
FOREIGN KEY (fiado_id) REFERENCES customers.fiados(id);
|
|
|
|
-- Pagos de fiados
|
|
CREATE TABLE IF NOT EXISTS customers.fiado_payments (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
fiado_id UUID NOT NULL REFERENCES customers.fiados(id) ON DELETE CASCADE,
|
|
|
|
amount DECIMAL(10,2) NOT NULL,
|
|
payment_method VARCHAR(20) NOT NULL,
|
|
|
|
notes TEXT,
|
|
|
|
created_by UUID REFERENCES auth.users(id),
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX idx_fiado_payments_fiado ON customers.fiado_payments(fiado_id);
|