fina/backup/first -fina app/scripts/migrate_custom_recurring.py
2025-12-26 00:52:56 +00:00

74 lines
2.6 KiB
Python
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Database migration for custom recurring expenses feature
Adds new columns to subscriptions table for advanced scheduling
"""
import sqlite3
import sys
def migrate_database(db_path='instance/finance.db'):
"""Add new columns to subscriptions table"""
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
print("🔄 Adding custom recurring expense fields...")
# Check which columns already exist
cursor.execute("PRAGMA table_info(subscriptions)")
existing_columns = {row[1] for row in cursor.fetchall()}
# Define new columns with their SQL types
new_columns = [
('custom_interval_days', 'INTEGER'),
('start_date', 'DATE'),
('end_date', 'DATE'),
('total_occurrences', 'INTEGER'),
('occurrences_count', 'INTEGER DEFAULT 0'),
('auto_create_expense', 'BOOLEAN DEFAULT 0'),
('last_auto_created', 'DATE'),
]
# Add each column if it doesn't exist
for column_name, column_type in new_columns:
if column_name not in existing_columns:
try:
cursor.execute(f'ALTER TABLE subscriptions ADD COLUMN {column_name} {column_type}')
print(f" ✅ Added column: {column_name}")
except sqlite3.OperationalError as e:
print(f" ⚠️ Column {column_name} may already exist: {e}")
else:
print(f" Column {column_name} already exists")
# Update existing subscriptions with start dates
cursor.execute("""
UPDATE subscriptions
SET start_date = next_due_date
WHERE start_date IS NULL AND next_due_date IS NOT NULL
""")
conn.commit()
print("\n✅ Migration completed successfully!")
print("\nNew features:")
print(" • Custom frequency intervals (any number of days)")
print(" • Start and end dates for subscriptions")
print(" • Limit total number of payments")
print(" • Auto-create expenses on due date")
print(" • Track occurrence count")
return True
except sqlite3.Error as e:
print(f"\n❌ Database error: {e}")
return False
finally:
if conn:
conn.close()
if __name__ == '__main__':
db_path = sys.argv[1] if len(sys.argv) > 1 else 'instance/finance.db'
success = migrate_database(db_path)
sys.exit(0 if success else 1)