import os import pandas as pd from flask import Flask, request, render_template, redirect, url_for, flash from werkzeug.utils import secure_filename from dotenv import load_dotenv from database import get_db_connection from flask import Response import io from datetime import datetime # Configuratie laden env_path = "./.env" load_dotenv(env_path) UPLOAD_FOLDER = os.getenv("UPLOAD_FOLDER") ALLOWED_EXTENSIONS = {"xlsx"} app = Flask(__name__) app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER app.secret_key = "supersecretkey" # Controleer of bestand toegestaan is def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS # Route voor de uploadpagina @app.route("/", methods=["GET", "POST"]) def upload_file(): if request.method == "POST": if "file" not in request.files: flash("Geen bestand geselecteerd", "danger") return redirect(request.url) file = request.files["file"] if file.filename == "": flash("Geen bestand geselecteerd", "danger") return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) filepath = os.path.join(app.config["UPLOAD_FOLDER"], filename) file.save(filepath) flash( "Bestand geüpload en verwerkt! Bekijk de resultaten", "success", ) process_excel(filepath) return redirect(url_for("upload_file")) return render_template("index.html") @app.route("/extrapolate", methods=["GET", "POST"]) def show_result(): x = request.form.get("x", 1, type=int) result = getextrapolation(x) # Geef de resultaten door aan het HTML-template return render_template("resultaat.html", result=result, x=x) @app.route("/download", methods=["GET"]) def download_excel(): x = request.args.get("x", 1, type=int) result = getextrapolation(x) df = pd.DataFrame(result) # Excel-bestand in-memory genereren output = io.BytesIO() with pd.ExcelWriter(output, engine="openpyxl") as writer: df.to_excel(writer, index=False, sheet_name=f"Extrapolatie_{x}jaar") output.seek(0) # Dynamische bestandsnaam filename = f"extrapolatie_{x}jaar.xlsx" return Response( output, mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={"Content-Disposition": f"attachment; filename={filename}"}, ) def getextrapolation(extrapolateYears): conn, cursor = get_db_connection() # Haal de originele data op zonder extrapolatie cursor.execute( """ SELECT Object_code, Object_omschrijving, Afdeling_object, PO_Code, Omschrijving_PO, Vervaldatum, Frequentie, UOM, PO_schema_Niet_gebruikt, Cluster, Locatie, Locatie_omschrijving, Klasse_object, Categorie FROM onderhoud """ ) # Haal de kolomnamen op columns = [desc[0] for desc in cursor.description] # Haal de ruwe data op rows = cursor.fetchall() # Sluit de cursor en de verbinding cursor.close() conn.close() raw_data = [dict(zip(columns, row)) for row in rows] # Huidige datum als pd.Timestamp (zonder tijd) today = pd.Timestamp.today().normalize() result = [] for row in raw_data: vervaldatum = row.get("Vervaldatum") # Converteer de Vervaldatum correct naar pd.Timestamp (of None bij fouten) vervaldatum = pd.to_datetime(vervaldatum, errors="coerce") # Controleer of de datum geldig is en in het verleden ligt if pd.notna(vervaldatum) and vervaldatum < today: vervaldatum = today # Zet op vandaag for i in range(extrapolateYears + 1): new_row = row.copy() if pd.notna(vervaldatum): # Controleer of het een geldige datum is new_row["Vervaldatum"] = ( vervaldatum + pd.DateOffset(years=i) ).strftime("%Y-%m-%d") else: # Indien geen geldige datum, zet als None new_row["Vervaldatum"] = None result.append(new_row) return result def process_exceld(filepath): df = pd.read_excel(filepath, engine="openpyxl") print(df.columns) df.columns = df.columns.str.strip() # for _, row in df.iterrows(): # print(row["Object_omschrijving"]) # Verwerk het Excel-bestand en sla op in MariaDB def process_excel(filepath): df = pd.read_excel(filepath, engine="openpyxl") df.columns = df.columns.str.strip() # Databaseverbinding maken conn, cursor = get_db_connection() # Zorg dat de tabel bestaat cursor.execute( """ CREATE TABLE IF NOT EXISTS onderhoud ( id INT AUTO_INCREMENT PRIMARY KEY, Object_code VARCHAR(50), Object_omschrijving TEXT, Afdeling_object VARCHAR(100), PO_Code VARCHAR(50), Omschrijving_PO TEXT, Vervaldatum DATE, Frequentie INT, UOM TEXT, PO_schema_Niet_gebruikt TEXT, Cluster TEXT, Locatie TEXT, Locatie_omschrijving TEXT, Klasse_object TEXT, Categorie TEXT ) """ ) # Data in de database invoegen for _, row in df.iterrows(): for column in row.index: if pd.isna(row[column]): row[column] = "" cursor.execute( """ INSERT INTO onderhoud (Object_code, Object_omschrijving, Afdeling_object, PO_Code, Omschrijving_PO, Vervaldatum, Frequentie, UOM, PO_schema_Niet_gebruikt, Cluster, Locatie, Locatie_omschrijving, Klasse_object, Categorie) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( row["Object code"], row["Object omschrijving"], row["Afdeling object"], row["PO Code"], row["Omschrijving PO"], row["Vervaldatum"], row["Frequentie"], row["UOM"], row["PO-schema Niet gebruikt"], row["Cluster"], row["Locatie"], row["Locatie omschrijving"], row["Klasse object"], row["Categorie"], ), ) conn.commit() cursor.close() conn.close() if __name__ == "__main__": os.makedirs(UPLOAD_FOLDER, exist_ok=True) app.run(debug=True)