|
|
|
|
@ -48,7 +48,7 @@ def init_db():
|
|
|
|
|
PO_schema_Niet_gebruikt TEXT,
|
|
|
|
|
Cluster TEXT,
|
|
|
|
|
Locatie TEXT,
|
|
|
|
|
Locatie_omschrijving TEXT,
|
|
|
|
|
Locatie_omschrijving TEXT,
|
|
|
|
|
Klasse_object TEXT,
|
|
|
|
|
Categorie TEXT
|
|
|
|
|
)
|
|
|
|
|
@ -60,38 +60,45 @@ def allowed_file(filename):
|
|
|
|
|
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/download", methods=["GET"])
|
|
|
|
|
def download_excel():
|
|
|
|
|
x_str = request.args.get("x")
|
|
|
|
|
if not x_str:
|
|
|
|
|
flash("Geen datum opgegeven voor download.", "danger")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
def fetch_extrapolation_results(request):
|
|
|
|
|
x_str = request.args.get("x") or request.form.get("selected_date")
|
|
|
|
|
# print(request.form.get("keuze_dagen_omrekenen"))
|
|
|
|
|
keuze_dagen_omrekenen = request.args.get(
|
|
|
|
|
"keuze_dagen_omrekenen") or request.form.get("keuze_dagen_omrekenen") or "D"
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
x = datetime.strptime(x_str, "%Y-%m-%d")
|
|
|
|
|
except ValueError:
|
|
|
|
|
flash("Ongeldige datum opgegeven.", "danger")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
today = datetime.today().strftime('%Y-%m-%d')
|
|
|
|
|
error = None
|
|
|
|
|
print(
|
|
|
|
|
f"selected date {x_str} keuze_dagen_omrekenen {keuze_dagen_omrekenen}")
|
|
|
|
|
|
|
|
|
|
result = get_extrapolation(x)
|
|
|
|
|
result, warningmessage = get_extrapolation(x_str, keuze_dagen_omrekenen)
|
|
|
|
|
|
|
|
|
|
if not result:
|
|
|
|
|
flash("Geen resultaten beschikbaar voor de geselecteerde datum.", "warning")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
return None, "Geen resultaten beschikbaar voor de geselecteerde datum.", today, keuze_dagen_omrekenen, x_str
|
|
|
|
|
return result, error, today, keuze_dagen_omrekenen, x_str, warningmessage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/download", methods=["GET", "POST"])
|
|
|
|
|
def download_excel():
|
|
|
|
|
result, error, today, keuze_dagen_omrekenen, selected_date, warningmessage = fetch_extrapolation_results(
|
|
|
|
|
request)
|
|
|
|
|
|
|
|
|
|
if error:
|
|
|
|
|
flash(error, "danger")
|
|
|
|
|
# return redirect(url_for("upload_file"))
|
|
|
|
|
|
|
|
|
|
df = pd.DataFrame(result)
|
|
|
|
|
|
|
|
|
|
# Verwijder de Vervaldatum kolom
|
|
|
|
|
if 'Vervaldatum' in df.columns:
|
|
|
|
|
df = df.drop(columns=['Vervaldatum'])
|
|
|
|
|
# df.rename(columns={"Begindatum": "Vervaldatum"}, inplace=True)
|
|
|
|
|
|
|
|
|
|
output = io.BytesIO()
|
|
|
|
|
with pd.ExcelWriter(output, engine="openpyxl") as writer:
|
|
|
|
|
df.to_excel(writer, index=False,
|
|
|
|
|
sheet_name=f"Extrapolatie_{x.strftime('%Y-%m-%d')}")
|
|
|
|
|
sheet_name=f"Extrapolatie_{today}")
|
|
|
|
|
output.seek(0)
|
|
|
|
|
|
|
|
|
|
filename = f"extrapolatie_{x.strftime('%Y-%m-%d')}.xlsx"
|
|
|
|
|
filename = f"extrapolatie_{today}.xlsx"
|
|
|
|
|
return Response(
|
|
|
|
|
output,
|
|
|
|
|
mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
|
|
|
@ -99,6 +106,22 @@ def download_excel():
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/extrapolate", methods=["GET", "POST"])
|
|
|
|
|
def show_result():
|
|
|
|
|
|
|
|
|
|
result, error, today, keuze_dagen_omrekenen, selected_date, warningmessage = fetch_extrapolation_results(
|
|
|
|
|
request)
|
|
|
|
|
if error:
|
|
|
|
|
flash(error, "danger")
|
|
|
|
|
# return redirect(url_for("upload_file"))
|
|
|
|
|
|
|
|
|
|
if warningmessage:
|
|
|
|
|
flash(warningmessage, "warning")
|
|
|
|
|
|
|
|
|
|
return render_template("resultaat.html", result=result, today=today, selected_date=selected_date,
|
|
|
|
|
keuze_dagen_omrekenen=keuze_dagen_omrekenen)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/", methods=["GET", "POST"])
|
|
|
|
|
def upload_file():
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
@ -118,7 +141,8 @@ def upload_file():
|
|
|
|
|
process_excel(filepath)
|
|
|
|
|
flash("Bestand geüpload en verwerkt! <a href='" +
|
|
|
|
|
url_for("show_result") + "'>Bekijk de resultaten</a>", "success")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
# Hier omleiden naar de 'resultaat' pagina
|
|
|
|
|
return redirect(url_for("show_result"))
|
|
|
|
|
|
|
|
|
|
return render_template("index.html")
|
|
|
|
|
|
|
|
|
|
@ -159,55 +183,25 @@ def process_excel(filepath):
|
|
|
|
|
print(f"Aantal records in de database: {count}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/extrapolate", methods=["GET", "POST"])
|
|
|
|
|
def show_result():
|
|
|
|
|
today = datetime.today().strftime('%Y-%m-%d')
|
|
|
|
|
def get_extrapolation(x, keuze_dagen_omrekenen):
|
|
|
|
|
|
|
|
|
|
x_str = request.form.get("selected_date")
|
|
|
|
|
keuze_dagen_omrekenen = request.form.get(
|
|
|
|
|
'keuze_dagen_omrekenen', 'D') # Default is "D" (Dagen)
|
|
|
|
|
|
|
|
|
|
if x_str:
|
|
|
|
|
try:
|
|
|
|
|
x = datetime.strptime(x_str, "%Y-%m-%d")
|
|
|
|
|
except ValueError:
|
|
|
|
|
flash("Ongeldige datum ingevoerd.", "danger")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
|
|
|
|
|
# **Met datum -> gebruik extrapolatie**
|
|
|
|
|
result = get_extrapolation(x, keuze_dagen_omrekenen)
|
|
|
|
|
else:
|
|
|
|
|
# **Zonder datum -> toon ruwe databasegegevens**
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
cursor.execute("SELECT * FROM onderhoud")
|
|
|
|
|
columns = [desc[0] for desc in cursor.description]
|
|
|
|
|
rows = cursor.fetchall()
|
|
|
|
|
|
|
|
|
|
result = [dict(zip(columns, row))
|
|
|
|
|
for row in rows] # Zet om naar dicts voor weergave
|
|
|
|
|
|
|
|
|
|
return render_template("resultaat.html", result=result, selected_date=x_str, today=today,
|
|
|
|
|
keuze_dagen_omrekenen=keuze_dagen_omrekenen)
|
|
|
|
|
raw_data = get_raw_data()
|
|
|
|
|
print(f"keuze_dagen_omrekenen: {keuze_dagen_omrekenen}")
|
|
|
|
|
if not x and not keuze_dagen_omrekenen:
|
|
|
|
|
warning_msg = "Waarschuwing: Geen datum of keuze_dagen_omrekenen opgegeven, ruwe data wordt getoond."
|
|
|
|
|
print(warning_msg)
|
|
|
|
|
return raw_data, warning_msg
|
|
|
|
|
|
|
|
|
|
if not x:
|
|
|
|
|
warning_msg = "Waarschuwing: Geen datum opgegeven, ruwe data wordt getoond."
|
|
|
|
|
print(warning_msg)
|
|
|
|
|
return raw_data, warning_msg
|
|
|
|
|
|
|
|
|
|
def get_extrapolation(x, keuze_dagen_omrekenen):
|
|
|
|
|
if x is None:
|
|
|
|
|
return []
|
|
|
|
|
print(f"keuze {keuze_dagen_omrekenen}")
|
|
|
|
|
today = datetime.today()
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
cursor.execute("SELECT * FROM onderhoud")
|
|
|
|
|
columns = [desc[0] for desc in cursor.description]
|
|
|
|
|
rows = cursor.fetchall()
|
|
|
|
|
|
|
|
|
|
raw_data = [dict(zip(columns, row)) for row in rows]
|
|
|
|
|
|
|
|
|
|
result = raw_data.copy()
|
|
|
|
|
|
|
|
|
|
for row in raw_data:
|
|
|
|
|
vervaldatum = row.get("Vervaldatum")
|
|
|
|
|
vervaldatum = row.get("Begindatum")
|
|
|
|
|
|
|
|
|
|
uom = row.get("UOM")
|
|
|
|
|
frequentie = row.get("Frequentie", 0)
|
|
|
|
|
@ -216,7 +210,7 @@ def get_extrapolation(x, keuze_dagen_omrekenen):
|
|
|
|
|
if vervaldatum:
|
|
|
|
|
extrapolated_dates = extrapolate_vervaldatum(
|
|
|
|
|
vervaldatum, uom, frequentie, x, keuze_dagen_omrekenen)
|
|
|
|
|
|
|
|
|
|
print(extrapolated_dates)
|
|
|
|
|
if not extrapolated_dates:
|
|
|
|
|
print(
|
|
|
|
|
f"Geen extrapolatie-data voor vervaldatum: {vervaldatum}")
|
|
|
|
|
@ -230,14 +224,31 @@ def get_extrapolation(x, keuze_dagen_omrekenen):
|
|
|
|
|
) <= today.date() else "Nee"
|
|
|
|
|
|
|
|
|
|
new_row["Begindatum"] = date
|
|
|
|
|
print(f"Added row: {date}")
|
|
|
|
|
# print(f"Added row: {date}")
|
|
|
|
|
result.append(new_row)
|
|
|
|
|
return remove_duplicates(result), "" # Dubbele records verwijderen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_raw_data():
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
cursor.execute("SELECT * FROM onderhoud")
|
|
|
|
|
columns = [desc[0] for desc in cursor.description]
|
|
|
|
|
rows = cursor.fetchall()
|
|
|
|
|
|
|
|
|
|
if 'Vervaldatum' in columns:
|
|
|
|
|
columns[columns.index('Vervaldatum')] = 'Begindatum'
|
|
|
|
|
|
|
|
|
|
raw_data = [dict(zip(columns, row)) for row in rows]
|
|
|
|
|
|
|
|
|
|
return remove_duplicates(result) # Dubbele records verwijderen
|
|
|
|
|
for record in raw_data:
|
|
|
|
|
if 'Begindatum' in record:
|
|
|
|
|
record['Begindatum'] = str(
|
|
|
|
|
pd.to_datetime(record['Begindatum']).date())
|
|
|
|
|
return raw_data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def remove_duplicates(data, unique_keys=None):
|
|
|
|
|
print("removing duplicates")
|
|
|
|
|
if not data:
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
@ -265,6 +276,8 @@ def remove_duplicates(data, unique_keys=None):
|
|
|
|
|
def extrapolate_vervaldatum(vervaldatum, uom, frequentie, x, keuze_dagen_omrekenen="D"):
|
|
|
|
|
print(f"keuze {keuze_dagen_omrekenen}")
|
|
|
|
|
vervaldatum = pd.to_datetime(str(vervaldatum), errors="coerce")
|
|
|
|
|
print(x)
|
|
|
|
|
x = pd.to_datetime(x)
|
|
|
|
|
if pd.isna(vervaldatum):
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
|