feat: Implement modular plugin architecture
- Convert invcount to self-contained module - Add Module Manager for install/uninstall - Create module_registry database table - Support hot-reloading of modules - Move data imports into invcount module - Update all templates and routes to new structure Version bumped to 0.16.0
This commit is contained in:
138
modules/conssheets/migrations.py
Normal file
138
modules/conssheets/migrations.py
Normal file
@@ -0,0 +1,138 @@
|
||||
"""
|
||||
Consumption Sheets Module - Database Migrations
|
||||
Contains schema for all consumption tracking tables
|
||||
"""
|
||||
|
||||
def get_schema():
|
||||
"""
|
||||
Returns the complete schema SQL for this module.
|
||||
This is used when the module is installed.
|
||||
"""
|
||||
return """
|
||||
-- cons_processes - Master list of consumption sheet process types
|
||||
CREATE TABLE IF NOT EXISTS cons_processes (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
process_key TEXT UNIQUE NOT NULL,
|
||||
process_name TEXT NOT NULL,
|
||||
template_file BLOB,
|
||||
template_filename TEXT,
|
||||
rows_per_page INTEGER DEFAULT 30,
|
||||
detail_start_row INTEGER DEFAULT 10,
|
||||
detail_end_row INTEGER,
|
||||
page_height INTEGER,
|
||||
print_start_col TEXT DEFAULT 'A',
|
||||
print_end_col TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
created_by INTEGER NOT NULL,
|
||||
is_active INTEGER DEFAULT 1,
|
||||
FOREIGN KEY (created_by) REFERENCES Users(user_id)
|
||||
);
|
||||
|
||||
-- cons_process_fields - Custom field definitions for each process
|
||||
CREATE TABLE IF NOT EXISTS cons_process_fields (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
process_id INTEGER NOT NULL,
|
||||
table_type TEXT NOT NULL CHECK(table_type IN ('header', 'detail')),
|
||||
field_name TEXT NOT NULL,
|
||||
field_label TEXT NOT NULL,
|
||||
field_type TEXT NOT NULL CHECK(field_type IN ('TEXT', 'INTEGER', 'REAL', 'DATE', 'DATETIME')),
|
||||
max_length INTEGER,
|
||||
is_required INTEGER DEFAULT 0,
|
||||
is_duplicate_key INTEGER DEFAULT 0,
|
||||
is_active INTEGER DEFAULT 1,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
excel_cell TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (process_id) REFERENCES cons_processes(id)
|
||||
);
|
||||
|
||||
-- cons_sessions - Staff scanning sessions
|
||||
CREATE TABLE IF NOT EXISTS cons_sessions (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
process_id INTEGER NOT NULL,
|
||||
created_by INTEGER NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
status TEXT DEFAULT 'active' CHECK(status IN ('active', 'archived')),
|
||||
FOREIGN KEY (process_id) REFERENCES cons_processes(id),
|
||||
FOREIGN KEY (created_by) REFERENCES Users(user_id)
|
||||
);
|
||||
|
||||
-- cons_session_header_values - Flexible storage for header field values
|
||||
CREATE TABLE IF NOT EXISTS cons_session_header_values (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
session_id INTEGER NOT NULL,
|
||||
field_id INTEGER NOT NULL,
|
||||
field_value TEXT,
|
||||
FOREIGN KEY (session_id) REFERENCES cons_sessions(id),
|
||||
FOREIGN KEY (field_id) REFERENCES cons_process_fields(id)
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_cons_process_fields_process ON cons_process_fields(process_id, table_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_cons_process_fields_active ON cons_process_fields(process_id, is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_cons_sessions_process ON cons_sessions(process_id, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_cons_sessions_user ON cons_sessions(created_by, status);
|
||||
"""
|
||||
|
||||
|
||||
def get_migrations():
|
||||
"""
|
||||
Returns list of migrations specific to this module.
|
||||
Format: [(version, name, up_function), ...]
|
||||
"""
|
||||
|
||||
def migration_001_add_is_duplicate_key(conn):
|
||||
"""Add is_duplicate_key column to cons_process_fields"""
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check if column exists
|
||||
cursor.execute('PRAGMA table_info(cons_process_fields)')
|
||||
columns = [row[1] for row in cursor.fetchall()]
|
||||
|
||||
if 'is_duplicate_key' not in columns:
|
||||
cursor.execute('ALTER TABLE cons_process_fields ADD COLUMN is_duplicate_key INTEGER DEFAULT 0')
|
||||
print(" Added is_duplicate_key column to cons_process_fields")
|
||||
|
||||
def migration_002_add_detail_end_row(conn):
|
||||
"""Add detail_end_row column to cons_processes"""
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute('PRAGMA table_info(cons_processes)')
|
||||
columns = [row[1] for row in cursor.fetchall()]
|
||||
|
||||
if 'detail_end_row' not in columns:
|
||||
cursor.execute('ALTER TABLE cons_processes ADD COLUMN detail_end_row INTEGER')
|
||||
print(" Added detail_end_row column to cons_processes")
|
||||
|
||||
def migration_003_add_page_height(conn):
|
||||
"""Add page_height column to cons_processes"""
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute('PRAGMA table_info(cons_processes)')
|
||||
columns = [row[1] for row in cursor.fetchall()]
|
||||
|
||||
if 'page_height' not in columns:
|
||||
cursor.execute('ALTER TABLE cons_processes ADD COLUMN page_height INTEGER')
|
||||
print(" Added page_height column to cons_processes")
|
||||
|
||||
def migration_004_add_print_columns(conn):
|
||||
"""Add print_start_col and print_end_col to cons_processes"""
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute('PRAGMA table_info(cons_processes)')
|
||||
columns = [row[1] for row in cursor.fetchall()]
|
||||
|
||||
if 'print_start_col' not in columns:
|
||||
cursor.execute('ALTER TABLE cons_processes ADD COLUMN print_start_col TEXT DEFAULT "A"')
|
||||
print(" Added print_start_col column to cons_processes")
|
||||
|
||||
if 'print_end_col' not in columns:
|
||||
cursor.execute('ALTER TABLE cons_processes ADD COLUMN print_end_col TEXT')
|
||||
print(" Added print_end_col column to cons_processes")
|
||||
|
||||
return [
|
||||
(1, 'add_is_duplicate_key', migration_001_add_is_duplicate_key),
|
||||
(2, 'add_detail_end_row', migration_002_add_detail_end_row),
|
||||
(3, 'add_page_height', migration_003_add_page_height),
|
||||
(4, 'add_print_columns', migration_004_add_print_columns),
|
||||
]
|
||||
Reference in New Issue
Block a user