# Database Management - Labels Module Table Coverage Check
## Summary
✅ **All database management functions properly include the `order_for_labels` table from the labels module**
The database management page uses **dynamic table queries** from `information_schema.TABLES`, which automatically includes all database tables, including the newly created `order_for_labels` table.
---
## Table Status
### order_for_labels Table
- **Module:** Labels
- **Purpose:** Stores label printing queue for production orders
- **Status:** ✅ Properly created in database initialization
- **Created in:** `initialize_db.py:399-444`
- **First Use:** Labels module (`/labels` routes)
**Table Schema:**
```sql
CREATE TABLE IF NOT EXISTS order_for_labels (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
comanda_productie VARCHAR(50) NOT NULL,
cod_articol VARCHAR(50),
descr_com_prod TEXT,
cantitate DECIMAL(10, 2),
com_achiz_client VARCHAR(50),
nr_linie_com_client VARCHAR(50),
customer_name VARCHAR(255),
customer_article_number VARCHAR(100),
open_for_order TINYINT(1) DEFAULT 1,
line_number INT,
printed_labels TINYINT(1) DEFAULT 0,
data_livrara DATE,
dimensiune VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_comanda_productie (comanda_productie),
INDEX idx_printed_labels (printed_labels),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
```
---
## Database Management Functions Review
### 1. ✅ Database Management Page - `database_management()`
**Location:** `app/modules/settings/routes.py:596-634`
**URL:** `GET /settings/database-management`
```python
# Get list of tables
cursor.execute("""
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME
""")
tables = [{'name': row[0], 'rows': row[1]} for row in cursor.fetchall()]
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Queries `information_schema.TABLES` dynamically
- Gets ALL tables in the database
---
### 2. ✅ Get Database Tables API - `get_database_tables()`
**Location:** `app/modules/settings/routes.py:841-866`
**URL:** `GET /settings/api/database/tables`
```python
# Get list of all tables with their row counts
cursor.execute("""
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME
""")
tables = [{'name': row[0], 'rows': row[1] or 0} for row in cursor.fetchall()]
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Used by the truncate table dropdown
- Returns all tables dynamically
**Frontend:** `database_management.html:1065-1103`
```javascript
function loadDatabaseTables() {
fetch('{{ url_for("settings.get_database_tables") }}')
.then(response => response.json())
.then(data => {
if (data.success && data.tables && data.tables.length > 0) {
const select = document.getElementById('truncate-table-select');
// Clear existing options except the first placeholder
select.innerHTML = '';
// Add all tables as options
data.tables.forEach(table => {
const option = document.createElement('option');
option.value = table.name;
option.textContent = `${table.name} (${table.rows} rows)`;
select.appendChild(option);
});
}
});
}
```
---
### 3. ✅ Truncate Table - `truncate_table()`
**Location:** `app/modules/settings/routes.py:869-929`
**URL:** `POST /settings/api/database/truncate`
```python
# Validate table name
cursor.execute("""
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s
""", (table,))
if not cursor.fetchone():
cursor.close()
return jsonify({'error': 'Table not found'}), 404
# Special handling for warehouse_locations
if table == 'warehouse_locations':
# ... special truncate logic ...
else:
# For all other tables, perform standard truncate
cursor.execute(f'TRUNCATE TABLE {table}')
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Validates table exists dynamically from database
- Uses standard TRUNCATE for all tables except `warehouse_locations`
- `order_for_labels` will use standard TRUNCATE (no special handling needed)
---
### 4. ✅ Backup Database - `create_backup()`
**Location:** `app/modules/settings/routes.py:700-785`
**URL:** `POST /settings/api/backup`
```python
cmd = [
'mysqldump',
'-h', db_host,
'-u', db_user,
f'-p{db_password}',
'--skip-ssl',
db_name
]
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Uses `mysqldump` to backup entire database
- All tables automatically included
---
### 5. ✅ Restore Database - `restore_database()`
**Location:** `app/modules/settings/routes.py:764-810`
**URL:** `POST /settings/api/database/restore`
```python
# Execute SQL statements from backup
for statement in sql_content.split(';'):
statement = statement.strip()
if statement:
try:
cursor.execute(statement)
except Exception as e:
pass
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Restores all tables from backup file
- Backup files contain `order_for_labels` table definition and data
---
### 6. ✅ Get Backups List - `get_backups_list()`
**Location:** `app/modules/settings/routes.py:643-689`
**URL:** `GET /settings/api/backups`
```python
cursor.execute("""
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
""")
db_size = cursor.fetchone()[0]
```
**Coverage:** ✅ **INCLUDES `order_for_labels`**
- Calculates total database size
- Includes size of all tables including `order_for_labels`
---
## Template Coverage
### Database Management Template
**Location:** `app/templates/modules/settings/database_management.html`
**Components:**
1. ✅ **Backup Retention Settings** - Works with all tables
2. ✅ **Scheduled Backups** - Backs up all tables including `order_for_labels`
3. ✅ **Recent Backups List** - Shows all backups regardless of table count
4. ✅ **Restore Database** - Restores all tables from backup
5. ✅ **Clear Table Data** - Dropdown populated with ALL tables dynamically:
```html
```
This dropdown is populated by `loadDatabaseTables()` which fetches from `/settings/api/database/tables`
6. ✅ **Upload Backup File** - Accepts any SQL backup containing any tables
---
## Verification Results
### Database Initialization
✅ `order_for_labels` table is created in `initialize_db.py:399-444`
### Database Schema Verifier
✅ `order_for_labels` is included in `db_schema_verifier.py:98-110`:
```python
tables_to_verify = {
'users': self.get_users_schema,
'user_credentials': self.get_user_credentials_schema,
'user_modules': self.get_user_modules_schema,
'user_permissions': self.get_user_permissions_schema,
'roles': self.get_roles_schema,
'worker_manager_bindings': self.get_worker_manager_bindings_schema,
'application_settings': self.get_application_settings_schema,
'audit_logs': self.get_audit_logs_schema,
'backup_schedules': self.get_backup_schedules_schema,
'order_for_labels': self.get_order_for_labels_schema, # ✅ INCLUDED
}
```
### Dynamic Queries
✅ All table-related functions use dynamic queries from `information_schema.TABLES`
- No hardcoded table exclusions
- No table whitelists
- All tables treated equally
---
## Action Items
### No Changes Required ✅
The database management page and all related functions **already properly include** the `order_for_labels` table from the labels module because:
1. **All table queries are dynamic** - They query `information_schema.TABLES` directly
2. **No hardcoded lists** - There are no whitelist or blacklist of tables
3. **No exclusions** - Only `warehouse_locations` has special handling (to preserve 2 default locations), but `order_for_labels` uses standard truncate
4. **Standard SQL backup/restore** - All tables are backed up and restored automatically
### Ongoing Maintenance
- If new tables are added in the future, they will automatically appear in the database management interface
- The system is future-proof for adding new modules with new tables
- Schema verification will automatically verify and repair any new tables defined in `db_schema_verifier.py`
---
## Summary Table: All Database Management Functions
| Function | Location | Query Type | Includes order_for_labels | Notes |
|----------|----------|-----------|--------------------------|-------|
| `database_management()` | routes.py:596 | Dynamic from information_schema | ✅ YES | Page load, displays all tables |
| `get_database_tables()` | routes.py:841 | Dynamic from information_schema | ✅ YES | API endpoint, used for dropdown |
| `truncate_table()` | routes.py:869 | Dynamic validation + TRUNCATE | ✅ YES | Uses standard TRUNCATE |
| `create_backup()` | routes.py:700 | mysqldump (all tables) | ✅ YES | Includes all tables |
| `restore_database()` | routes.py:764 | SQL file restoration | ✅ YES | Restores all tables from file |
| `get_backups_list()` | routes.py:643 | Database size calculation | ✅ YES | DB size includes all tables |
| `loadDatabaseTables()` | database_management.html:1065 | JavaScript fetch API | ✅ YES | Populates dropdown dynamically |
---
## Conclusion
✅ **Complete Coverage Achieved**
The `/settings/database-management` page and all database management functions properly include and support the `order_for_labels` table from the labels module. No code changes are required.
The system uses dynamic table discovery from `information_schema.TABLES`, ensuring that any new tables added in the future will automatically be included in all database management operations.