|
|
|
|
@ -21,6 +21,16 @@ app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER
|
|
|
|
|
app.secret_key = "9f2a1d3e4c5b6a7d8e9f0a1b2c3d4e5f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/clear_db", methods=["POST", "GET"])
|
|
|
|
|
def clear_db():
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
cursor.execute("DELETE FROM onderhoud")
|
|
|
|
|
conn.commit()
|
|
|
|
|
flash("De database is geleegd!", "success")
|
|
|
|
|
return redirect(url_for("debug_db"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def init_db():
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
@ -130,6 +140,10 @@ def clean_column_name(name):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_excel(filepath):
|
|
|
|
|
# Controleer of de database bestaat
|
|
|
|
|
if not os.path.exists(DATABASE):
|
|
|
|
|
init_db()
|
|
|
|
|
|
|
|
|
|
df = pd.read_excel(filepath)
|
|
|
|
|
# Kolomnamen normaliseren
|
|
|
|
|
df.columns = [clean_column_name(col) for col in df.columns]
|
|
|
|
|
@ -142,23 +156,35 @@ def process_excel(filepath):
|
|
|
|
|
# Debug: Controleer of de records echt zijn toegevoegd
|
|
|
|
|
cursor.execute("SELECT COUNT(*) FROM onderhoud")
|
|
|
|
|
count = cursor.fetchone()[0]
|
|
|
|
|
# Controleer of data correct is ingevoerd
|
|
|
|
|
print(f"Aantal records in de database: {count}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/extrapolate", methods=["GET", "POST"])
|
|
|
|
|
def show_result():
|
|
|
|
|
# Haal de huidige datum op voor de standaardwaarde
|
|
|
|
|
today = datetime.today().strftime('%Y-%m-%d')
|
|
|
|
|
|
|
|
|
|
x_str = request.form.get("selected_date")
|
|
|
|
|
try:
|
|
|
|
|
x = datetime.strptime(x_str, "%Y-%m-%d") if x_str else datetime.today()
|
|
|
|
|
except ValueError:
|
|
|
|
|
flash("Ongeldige datum ingevoerd.", "danger")
|
|
|
|
|
return redirect(url_for("upload_file"))
|
|
|
|
|
|
|
|
|
|
result = get_extrapolation(x)
|
|
|
|
|
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)
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -169,17 +195,13 @@ def get_extrapolation(x):
|
|
|
|
|
today = datetime.today()
|
|
|
|
|
with sqlite3.connect(DATABASE) as conn:
|
|
|
|
|
cursor = conn.cursor()
|
|
|
|
|
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
|
|
|
|
|
""")
|
|
|
|
|
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 = []
|
|
|
|
|
|
|
|
|
|
result = raw_data.copy()
|
|
|
|
|
|
|
|
|
|
for row in raw_data:
|
|
|
|
|
vervaldatum = row.get("Vervaldatum")
|
|
|
|
|
@ -190,22 +212,42 @@ def get_extrapolation(x):
|
|
|
|
|
extrapolated_dates = extrapolate_vervaldatum(
|
|
|
|
|
vervaldatum, uom, frequentie, x)
|
|
|
|
|
for i, date in enumerate(extrapolated_dates):
|
|
|
|
|
new_row = row.copy()
|
|
|
|
|
begindatum = pd.to_datetime(date)
|
|
|
|
|
if begindatum <= today:
|
|
|
|
|
new_row["Overtijd"] = "Ja"
|
|
|
|
|
else:
|
|
|
|
|
new_row["Overtijd"] = "Nee"
|
|
|
|
|
new_row["Begindatum"] = date
|
|
|
|
|
if date:
|
|
|
|
|
new_row = row.copy()
|
|
|
|
|
begindatum = pd.to_datetime(date)
|
|
|
|
|
new_row["Overtijd"] = "Ja" if begindatum.date(
|
|
|
|
|
) <= today.date() else "Nee"
|
|
|
|
|
|
|
|
|
|
if i == 0:
|
|
|
|
|
new_row["Parent"] = "*"
|
|
|
|
|
else:
|
|
|
|
|
new_row["Parent"] = ""
|
|
|
|
|
new_row["Begindatum"] = date
|
|
|
|
|
result.append(new_row)
|
|
|
|
|
|
|
|
|
|
result.append(new_row)
|
|
|
|
|
return remove_duplicates(result) # Dubbele records verwijderen
|
|
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
def remove_duplicates(data, unique_keys=None):
|
|
|
|
|
|
|
|
|
|
if not data:
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
if unique_keys is None:
|
|
|
|
|
unique_keys = ["Object_code", "Begindatum", "PO_Code", "Object_omschrijving",
|
|
|
|
|
"Omschrijving_PO", "Frequentie", "UOM"]
|
|
|
|
|
seen = set()
|
|
|
|
|
unique_data = []
|
|
|
|
|
|
|
|
|
|
for record in data:
|
|
|
|
|
cleaned_record = {k: ("" if pd.isna(v) else v)
|
|
|
|
|
for k, v in record.items()}
|
|
|
|
|
if not cleaned_record.get("Begindatum"):
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
key_tuple = tuple(cleaned_record.get(k, "") for k in unique_keys)
|
|
|
|
|
|
|
|
|
|
if key_tuple not in seen:
|
|
|
|
|
seen.add(key_tuple)
|
|
|
|
|
unique_data.append(cleaned_record)
|
|
|
|
|
|
|
|
|
|
return unique_data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def extrapolate_vervaldatum(vervaldatum, uom, frequentie, x):
|
|
|
|
|
@ -217,9 +259,9 @@ def extrapolate_vervaldatum(vervaldatum, uom, frequentie, x):
|
|
|
|
|
while vervaldatum <= x:
|
|
|
|
|
result.append(vervaldatum.strftime("%Y-%m-%d"))
|
|
|
|
|
if uom == "D":
|
|
|
|
|
vervaldatum += pd.DateOffset(days=frequentie)
|
|
|
|
|
# vervaldatum += pd.DateOffset(days=frequentie)
|
|
|
|
|
# vervaldatum += pd.DateOffset(weeks=frequentie // 7)
|
|
|
|
|
# vervaldatum += pd.DateOffset(months=frequentie // 30)
|
|
|
|
|
vervaldatum += pd.DateOffset(months=frequentie // 30)
|
|
|
|
|
elif uom == "W":
|
|
|
|
|
vervaldatum += pd.DateOffset(weeks=frequentie)
|
|
|
|
|
elif uom == "M":
|
|
|
|
|
|