Files
Autoparts-DB/pos/migrations/v2.6_bnpl_erp.sql
Nexus Dev 9ff3dc4c8b FASE 4-5-6: Infraestructura, CRM, Service Orders, Notificaciones, Ahorro, Logistica, API Publica
FASE 4:
- Redis cache de stock con fallback graceful
- Multi-moneda (MXN/USD) con contabilidad en MXN
- Proveedores y ordenes de compra completo
- Meilisearch 1.5M+ partes indexadas
- Metabase KPIs con dashboard auto-generado

FASE 5:
- CRM mejorado: activities, tags, loyalty program, analytics
- Imagenes de partes: upload, resize, thumbnails WebP
- Ordenes de servicio Kanban: received->diagnosis->repair->ready->delivered
- Garantias/RMA, alertas de reorden, multi-sucursal
- Stubs BNPL (APLAZO) y ERP Sync (Aspel/Contpaqi)

FASE 6:
- Notificaciones automaticas: push/WhatsApp/email/in-app
- Reportes de ahorro vs retail_price
- Logistica + tracking: DHL, FedEx, Estafeta, 99min, Uber
- API Publica: API keys, rate limiting, catalog search

Migraciones: v1.9-v3.0
Tests: 93/93 pasando
Backup: nexus_backup_20260427_045859.tar.gz
2026-04-27 05:23:30 +00:00

81 lines
3.4 KiB
SQL

-- v2.6 BNPL (APLAZO) and ERP Sync stubs
-- BNPL / External credit provider transactions
CREATE TABLE IF NOT EXISTS bnpl_transactions (
id SERIAL PRIMARY KEY,
tenant_id INTEGER NOT NULL,
customer_id INTEGER REFERENCES customers(id),
sale_id INTEGER REFERENCES sales(id),
provider VARCHAR(50) NOT NULL DEFAULT 'aplazo', -- 'aplazo', 'kueski', 'clip'
provider_transaction_id VARCHAR(200),
amount NUMERIC(12,2) NOT NULL,
status VARCHAR(30) DEFAULT 'pending', -- pending, approved, rejected, funded, cancelled, refunded
installment_count INTEGER DEFAULT 1,
installment_amount NUMERIC(12,2),
customer_fee NUMERIC(12,2) DEFAULT 0,
merchant_fee NUMERIC(12,2) DEFAULT 0,
provider_response JSONB,
webhook_payload JSONB,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_bnpl_sale ON bnpl_transactions(sale_id);
CREATE INDEX IF NOT EXISTS idx_bnpl_customer ON bnpl_transactions(customer_id);
CREATE INDEX IF NOT EXISTS idx_bnpl_status ON bnpl_transactions(status);
-- ERP Sync configurations per tenant
CREATE TABLE IF NOT EXISTS erp_sync_configs (
id SERIAL PRIMARY KEY,
tenant_id INTEGER NOT NULL,
erp_type VARCHAR(50) NOT NULL, -- 'aspel_sae', 'contpaqi', 'sap_b1', 'odoo'
is_active BOOLEAN DEFAULT FALSE,
api_endpoint VARCHAR(500),
api_username VARCHAR(200),
api_password_encrypted TEXT,
database_name VARCHAR(200),
company_code VARCHAR(50),
sync_direction VARCHAR(20) DEFAULT 'bidirectional', -- 'to_erp', 'from_erp', 'bidirectional'
sync_inventory BOOLEAN DEFAULT FALSE,
sync_sales BOOLEAN DEFAULT FALSE,
sync_customers BOOLEAN DEFAULT FALSE,
sync_frequency_minutes INTEGER DEFAULT 60,
last_sync_at TIMESTAMPTZ,
last_sync_error TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_erp_config_tenant ON erp_sync_configs(tenant_id, erp_type);
-- ERP Sync logs (each sync run)
CREATE TABLE IF NOT EXISTS erp_sync_logs (
id SERIAL PRIMARY KEY,
config_id INTEGER REFERENCES erp_sync_configs(id),
sync_type VARCHAR(50) NOT NULL, -- 'inventory', 'sales', 'customers', 'full'
direction VARCHAR(20) NOT NULL, -- 'to_erp', 'from_erp'
status VARCHAR(20) DEFAULT 'running', -- running, success, partial, failed
records_processed INTEGER DEFAULT 0,
records_failed INTEGER DEFAULT 0,
error_message TEXT,
details JSONB,
started_at TIMESTAMPTZ DEFAULT NOW(),
completed_at TIMESTAMPTZ
);
CREATE INDEX IF NOT EXISTS idx_erp_logs_config ON erp_sync_logs(config_id, started_at DESC);
-- ERP Sync queue (pending items to sync)
CREATE TABLE IF NOT EXISTS erp_sync_queue (
id SERIAL PRIMARY KEY,
config_id INTEGER NOT NULL REFERENCES erp_sync_configs(id),
entity_type VARCHAR(50) NOT NULL, -- 'inventory', 'sale', 'customer'
entity_id INTEGER NOT NULL,
action VARCHAR(20) NOT NULL, -- 'create', 'update', 'delete'
priority INTEGER DEFAULT 5, -- 1=urgent, 10=low
status VARCHAR(20) DEFAULT 'pending', -- pending, processing, completed, failed
retry_count INTEGER DEFAULT 0,
last_error TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
processed_at TIMESTAMPTZ
);
CREATE INDEX IF NOT EXISTS idx_erp_queue_pending ON erp_sync_queue(config_id, status, priority, created_at)
WHERE status IN ('pending', 'failed');