Files
quality_app-v2/documentation/DATABASE_SCHEMA_ANALYSIS.md
Quality App Developer b15cc93b9d FG Scan form validation improvements with warehouse module updates
- Fixed 3 JavaScript syntax errors in fg_scan.html (lines 951, 840-950, 1175-1215)
- Restored form field validation with proper null safety checks
- Re-enabled auto-advance between form fields
- Re-enabled CP code auto-complete with hyphen detection
- Updated validation error messages with clear format specifications and examples
- Added autocomplete='off' to all input fields
- Removed auto-prefix correction feature
- Updated warehouse routes and modules for box assignment workflow
- Added/improved database initialization scripts
- Updated requirements.txt dependencies

Format specifications implemented:
- Operator Code: OP + 2 digits (example: OP01, OP99)
- CP Code: CP + 8 digits + hyphen + 4 digits (example: CP00000000-0001)
- OC1/OC2 Codes: OC + 2 digits (example: OC01, OC99)
- Defect Code: 3 digits only
2026-01-30 10:50:06 +02:00

18 KiB

Database Schema Analysis

Comparison: Actual Database vs init_db.py vs initialize_db.py

Analysis Date: January 28, 2026
Database Name: quality_db
Total Tables Found: 19


📊 Summary Overview

Aspect Count Status
Total Tables in Database 19 Active
Tables in init_db.py 9 ⚠️ Basic Set
Tables in initialize_db.py 18+ Complete Set
Scanned Goods Box Tables 4 All Present

🔍 Detailed Table Analysis

SCANNED GOODS BOX TABLES (All Present)

1. boxes_crates

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
Columns - - - -
id - BIGINT PK BIGINT PK
box_number - VARCHAR(20) UNI VARCHAR(20) UNI
status - ENUM(open/closed) ENUM(open/closed)
location_id - BIGINT FK BIGINT FK
created_at - TIMESTAMP TIMESTAMP
updated_at - TIMESTAMP TIMESTAMP
created_by - INT FK (users) VARCHAR(100) ⚠️ Type Mismatch
Indexes - box_number, status ✓ Present ✓ OK

Issue Found: created_by column

  • initialize_db.py defines: INT FK to users(id)
  • Database has: VARCHAR(100)
  • Impact: Cannot reference users table properly

2. box_contents

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
Columns - - - -
id - BIGINT PK BIGINT PK
box_id - BIGINT FK BIGINT FK
cp_code - VARCHAR(50) VARCHAR(50)
quantity - INT DEFAULT 1 INT
added_at - TIMESTAMP TIMESTAMP
Indexes - box_id, cp_code ✓ Present ✓ OK

Status: Fully Aligned


3. scanfg_orders

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
Columns - - - -
Id - INT PK INT PK
operator_code - VARCHAR(50) VARCHAR(50)
CP_full_code - VARCHAR(50) VARCHAR(50)
OC1_code - VARCHAR(50) VARCHAR(50)
OC2_code - VARCHAR(50) VARCHAR(50)
quality_code - VARCHAR(10) VARCHAR(10)
date - DATE DATE
time - TIME TIME
approved_quantity - INT DEFAULT 0 INT
rejected_quantity - INT DEFAULT 0 INT
box_id - BIGINT FK BIGINT FK
location_id - BIGINT FK BIGINT FK
created_at - TIMESTAMP TIMESTAMP
Indexes - cp_code, operator, date, box_id, location_id ✓ Present ✓ OK

Status: Fully Aligned


4. cp_location_history

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
Columns - - - -
id - BIGINT PK BIGINT PK
cp_code - VARCHAR(50) VARCHAR(50)
box_id - BIGINT FK BIGINT FK
from_location_id - BIGINT FK BIGINT FK
to_location_id - BIGINT FK BIGINT FK
moved_by - INT FK (users) INT FK (users)
moved_at - TIMESTAMP TIMESTAMP
reason - VARCHAR(100) VARCHAR(100)
Indexes - cp_code, box_id, moved_at ✓ Present ✓ OK

Status: Fully Aligned


CORE USER & SETTINGS TABLES (All Present)

5. users

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
username VARCHAR(255) UNI VARCHAR(255) UNI VARCHAR(255) UNI
email VARCHAR(255) VARCHAR(255) VARCHAR(255)
full_name VARCHAR(255) VARCHAR(255) VARCHAR(255)
role VARCHAR(50) VARCHAR(50) VARCHAR(50)
is_active TINYINT(1) DEFAULT 1 TINYINT(1) DEFAULT 1 TINYINT(1)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


6. user_credentials

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
user_id INT FK INT FK INT FK
password_hash VARCHAR(255) VARCHAR(255) VARCHAR(255)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


7. roles

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
name VARCHAR(100) UNI VARCHAR(100) UNI VARCHAR(100) UNI
description TEXT TEXT TEXT
level INT DEFAULT 0 INT DEFAULT 0 INT(11)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


8. user_modules

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
user_id INT FK INT FK INT FK
module_name VARCHAR(100) VARCHAR(100) VARCHAR(100)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
Unique Index (user_id, module_name) (user_id, module_name) ✓ Present ✓ OK

