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
81 lines
3.4 KiB
SQL
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');
|