Files
TimeTracker/fix_expense_schema.sql
Dries Peeters b353184a4f feat: implement advanced expense management with templates and navigation
Implement complete Advanced Expense Management feature set with UI templates,
database schema fixes, and reorganized navigation structure.

Features:
- Expense Categories: Full CRUD with budget tracking and visualization
- Mileage Tracking: Vehicle mileage entries with approval workflow
- Per Diem Management: Daily allowance claims with location-based rates
- Receipt OCR: Infrastructure for receipt scanning (utilities ready)

Database:
- Migration 037: Create expense_categories, mileage, per_diem_rates, per_diems tables
- Migration 038: Fix schema column name mismatches (trip_purpose→purpose, etc.)
- Add missing columns (description, odometer, rates, reimbursement tracking)
- Fix circular foreign key dependencies

Templates (11 new files):
- expense_categories/: list, form, view
- mileage/: list, form, view
- per_diem/: list, form, view, rates_list, rate_form

Navigation:
- Move Mileage and Per Diem to Expenses sub-pages (header buttons)
- Move Expense Categories to Admin menu only
- Remove expense management items from Finance menu

Fixes:
- Fix NoneType comparison error in expense categories utilization
- Handle None values safely in budget progress bars
- Resolve database column name mismatches

UI/UX:
- Responsive design with Tailwind CSS and dark mode support
- Real-time calculations for mileage amounts
- Color-coded budget utilization progress bars
- Status badges for approval workflow states
- Advanced filtering on all list views

Default data:
- 7 expense categories (Travel, Meals, Accommodation, etc.)
- 4 per diem rates (US, GB, DE, FR)
2025-10-31 06:21:35 +01:00

78 lines
4.5 KiB
SQL

-- Fix Advanced Expense Management Schema
-- Run this manually to fix the column name mismatches
-- Fix mileage table
ALTER TABLE mileage RENAME COLUMN trip_purpose TO purpose;
ALTER TABLE mileage RENAME COLUMN vehicle_registration TO license_plate;
ALTER TABLE mileage RENAME COLUMN total_amount TO calculated_amount;
-- Add missing columns to mileage
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS description TEXT;
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS start_odometer NUMERIC(10, 2);
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS end_odometer NUMERIC(10, 2);
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS distance_miles NUMERIC(10, 2);
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS rate_per_mile NUMERIC(10, 4);
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS vehicle_description VARCHAR(200);
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS is_round_trip BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS reimbursed BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS reimbursed_at TIMESTAMP;
ALTER TABLE mileage ADD COLUMN IF NOT EXISTS currency_code VARCHAR(3) NOT NULL DEFAULT 'EUR';
-- Make rate_per_km NOT NULL
ALTER TABLE mileage ALTER COLUMN rate_per_km SET NOT NULL;
ALTER TABLE mileage ALTER COLUMN rate_per_km SET DEFAULT 0.30;
-- Fix per_diem_rates table
ALTER TABLE per_diem_rates RENAME COLUMN location TO city;
ALTER TABLE per_diem_rates RENAME COLUMN valid_from TO effective_from;
ALTER TABLE per_diem_rates RENAME COLUMN valid_to TO effective_to;
ALTER TABLE per_diem_rates RENAME COLUMN country_code TO country;
-- Add missing columns to per_diem_rates
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS full_day_rate NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS half_day_rate NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS breakfast_rate NUMERIC(10, 2);
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS lunch_rate NUMERIC(10, 2);
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS dinner_rate NUMERIC(10, 2);
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS incidental_rate NUMERIC(10, 2);
ALTER TABLE per_diem_rates ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
-- Copy rate_per_day to full_day_rate and calculate half_day_rate
UPDATE per_diem_rates SET full_day_rate = rate_per_day, half_day_rate = rate_per_day * 0.5 WHERE full_day_rate = 0;
-- Drop old columns from per_diem_rates
ALTER TABLE per_diem_rates DROP COLUMN IF EXISTS rate_per_day;
ALTER TABLE per_diem_rates DROP COLUMN IF EXISTS breakfast_deduction;
ALTER TABLE per_diem_rates DROP COLUMN IF EXISTS lunch_deduction;
ALTER TABLE per_diem_rates DROP COLUMN IF EXISTS dinner_deduction;
-- Fix per_diems table
ALTER TABLE per_diems RENAME COLUMN trip_start_date TO start_date;
ALTER TABLE per_diems RENAME COLUMN trip_end_date TO end_date;
ALTER TABLE per_diems RENAME COLUMN destination_country TO country;
ALTER TABLE per_diems RENAME COLUMN destination_location TO city;
ALTER TABLE per_diems RENAME COLUMN number_of_days TO full_days;
ALTER TABLE per_diems RENAME COLUMN total_amount TO calculated_amount;
-- Add missing columns to per_diems
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS trip_purpose VARCHAR(255) NOT NULL DEFAULT 'Business trip';
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS description TEXT;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS departure_time TIME;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS return_time TIME;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS half_days INTEGER NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS total_days NUMERIC(5, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS full_day_rate NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS half_day_rate NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS breakfast_deduction NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS lunch_deduction NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS dinner_deduction NUMERIC(10, 2) NOT NULL DEFAULT 0;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS reimbursed BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS reimbursed_at TIMESTAMP;
ALTER TABLE per_diems ADD COLUMN IF NOT EXISTS approval_notes TEXT;
-- Mark migration as applied (optional)
-- UPDATE alembic_version SET version_num = '038_fix_expenses_schema';
SELECT 'Schema fixed successfully!' AS result;