-- ============================================ -- Invoice Payment Prediction System - SQLite Schema -- Version: 1.0 (SQLite) -- ============================================ -- Drop existing tables DROP TABLE IF EXISTS predictions_log; DROP TABLE IF EXISTS business_code_aggregates; DROP TABLE IF EXISTS payment_terms_aggregates; DROP TABLE IF EXISTS customer_aggregates; DROP TABLE IF EXISTS invoices_history; -- ============================================ -- Table 1: invoices_history -- ============================================ CREATE TABLE invoices_history ( invoice_id INTEGER PRIMARY KEY, business_code TEXT NOT NULL, cust_number TEXT NOT NULL, name_customer TEXT, -- Dates (stored as TEXT in ISO format: YYYY-MM-DD HH:MM:SS) posting_date TEXT NOT NULL, document_create_date TEXT, document_create_date_alt TEXT, due_in_date TEXT, baseline_create_date TEXT, clear_date TEXT, -- Financial total_open_amount REAL NOT NULL, invoice_currency TEXT DEFAULT 'USD', -- Metadata document_type TEXT, cust_payment_terms TEXT, posting_id REAL, is_open INTEGER DEFAULT 1, business_year INTEGER, -- Computed fields days_to_clear INTEGER, days_posting_to_due INTEGER, days_create_to_posting INTEGER, days_baseline_to_posting INTEGER, is_overdue INTEGER DEFAULT 0, -- Audit created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_invoices_cust ON invoices_history(cust_number); CREATE INDEX idx_invoices_posting ON invoices_history(posting_date); CREATE INDEX idx_invoices_cleared ON invoices_history(cust_number, posting_date) WHERE clear_date IS NOT NULL; -- ============================================ -- Table 2: customer_aggregates -- ============================================ CREATE TABLE customer_aggregates ( cust_number TEXT PRIMARY KEY, cust_invoice_count INTEGER DEFAULT 0, cust_cleared_count INTEGER DEFAULT 0, cust_avg_days REAL, cust_median_days REAL, cust_std_days REAL, cust_min_days INTEGER, cust_max_days INTEGER, cust_avg_amount REAL, cust_total_amount REAL, cust_pct_overdue REAL DEFAULT 0.0, most_common_payment_term TEXT, most_common_business_code TEXT, most_common_currency TEXT, last_computed_at TEXT DEFAULT CURRENT_TIMESTAMP, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- Table 3: payment_terms_aggregates -- ============================================ CREATE TABLE payment_terms_aggregates ( cust_payment_terms TEXT PRIMARY KEY, payment_terms_avg_days REAL, payment_terms_median_days REAL, payment_terms_count INTEGER DEFAULT 0, last_computed_at TEXT DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- Table 4: business_code_aggregates -- ============================================ CREATE TABLE business_code_aggregates ( business_code TEXT PRIMARY KEY, business_avg_days REAL, business_median_days REAL, business_count INTEGER DEFAULT 0, last_computed_at TEXT DEFAULT CURRENT_TIMESTAMP ); -- ============================================ -- Table 5: predictions_log -- ============================================ CREATE TABLE predictions_log ( prediction_id INTEGER PRIMARY KEY AUTOINCREMENT, invoice_id INTEGER, cust_number TEXT NOT NULL, posting_date TEXT NOT NULL, total_open_amount REAL NOT NULL, business_code TEXT, cust_payment_terms TEXT, predicted_days_to_clear REAL NOT NULL, predicted_clear_date TEXT NOT NULL, model_version TEXT, features_json TEXT, actual_clear_date TEXT, actual_days_to_clear INTEGER, prediction_error REAL, absolute_error REAL, predicted_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_predictions_cust ON predictions_log(cust_number); CREATE INDEX idx_predictions_date ON predictions_log(predicted_at);