Files
SQL/scripts/verify-setup.sh
T
Alphaeus Mote aa803bd3bd Expand to Business Analytics: Add Customer, Sales, and KPI models
Major expansion from fraud detection to comprehensive business analytics:

DATABASE CHANGES:
- Renamed database from 'fraud_detection' to 'business_analytics'
- Renamed user from 'fraud_analyst' to 'data_analyst'
- Expanded from 20 to 39 tables across 4 business models

NEW MODELS (19 tables):
1. Customer Analytics (5 tables):
   - customer_segments, customer_lifetime_value, churn_predictions
   - customer_satisfaction, engagement_metrics

2. Sales & Revenue Analytics (6 tables):
   - product_catalog, sales_transactions, sales_targets
   - sales_performance, revenue_forecasts

3. KPI & Metrics (8 tables):
   - kpi_definitions, daily_metrics, monthly_summaries
   - trend_analysis, dashboard_snapshots
   - report_definitions, report_executions, data_quality_checks

DATA GENERATION:
- Extended generate_data.sh with 6 new steps (now 15 total)
- Added CLV calculations for all customers
- Added churn predictions based on transaction recency
- Added 30K customer satisfaction surveys
- Added 1M sales transactions linked to 24 products
- Added 90 days of daily KPI metrics
- Added 24 months of business summaries

SQL EXERCISES (3 new levels):
- Level 2: Customer Analytics (10 exercises + 3 challenges)
- Level 3: Sales & Revenue Analysis (12 exercises + 3 challenges)
- Level 4: KPI Dashboards & Metrics (12 exercises + 3 challenges)

DOCUMENTATION:
- Updated README.md with business analytics focus
- Updated QUICKSTART.md with new data generation steps
- Updated SETUP_COMPLETE.md with 39-table architecture
- Added DATA_MODELS.md with complete model specifications
- Added WHATS_NEW.md with migration guide

SEED DATA:
- Added 8 customer segments (VIP, High Value, etc.)
- Added 24 products across 5 categories
- Added 16 KPI definitions across 4 categories
- Added 8 standard report definitions

All changes maintain idempotency and backward compatibility with existing fraud detection functionality.
2025-10-23 14:17:12 -04:00

211 lines
7.2 KiB
Bash