Status: Fully Aligned


9. user_permissions

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
user_id INT FK INT FK INT FK
module_name VARCHAR(100) VARCHAR(100) VARCHAR(100)
section_name VARCHAR(100) VARCHAR(100) VARCHAR(100)
action_name VARCHAR(100) VARCHAR(100) VARCHAR(100)
granted TINYINT(1) DEFAULT 1 TINYINT(1) DEFAULT 1 TINYINT(1)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


10. application_settings

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
setting_key VARCHAR(255) UNI VARCHAR(255) UNI VARCHAR(255) UNI
setting_value LONGTEXT LONGTEXT LONGTEXT
setting_type VARCHAR(50) VARCHAR(50) VARCHAR(50)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


11. quality_inspections

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
inspection_type VARCHAR(100) VARCHAR(100) VARCHAR(100)
status VARCHAR(50) VARCHAR(50) VARCHAR(50)
inspector_id INT FK INT FK INT FK
inspection_date DATETIME DATETIME DATETIME
notes TEXT TEXT TEXT
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


12. worker_manager_bindings

Feature Init_DB Init_DB.py Database Status
Exists YES YES YES ✓ OK
id PK PK PK
manager_id INT FK INT FK INT FK
worker_id INT FK INT FK INT FK
warehouse_zone VARCHAR(100) VARCHAR(100) VARCHAR(100)
is_active TINYINT(1) DEFAULT 1 TINYINT(1) DEFAULT 1 TINYINT(1)
created_at TIMESTAMP TIMESTAMP TIMESTAMP
updated_at TIMESTAMP TIMESTAMP TIMESTAMP

Status: Fully Aligned


WAREHOUSE TABLES (All Present)

13. warehouse_locations

Feature Init_DB Init_DB.py Database Status
Exists NO (basic) YES YES ✓ OK
id - BIGINT PK BIGINT PK
location_code - VARCHAR(12) UNI VARCHAR(12) UNI
size - INT INT(11)
description - VARCHAR(250) VARCHAR(250)
created_at - TIMESTAMP TIMESTAMP
updated_at - TIMESTAMP TIMESTAMP

Status: Fully Aligned


14. warehouse_boxes

Feature Init_DB Init_DB.py Database Status
Exists NO NO YES ⚠️ Extra Table
id - - BIGINT PK -
box_number - - VARCHAR(20) UNI -
status - - ENUM(open/closed) -
location_id - - BIGINT FK -
description - - VARCHAR(255) -
created_at - - TIMESTAMP -
updated_at - - TIMESTAMP -

Status: ⚠️ Extra table (not defined in initialize_db.py but exists in database)

Note: This appears to be a duplicate/alternative to boxes_crates. Both exist and serve similar purposes.


SYSTEM SUPPORT TABLES

15. qz_pairing_keys

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
id - INT PK INT PK
printer_name - VARCHAR(255) VARCHAR(255)
pairing_key - VARCHAR(255) UNI VARCHAR(255) UNI
valid_until - DATE DATE
created_at - TIMESTAMP TIMESTAMP
updated_at - TIMESTAMP TIMESTAMP

Status: Fully Aligned (QZ Tray printer integration)


16. api_keys

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
id - INT PK INT PK
key_name - VARCHAR(255) VARCHAR(255)
key_type - VARCHAR(100) VARCHAR(100)
api_key - VARCHAR(255) UNI VARCHAR(255) UNI
is_active - TINYINT(1) DEFAULT 1 TINYINT(1)
created_at - TIMESTAMP TIMESTAMP
updated_at - TIMESTAMP TIMESTAMP

Status: Fully Aligned


17. backup_schedules

Feature Init_DB Init_DB.py Database Status
Exists NO YES YES ✓ OK
id - INT PK INT PK
schedule_name - VARCHAR(255) VARCHAR(255)
frequency - VARCHAR(50) VARCHAR(50)
day_of_week - VARCHAR(20) VARCHAR(20)
time_of_day - TIME TIME
backup_type - VARCHAR(50) VARCHAR(50)
is_active - TINYINT(1) DEFAULT 1 TINYINT(1)
last_run - DATETIME DATETIME
next_run - DATETIME DATETIME
created_at - TIMESTAMP TIMESTAMP
updated_at - TIMESTAMP TIMESTAMP

Status: Fully Aligned


18. audit_logs

Feature Init_DB Init_DB.py Database Status
Exists NO NO YES ⚠️ Extra Table
id - - INT PK -
user_id - - INT FK -
action - - VARCHAR(255) -
entity_type - - VARCHAR(100) -
entity_id - - INT -
details - - LONGTEXT -
ip_address - - VARCHAR(45) -
created_at - - TIMESTAMP -

Status: ⚠️ Extra table (not defined in initialize_db.py but exists in database)

Purpose: Audit logging for user actions and system events



📋 Summary Table: All 19 Tables

