Files
MyClub/database/migrations/20250110000001_create_financial_tables.up.sql
T
Tomas Dvorak dfc079288f hot fix #1
2026-01-26 08:13:18 +01:00

260 lines
9.5 KiB
PL/PgSQL

-- Create financial management tables
-- Migration: 20250110000001_create_financial_tables
-- Budgets table
CREATE TABLE budgets (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
category VARCHAR(100),
yearly_limit DECIMAL(12,2),
monthly_limit DECIMAL(12,2),
current_spend DECIMAL(12,2) DEFAULT 0,
fiscal_year INTEGER,
start_date TIMESTAMP,
end_date TIMESTAMP,
active BOOLEAN DEFAULT true,
alert_threshold DECIMAL(5,2) DEFAULT 80,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_budgets_category ON budgets(category);
CREATE INDEX idx_budgets_fiscal_year ON budgets(fiscal_year);
CREATE INDEX idx_budgets_active ON budgets(active);
-- Sponsorships table
CREATE TABLE sponsorships (
id SERIAL PRIMARY KEY,
sponsor_name VARCHAR(255) NOT NULL,
sponsor_logo VARCHAR(500),
contact_person VARCHAR(255),
contact_email VARCHAR(255),
contact_phone VARCHAR(50),
contract_number VARCHAR(100) UNIQUE,
contract_type VARCHAR(100),
total_value DECIMAL(12,2),
payment_schedule VARCHAR(100),
currency VARCHAR(3) DEFAULT 'CZK',
start_date TIMESTAMP,
end_date TIMESTAMP,
auto_renewal BOOLEAN DEFAULT false,
renewal_notice INTEGER DEFAULT 90,
benefits TEXT,
obligations TEXT,
status VARCHAR(50) DEFAULT 'active',
last_payment_date TIMESTAMP,
next_payment_date TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_sponsorships_status ON sponsorships(status);
CREATE INDEX idx_sponsorships_contract_number ON sponsorships(contract_number);
CREATE INDEX idx_sponsorships_end_date ON sponsorships(end_date);
-- Sponsorship payments table
CREATE TABLE sponsorship_payments (
id SERIAL PRIMARY KEY,
sponsorship_id INTEGER NOT NULL REFERENCES sponsorships(id) ON DELETE CASCADE,
amount DECIMAL(12,2),
currency VARCHAR(3) DEFAULT 'CZK',
payment_date TIMESTAMP,
payment_method VARCHAR(100),
reference_number VARCHAR(255),
status VARCHAR(50) DEFAULT 'received',
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_sponsorship_payments_sponsorship_id ON sponsorship_payments(sponsorship_id);
CREATE INDEX idx_sponsorship_payments_payment_date ON sponsorship_payments(payment_date);
CREATE INDEX idx_sponsorship_payments_status ON sponsorship_payments(status);
-- Sponsorship documents table
CREATE TABLE sponsorship_documents (
id SERIAL PRIMARY KEY,
sponsorship_id INTEGER NOT NULL REFERENCES sponsorships(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
type VARCHAR(100),
file_name VARCHAR(500),
file_path VARCHAR(500),
file_size BIGINT,
mime_type VARCHAR(100),
description TEXT,
version VARCHAR(20) DEFAULT '1.0',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_sponsorship_documents_sponsorship_id ON sponsorship_documents(sponsorship_id);
CREATE INDEX idx_sponsorship_documents_type ON sponsorship_documents(type);
-- Expenses table
CREATE TABLE expenses (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
category VARCHAR(100),
subcategory VARCHAR(100),
amount DECIMAL(12,2),
currency VARCHAR(3) DEFAULT 'CZK',
vat_rate DECIMAL(5,2) DEFAULT 21,
vat_amount DECIMAL(12,2),
total_amount DECIMAL(12,2),
expense_date TIMESTAMP,
payment_method VARCHAR(100),
has_receipt BOOLEAN DEFAULT false,
receipt_data TEXT,
receipt_image VARCHAR(500),
status VARCHAR(50) DEFAULT 'pending',
approved_by INTEGER,
approved_at TIMESTAMP,
rejection_reason TEXT,
budget_id INTEGER REFERENCES budgets(id),
team_id INTEGER,
project_id INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_expenses_category ON expenses(category);
CREATE INDEX idx_expenses_status ON expenses(status);
CREATE INDEX idx_expenses_expense_date ON expenses(expense_date);
CREATE INDEX idx_expenses_budget_id ON expenses(budget_id);
CREATE INDEX idx_expenses_team_id ON expenses(team_id);
CREATE INDEX idx_expenses_created_by ON expenses(created_by);
-- Expense documents table
CREATE TABLE expense_documents (
id SERIAL PRIMARY KEY,
expense_id INTEGER NOT NULL REFERENCES expenses(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
type VARCHAR(100),
file_name VARCHAR(500),
file_path VARCHAR(500),
file_size BIGINT,
mime_type VARCHAR(100),
ocr_data TEXT,
ocr_accuracy DECIMAL(5,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_expense_documents_expense_id ON expense_documents(expense_id);
CREATE INDEX idx_expense_documents_type ON expense_documents(type);
-- Financial reports table
CREATE TABLE financial_reports (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
type VARCHAR(100),
period VARCHAR(50),
report_data TEXT,
summary TEXT,
file_path VARCHAR(500),
generated_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INTEGER,
updated_by INTEGER
);
CREATE INDEX idx_financial_reports_type ON financial_reports(type);
CREATE INDEX idx_financial_reports_period ON financial_reports(period);
CREATE INDEX idx_financial_reports_generated_at ON financial_reports(generated_at);
-- Financial settings table
CREATE TABLE financial_settings (
id SERIAL PRIMARY KEY,
default_currency VARCHAR(3) DEFAULT 'CZK',
default_vat_rate DECIMAL(5,2) DEFAULT 21,
fiscal_year_start VARCHAR(10) DEFAULT '01-01',
expense_approval_required BOOLEAN DEFAULT true,
max_expense_auto_approve DECIMAL(12,2) DEFAULT 1000,
budget_alert_enabled BOOLEAN DEFAULT true,
budget_alert_threshold DECIMAL(5,2) DEFAULT 80,
sponsorship_alert_enabled BOOLEAN DEFAULT true,
ocr_service_enabled BOOLEAN DEFAULT true,
ocr_provider VARCHAR(50) DEFAULT 'tesseract',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_by INTEGER
);
-- Insert default financial settings
INSERT INTO financial_settings (
default_currency,
default_vat_rate,
fiscal_year_start,
expense_approval_required,
max_expense_auto_approve,
budget_alert_enabled,
budget_alert_threshold,
sponsorship_alert_enabled,
ocr_service_enabled,
ocr_provider
) VALUES (
'CZK',
21.0,
'01-01',
true,
1000.00,
true,
80.0,
true,
true,
'tesseract'
);
-- Create default budget categories for a typical football club
INSERT INTO budgets (
name,
description,
category,
yearly_limit,
monthly_limit,
fiscal_year,
start_date,
end_date,
active
) VALUES
('Týmové provoz', 'Mzdy hráčů, trenérů a realizačního týmu', 'Týmové provoz', 500000.00, 41667.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true),
('Stadion a zařízení', 'Údržba stadionu, energie, voda, odpady', 'Stadion', 200000.00, 16667.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true),
('Cestování', 'Ubytování, doprava na zápasy a soustředění', 'Cestování', 150000.00, 12500.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true),
('Materiál a vybavení', 'Sportovní vybavení, dresy, míče', 'Materiál', 100000.00, 8333.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true),
('Marketing a reklama', 'Propagace, reklama, sociální sítě', 'Marketing', 80000.00, 6667.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true),
('Administrativa', 'Kancelářské potřeby, software, právní služby', 'Administrativa', 50000.00, 4167.00, 2025, '2025-01-01 00:00:00', '2025-12-31 23:59:59', true);
-- Create trigger to update updated_at column
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Apply the trigger to all financial tables
CREATE TRIGGER update_budgets_updated_at BEFORE UPDATE ON budgets FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_sponsorships_updated_at BEFORE UPDATE ON sponsorships FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_sponsorship_payments_updated_at BEFORE UPDATE ON sponsorship_payments FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_sponsorship_documents_updated_at BEFORE UPDATE ON sponsorship_documents FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_expenses_updated_at BEFORE UPDATE ON expenses FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_expense_documents_updated_at BEFORE UPDATE ON expense_documents FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_financial_reports_updated_at BEFORE UPDATE ON financial_reports FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_financial_settings_updated_at BEFORE UPDATE ON financial_settings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();