#!/bin/bash
# ============================================================================
# Setup Verification Script
# ============================================================================
# Verifies that the business analytics database is properly set up
# ============================================================================
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
DB_HOST="${POSTGRES_HOST:-localhost}"
DB_PORT="${POSTGRES_PORT:-5432}"
DB_NAME="${POSTGRES_DB:-business_analytics}"
DB_USER="${POSTGRES_USER:-data_analyst}"
DB_PASSWORD="${POSTGRES_PASSWORD:-SecurePass123!}"
echo -e "${BLUE}============================================================================${NC}"
echo -e "${BLUE}Business Analytics Database - Verification${NC}"
echo -e "${BLUE}============================================================================${NC}"
echo ""
# Function to execute SQL and get result
execute_sql() {
PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -c "$1" 2>/dev/null | xargs
}
# Check 1: Docker containers
echo -e "${YELLOW}[1/10] Checking Docker containers...${NC}"
if docker ps | grep -q "business_analytics_db"; then
echo -e "${GREEN}✓ PostgreSQL container is running${NC}"
else
echo -e "${RED}✗ PostgreSQL container is not running${NC}"
echo -e "${YELLOW}Run: docker-compose up -d${NC}"
exit 1
fi
if docker ps | grep -q "business_analytics_ui"; then
echo -e "${GREEN}✓ DB-UI container is running${NC}"
else
echo -e "${RED}✗ DB-UI container is not running${NC}"
echo -e "${YELLOW}Run: docker-compose up -d${NC}"
exit 1
fi
echo ""
# Check 2: Database connectivity
echo -e "${YELLOW}[2/10] Checking database connectivity...${NC}"
if PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c '\q' 2>/dev/null; then
echo -e "${GREEN}✓ Can connect to database${NC}"
else
echo -e "${RED}✗ Cannot connect to database${NC}"
exit 1
fi
echo ""
# Check 3: Tables exist
echo -e "${YELLOW}[3/10] Checking database schema...${NC}"
table_count=$(execute_sql "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE';")
if [ "$table_count" -ge 20 ]; then
echo -e "${GREEN}✓ Schema created ($table_count tables)${NC}"
else
echo -e "${RED}✗ Schema incomplete (only $table_count tables)${NC}"
echo -e "${YELLOW}Run: ./scripts/setup-database.sh${NC}"
exit 1
fi
echo ""
# Check 4: Reference data
echo -e "${YELLOW}[4/10] Checking reference data...${NC}"
country_count=$(execute_sql "SELECT COUNT(*) FROM countries;")
category_count=$(execute_sql "SELECT COUNT(*) FROM merchant_categories;")
type_count=$(execute_sql "SELECT COUNT(*) FROM transaction_types;")
fraud_type_count=$(execute_sql "SELECT COUNT(*) FROM fraud_types;")
if [ "$country_count" -ge 40 ]; then
echo -e "${GREEN}✓ Countries loaded ($country_count)${NC}"
else
echo -e "${RED}✗ Countries not loaded${NC}"
fi
if [ "$category_count" -ge 30 ]; then
echo -e "${GREEN}✓ Merchant categories loaded ($category_count)${NC}"
else
echo -e "${RED}✗ Merchant categories not loaded${NC}"
fi
if [ "$type_count" -ge 10 ]; then
echo -e "${GREEN}✓ Transaction types loaded ($type_count)${NC}"
else
echo -e "${RED}✗ Transaction types not loaded${NC}"
fi
if [ "$fraud_type_count" -ge 15 ]; then
echo -e "${GREEN}✓ Fraud types loaded ($fraud_type_count)${NC}"
else
echo -e "${RED}✗ Fraud types not loaded${NC}"
fi
echo ""
# Check 5: Customer data
echo -e "${YELLOW}[5/10] Checking customer data...${NC}"
customer_count=$(execute_sql "SELECT COUNT(*) FROM customers;")
if [ "$customer_count" -ge 10000 ]; then
echo -e "${GREEN}✓ Customers generated ($customer_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited customer data ($customer_count)${NC}"
echo -e "${YELLOW}Run: ./data/generate_data.sh${NC}"
fi
echo ""
# Check 6: Account data
echo -e "${YELLOW}[6/10] Checking account data...${NC}"
account_count=$(execute_sql "SELECT COUNT(*) FROM accounts;")
if [ "$account_count" -ge 10000 ]; then
echo -e "${GREEN}✓ Accounts generated ($account_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited account data ($account_count)${NC}"
fi
echo ""
# Check 7: Transaction data
echo -e "${YELLOW}[7/10] Checking transaction data...${NC}"
transaction_count=$(execute_sql "SELECT COUNT(*) FROM transactions;")
if [ "$transaction_count" -ge 100000 ]; then
echo -e "${GREEN}✓ Transactions generated ($transaction_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited transaction data ($transaction_count)${NC}"
fi
echo ""
# Check 8: Fraud data
echo -e "${YELLOW}[8/10] Checking fraud detection data...${NC}"
alert_count=$(execute_sql "SELECT COUNT(*) FROM alerts;")
case_count=$(execute_sql "SELECT COUNT(*) FROM fraud_cases;")
if [ "$alert_count" -ge 100 ]; then
echo -e "${GREEN}✓ Alerts generated ($alert_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited alert data ($alert_count)${NC}"
fi
if [ "$case_count" -ge 10 ]; then
echo -e "${GREEN}✓ Fraud cases generated ($case_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited fraud case data ($case_count)${NC}"
fi
echo ""
# Check 9: Indexes
echo -e "${YELLOW}[9/10] Checking database indexes...${NC}"
index_count=$(execute_sql "SELECT COUNT(*) FROM pg_indexes WHERE schemaname = 'public';")
if [ "$index_count" -ge 20 ]; then
echo -e "${GREEN}✓ Indexes created ($index_count)${NC}"
else
echo -e "${YELLOW}⚠ Limited indexes ($index_count)${NC}"
fi
echo ""
# Check 10: DB-UI accessibility
echo -e "${YELLOW}[10/10] Checking DB-UI web interface...${NC}"
if curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q "200\|302"; then
echo -e "${GREEN}✓ DB-UI accessible at http://localhost:3000${NC}"
else
echo -e "${YELLOW}⚠ DB-UI may not be ready yet (still starting up)${NC}"
fi
echo ""
# Summary
echo -e "${BLUE}============================================================================${NC}"
echo -e "${GREEN}Verification Summary${NC}"
echo -e "${BLUE}============================================================================${NC}"
echo ""
echo -e "${YELLOW}Database Statistics:${NC}"
echo -e " Customers: ${GREEN}$customer_count${NC}"
echo -e " Accounts: ${GREEN}$account_count${NC}"
echo -e " Transactions: ${GREEN}$transaction_count${NC}"
echo -e " Alerts: ${GREEN}$alert_count${NC}"
echo -e " Fraud Cases: ${GREEN}$case_count${NC}"
echo ""
if [ "$transaction_count" -ge 100000 ]; then
echo -e "${GREEN}✓ Database is ready for SQL learning!${NC}"
echo ""
echo -e "${YELLOW}Next steps:${NC}"
echo -e "1. Access DB-UI: ${BLUE}http://localhost:3000${NC}"
echo -e "2. Start learning: ${BLUE}exercises/01-basic-queries/README.md${NC}"
echo -e "3. Quick start guide: ${BLUE}docs/QUICKSTART.md${NC}"
else
echo -e "${YELLOW}⚠ Database has minimal data${NC}"
echo ""
echo -e "${YELLOW}To generate full dataset:${NC}"
echo -e " ${BLUE}./data/generate_data.sh${NC}"
echo ""
echo -e "${YELLOW}This will generate:${NC}"
echo -e " - 100,000 customers"
echo -e " - 150,000 accounts"
echo -e " - 5,000,000 transactions"
echo -e " - 50,000+ alerts"
echo -e " - 5,000+ fraud cases"
fi
echo ""