From 05394697a096affeb8e119f80d79469faa7a016f Mon Sep 17 00:00:00 2001 From: Scheianu Ionut Date: Fri, 10 Oct 2025 22:49:57 +0300 Subject: [PATCH] updated validation and auto submit --- py_app/app/__pycache__/routes.cpython-312.pyc | Bin 108908 -> 112042 bytes .../db_create_scripts/create_scanfg_orders.py | 41 ++ .../db_create_scripts/create_triggers_fg.py | 73 +++ py_app/app/routes.py | 73 +++ py_app/app/templates/fg_scan.html | 473 ++++++++++++++++++ py_app/app/templates/main_page_scan.html | 2 +- py_app/app/templates/scan.html | 394 +++++++++++++++ 7 files changed, 1055 insertions(+), 1 deletion(-) create mode 100644 py_app/app/db_create_scripts/create_scanfg_orders.py create mode 100644 py_app/app/db_create_scripts/create_triggers_fg.py create mode 100644 py_app/app/templates/fg_scan.html diff --git a/py_app/app/__pycache__/routes.cpython-312.pyc b/py_app/app/__pycache__/routes.cpython-312.pyc index 2dad955122b7895e88348ffee8f95821a14cd002..b23cf0e13dd3e9d0509e0221d561b015fe370967 100644 GIT binary patch delta 6503 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 diff --git a/py_app/app/db_create_scripts/create_scanfg_orders.py b/py_app/app/db_create_scripts/create_scanfg_orders.py new file mode 100644 index 0000000..45dd5bb --- /dev/null +++ b/py_app/app/db_create_scripts/create_scanfg_orders.py @@ -0,0 +1,41 @@ +import mariadb + +# Database connection credentials +# (reuse from create_scan_1db.py or update as needed) +db_config = { + "user": "trasabilitate", + "password": "Initial01!", + "host": "localhost", + "database": "trasabilitate_database" +} + +try: + conn = mariadb.connect(**db_config) + cursor = conn.cursor() + print("Connected to the database successfully!") + + # Create the scanfg_orders table (same structure as scan1_orders) + create_table_query = """ + CREATE TABLE IF NOT EXISTS scanfg_orders ( + Id INT AUTO_INCREMENT PRIMARY KEY, + operator_code VARCHAR(4) NOT NULL, + CP_full_code VARCHAR(15) NOT NULL UNIQUE, + OC1_code VARCHAR(4) NOT NULL, + OC2_code VARCHAR(4) NOT NULL, + CP_base_code VARCHAR(10) GENERATED ALWAYS AS (LEFT(CP_full_code, 10)) STORED, + quality_code INT(3) NOT NULL, + date DATE NOT NULL, + time TIME NOT NULL, + approved_quantity INT DEFAULT 0, + rejected_quantity INT DEFAULT 0 + ); + """ + cursor.execute(create_table_query) + print("Table 'scanfg_orders' created successfully!") + + conn.commit() + cursor.close() + conn.close() + +except mariadb.Error as e: + print(f"Error connecting to the database: {e}") diff --git a/py_app/app/db_create_scripts/create_triggers_fg.py b/py_app/app/db_create_scripts/create_triggers_fg.py new file mode 100644 index 0000000..17a5ba0 --- /dev/null +++ b/py_app/app/db_create_scripts/create_triggers_fg.py @@ -0,0 +1,73 @@ +import mariadb + +# Database connection credentials +db_config = { + "user": "trasabilitate", + "password": "Initial01!", + "host": "localhost", + "database": "trasabilitate_database" +} + +# Connect to the database +try: + conn = mariadb.connect(**db_config) + cursor = conn.cursor() + print("Connected to the database successfully!") + + # Delete old triggers if they exist + try: + cursor.execute("DROP TRIGGER IF EXISTS increment_approved_quantity_fg;") + print("Old trigger 'increment_approved_quantity_fg' deleted successfully.") + except mariadb.Error as e: + print(f"Error deleting old trigger 'increment_approved_quantity_fg': {e}") + + try: + cursor.execute("DROP TRIGGER IF EXISTS increment_rejected_quantity_fg;") + print("Old trigger 'increment_rejected_quantity_fg' deleted successfully.") + except mariadb.Error as e: + print(f"Error deleting old trigger 'increment_rejected_quantity_fg': {e}") + + # Create corrected trigger for approved_quantity in scanfg_orders + create_approved_trigger_fg = """ + CREATE TRIGGER increment_approved_quantity_fg + BEFORE INSERT ON scanfg_orders + FOR EACH ROW + BEGIN + IF NEW.quality_code = 000 THEN + SET NEW.approved_quantity = ( + SELECT COUNT(*) + FROM scanfg_orders + WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000 + ) + 1; + SET NEW.rejected_quantity = ( + SELECT COUNT(*) + FROM scanfg_orders + WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000 + ); + ELSE + SET NEW.approved_quantity = ( + SELECT COUNT(*) + FROM scanfg_orders + WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000 + ); + SET NEW.rejected_quantity = ( + SELECT COUNT(*) + FROM scanfg_orders + WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000 + ) + 1; + END IF; + END; + """ + cursor.execute(create_approved_trigger_fg) + print("Trigger 'increment_approved_quantity_fg' created successfully for scanfg_orders table!") + + # Commit changes and close the connection + conn.commit() + cursor.close() + conn.close() + + print("\n✅ All triggers for scanfg_orders table created successfully!") + print("The approved_quantity and rejected_quantity will now be calculated automatically.") + +except mariadb.Error as e: + print(f"Error connecting to the database or creating triggers: {e}") diff --git a/py_app/app/routes.py b/py_app/app/routes.py index 7cecbde..d93f99d 100755 --- a/py_app/app/routes.py +++ b/py_app/app/routes.py @@ -299,6 +299,79 @@ def logout(): session.pop('role', None) return redirect(url_for('main.login')) +# Finish Goods Scan Route +@bp.route('/fg_scan', methods=['GET', 'POST']) +def fg_scan(): + if 'role' not in session or session['role'] not in ['superadmin', 'administrator', 'admin', 'scan']: + flash('Access denied: Scan users only.') + return redirect(url_for('main.dashboard')) + + if request.method == 'POST': + # Handle form submission + operator_code = request.form.get('operator_code') + cp_code = request.form.get('cp_code') + oc1_code = request.form.get('oc1_code') + oc2_code = request.form.get('oc2_code') + defect_code = request.form.get('defect_code') + date = request.form.get('date') + time = request.form.get('time') + + try: + # Connect to the database + conn = get_db_connection() + cursor = conn.cursor() + + # Check if the CP_full_code already exists in scanfg_orders + cursor.execute("SELECT Id FROM scanfg_orders WHERE CP_full_code = ?", (cp_code,)) + existing_entry = cursor.fetchone() + + if existing_entry: + # Update the existing entry + update_query = """ + UPDATE scanfg_orders + SET operator_code = ?, OC1_code = ?, OC2_code = ?, quality_code = ?, date = ?, time = ? + WHERE CP_full_code = ? + """ + cursor.execute(update_query, (operator_code, oc1_code, oc2_code, defect_code, date, time, cp_code)) + flash('Existing entry updated successfully.') + else: + # Insert a new entry + insert_query = """ + INSERT INTO scanfg_orders (operator_code, CP_full_code, OC1_code, OC2_code, quality_code, date, time) + VALUES (?, ?, ?, ?, ?, ?, ?) + """ + cursor.execute(insert_query, (operator_code, cp_code, oc1_code, oc2_code, defect_code, date, time)) + flash('New entry inserted successfully.') + + # Commit the transaction + conn.commit() + conn.close() + + except mariadb.Error as e: + print(f"Error saving finish goods scan data: {e}") + flash(f"Error saving scan data: {e}") + + # Fetch the latest scan data for display from scanfg_orders + scan_data = [] + try: + conn = get_db_connection() + cursor = conn.cursor() + cursor.execute(""" + SELECT Id, operator_code, CP_base_code, OC1_code, OC2_code, quality_code, date, time, approved_quantity, rejected_quantity + FROM scanfg_orders + ORDER BY Id DESC + LIMIT 15 + """) + raw_scan_data = cursor.fetchall() + # Apply formatting to scan data for consistent date display + scan_data = [[format_cell_data(cell) for cell in row] for row in raw_scan_data] + conn.close() + except mariadb.Error as e: + print(f"Error fetching finish goods scan data: {e}") + flash(f"Error fetching scan data: {e}") + + return render_template('fg_scan.html', scan_data=scan_data) + @bp.route('/create_user', methods=['POST']) def create_user(): return create_user_handler() diff --git a/py_app/app/templates/fg_scan.html b/py_app/app/templates/fg_scan.html new file mode 100644 index 0000000..ab88ad9 --- /dev/null +++ b/py_app/app/templates/fg_scan.html @@ -0,0 +1,473 @@ +{% extends "base.html" %} + +{% block title %}Finish Good Scan{% endblock %} +{% block head %} + + + +{% endblock %} +{% block content %} +
+ +
+

