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>
115 lines
3.2 KiB
PL/PgSQL
115 lines
3.2 KiB
PL/PgSQL
-- =============================================================================
|
|
-- MICHANGARRITO - 02 FUNCTIONS
|
|
-- =============================================================================
|
|
-- Funciones utilitarias del sistema
|
|
-- =============================================================================
|
|
|
|
-- Función para actualizar updated_at automáticamente
|
|
CREATE OR REPLACE FUNCTION update_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Función para generar número de ticket
|
|
CREATE OR REPLACE FUNCTION sales.generate_ticket_number(p_tenant_id UUID)
|
|
RETURNS VARCHAR(20) AS $$
|
|
DECLARE
|
|
v_date TEXT;
|
|
v_sequence INTEGER;
|
|
v_ticket VARCHAR(20);
|
|
BEGIN
|
|
v_date := TO_CHAR(CURRENT_DATE, 'YYMMDD');
|
|
|
|
SELECT COALESCE(MAX(
|
|
CAST(SUBSTRING(ticket_number FROM 8) AS INTEGER)
|
|
), 0) + 1
|
|
INTO v_sequence
|
|
FROM sales.sales
|
|
WHERE tenant_id = p_tenant_id
|
|
AND ticket_number LIKE v_date || '-%';
|
|
|
|
v_ticket := v_date || '-' || LPAD(v_sequence::TEXT, 4, '0');
|
|
|
|
RETURN v_ticket;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Función para generar número de pedido
|
|
CREATE OR REPLACE FUNCTION orders.generate_order_number(p_tenant_id UUID)
|
|
RETURNS VARCHAR(20) AS $$
|
|
DECLARE
|
|
v_date TEXT;
|
|
v_sequence INTEGER;
|
|
v_order VARCHAR(20);
|
|
BEGIN
|
|
v_date := TO_CHAR(CURRENT_DATE, 'YYMMDD');
|
|
|
|
SELECT COALESCE(MAX(
|
|
CAST(SUBSTRING(order_number FROM 8) AS INTEGER)
|
|
), 0) + 1
|
|
INTO v_sequence
|
|
FROM orders.orders
|
|
WHERE tenant_id = p_tenant_id
|
|
AND order_number LIKE 'P' || v_date || '-%';
|
|
|
|
v_order := 'P' || v_date || '-' || LPAD(v_sequence::TEXT, 4, '0');
|
|
|
|
RETURN v_order;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Función para actualizar balance de fiados del cliente
|
|
CREATE OR REPLACE FUNCTION customers.update_customer_fiado_balance()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
UPDATE customers.customers
|
|
SET current_fiado_balance = (
|
|
SELECT COALESCE(SUM(remaining_amount), 0)
|
|
FROM customers.fiados
|
|
WHERE customer_id = COALESCE(NEW.customer_id, OLD.customer_id)
|
|
AND status IN ('pending', 'partial', 'overdue')
|
|
),
|
|
updated_at = NOW()
|
|
WHERE id = COALESCE(NEW.customer_id, OLD.customer_id);
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Función para actualizar stock después de venta
|
|
CREATE OR REPLACE FUNCTION inventory.update_stock_on_sale()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF TG_OP = 'INSERT' THEN
|
|
-- Registrar movimiento de inventario
|
|
INSERT INTO inventory.inventory_movements (
|
|
tenant_id, product_id, movement_type, quantity,
|
|
previous_stock, new_stock, reference_type, reference_id
|
|
)
|
|
SELECT
|
|
s.tenant_id,
|
|
NEW.product_id,
|
|
'sale',
|
|
-NEW.quantity,
|
|
p.stock_quantity,
|
|
p.stock_quantity - NEW.quantity,
|
|
'sale',
|
|
NEW.sale_id
|
|
FROM sales.sales s
|
|
JOIN catalog.products p ON p.id = NEW.product_id
|
|
WHERE s.id = NEW.sale_id;
|
|
|
|
-- Actualizar stock del producto
|
|
UPDATE catalog.products
|
|
SET stock_quantity = stock_quantity - NEW.quantity,
|
|
updated_at = NOW()
|
|
WHERE id = NEW.product_id;
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|