You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmftools/delfland/ppo-insight/ppo_insight.py

209 lines
5.7 KiB

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
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 = "9f2a1d3e4c5b6a7d8e9f0a1b2c3d4e5f"
def allowed_file(filename):
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
@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! <a href='"
+ url_for("show_result")
+ "'>Bekijk de resultaten</a>",
"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)
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)
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()
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
"""
)
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
cursor.close()
conn.close()
raw_data = [dict(zip(columns, row)) for row in rows]
today = pd.Timestamp.today().normalize()
result = []
for row in raw_data:
vervaldatum = row.get("Vervaldatum")
vervaldatum = pd.to_datetime(vervaldatum, errors="coerce")
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):
new_row["Vervaldatum"] = (
vervaldatum + pd.DateOffset(years=i)
).strftime("%Y-%m-%d")
else:
new_row["Vervaldatum"] = None
result.append(new_row)
return result
def process_excel(filepath):
df = pd.read_excel(filepath, engine="openpyxl")
df.columns = df.columns.str.strip()
conn, cursor = get_db_connection()
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
)
"""
)
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)