Scan Input

+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+

Latest Scans

+ + + + + + + + + + + + + + + + + {% for row in scan_data %} + + + + + + + + + + + + + {% endfor %} + +
IDOp CodeCP CodeOC1 CodeOC2 CodeDefect CodeDateTimeApr. QuantityRejec. Quantity
{{ row[0] }} {{ row[1] }} {{ row[2] }} {{ row[3] }} {{ row[4] }} {{ row[5] }} {{ row[6] }} {{ row[7] }} {{ row[8] }} {{ row[9] }}
+
+
+{% endblock %} diff --git a/py_app/app/templates/main_page_scan.html b/py_app/app/templates/main_page_scan.html index 6f08716..d97337c 100644 --- a/py_app/app/templates/main_page_scan.html +++ b/py_app/app/templates/main_page_scan.html @@ -12,7 +12,7 @@

Finish goods scanning

Access the scanning module for production orders.

- Finish goods scanning + Finish goods scan
diff --git a/py_app/app/templates/scan.html b/py_app/app/templates/scan.html index c18ea7f..3d32fef 100755 --- a/py_app/app/templates/scan.html +++ b/py_app/app/templates/scan.html @@ -2,6 +2,400 @@ {% block title %}Scan Module{% endblock %} {% block head %} + + {% endblock %} {% block content %}