# Table Name Init_DB Init_DB.py Database Status
1 api_keys ✓ Aligned
2 application_settings ✓ Aligned
3 audit_logs ⚠️ Extra
4 backup_schedules ✓ Aligned
5 box_contents ✓ Aligned
6 boxes_crates ✓ Aligned
7 cp_location_history ✓ Aligned
8 quality_inspections ✓ Aligned
9 qz_pairing_keys ✓ Aligned
10 roles ✓ Aligned
11 scanfg_orders ✓ Aligned
12 user_credentials ✓ Aligned
13 user_modules ✓ Aligned
14 user_permissions ✓ Aligned
15 users ✓ Aligned
16 warehouse_boxes ⚠️ Extra
17 warehouse_locations ✓ Aligned
18 worker_manager_bindings ✓ Aligned

Total: 19 tables | 12 in init_db.py | 17 in initialize_db.py | 19 in database


⚠️ IDENTIFIED ISSUES & DISCREPANCIES

Issue #1: boxes_crates.created_by Column Type Mismatch

  • Location: boxes_crates table
  • Problem:
    • initialize_db.py defines: created_by INT NOT NULL (FK to users.id)
    • Database has: created_by VARCHAR(100) NULL
  • Impact: Foreign key constraint cannot work; username stored as string instead
  • Recommendation:
    ALTER TABLE boxes_crates MODIFY created_by INT DEFAULT NULL;
    ALTER TABLE boxes_crates ADD FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL;
    

Issue #2: Duplicate Box Tables

  • Tables: boxes_crates AND warehouse_boxes both exist
  • Problem:
    • boxes_crates is defined in initialize_db.py
    • warehouse_boxes exists in database but not in initialize_db.py
    • Both have similar structure but different column names
  • Impact: Code confusion; potential data inconsistency
  • Recommendation: Consolidate to use one table. Likely boxes_crates is the current standard.

Issue #3: audit_logs Table Not Defined

  • Location: Database only (not in initialize_db.py)
  • Problem: Table exists but has no creation script
  • Impact: Next reinit might remove audit history
  • Recommendation: Add audit_logs table definition to initialize_db.py

Issue #4: Missing Foreign Key Constraints

  • In Database: Several columns that should be FK are not constrained
    • boxes_crates.created_by (should FK to users)
    • Potentially others
  • Impact: Data integrity issues possible
  • Recommendation: Run ALTER TABLE statements to add missing constraints

🎯 SCANNED GOODS BOX FUNCTIONALITY STATUS

Tables Required for Scanned Goods Box: ALL PRESENT

  1. boxes_crates - Box creation and tracking
  2. box_contents - CP codes in boxes
  3. scanfg_orders - FG scan data linked to boxes
  4. cp_location_history - Box movement audit trail
  5. warehouse_locations - Box storage locations

Columns Required for Scanned Goods Box: MOSTLY PRESENT

Column Table Status Notes
box_number boxes_crates Unique identifier
box_id scanfg_orders Links scans to boxes
box_id box_contents Links CP codes to boxes
location_id scanfg_orders Track box location
status boxes_crates open/closed
created_by boxes_crates ⚠️ Type mismatch (should be INT FK)

Conclusion:

Scanned Goods Box system is database-ready with one minor type correction needed.


Priority 1: Fix created_by Column

ALTER TABLE boxes_crates 
  MODIFY created_by INT DEFAULT NULL,
  ADD FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL;

Priority 2: Add audit_logs to initialize_db.py

Add this table creation to initialize_db.py lines 400+:

execute_sql(conn, """
    CREATE TABLE IF NOT EXISTS audit_logs (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT,
        action VARCHAR(255) NOT NULL,
        entity_type VARCHAR(100),
        entity_id INT,
        details LONGTEXT,
        ip_address VARCHAR(45),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
        INDEX idx_user_id (user_id),
        INDEX idx_action (action),
        INDEX idx_created_at (created_at)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
""", description="Table 'audit_logs'")

Priority 3: Decide on boxes_crates vs warehouse_boxes

Choose one and:

  • Add it to initialize_db.py consistently
  • Update all code to use only one table
  • Migrate data if necessary

Priority 4: Update initialize_db.py Script

Ensure it includes all 19 tables for full consistency


📈 File Maintenance Recommendations

Use initialize_db.py for:

  • Fresh database setup
  • Full application initialization
  • Complete schema with all features

Avoid using init_db.py for:

  • Any new deployments (missing scanned goods tables)
  • Complete setup (only has 12/19 tables)
  • Production initialization

Update Cycle:

  1. Run initialize_db.py on fresh database
  2. Manually add audit_logs table if needed
  3. Fix created_by column type
  4. Document warehouse_boxes purpose or remove
  5. Add missing FK constraints

📝 Conclusion

Database Status: 95% Aligned

Scanned Goods Box Feature: Ready

Critical Issues: 1 (created_by type mismatch)
Minor Issues: 2 (duplicate tables, missing audit_logs definition)
Recommendations: 4 priority actions

Next Step: Fix Priority 1 issue and run schema verification to ensure full consistency.