diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e65ec9c..36785ff 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -29,9 +29,7 @@ }, "postCreateCommand": "find /workspace -type f -name 'requirements.txt' -exec pip install --no-cache-dir -r {} \\;", "remoteUser": "root", - "mounts": [ - "source=${localWorkspaceFolder},target=/workspace,type=bind" - ], + "mounts": ["source=${localWorkspaceFolder},target=/workspace,type=bind"], "runArgs": ["--entrypoint", "bash"], "settings": { "python.pythonPath": "/usr/local/bin/python" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..cf60727 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,30 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Chrome", + "port": 9222, + "request": "attach", + "type": "chrome", + "webRoot": "${workspaceFolder}" + }, + { + "name": "Python Debugger: Remote Attach", + "type": "debugpy", + "request": "attach", + "connect": { + "host": "0.0.0.0:5678", + "port": 5678 + }, + "pathMappings": [ + { + "localRoot": "${workspaceFolder}", + "remoteRoot": "." + } + ] + } + ] +} \ No newline at end of file diff --git a/delfland/ppo-insight/ppo_insight.py b/delfland/ppo-insight/ppo_insight.py index cf85f03..cb275bc 100644 --- a/delfland/ppo-insight/ppo_insight.py +++ b/delfland/ppo-insight/ppo_insight.py @@ -1,12 +1,15 @@ import os +import io +import debugpy +from datetime import datetime + 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 flask import Flask, request, render_template, redirect, url_for, flash, Response +from werkzeug.utils import secure_filename + from database import get_db_connection -from flask import Response -import io -from datetime import datetime + env_path = "./.env" load_dotenv(env_path) @@ -82,6 +85,62 @@ def download_excel(): ) +def extrapolate_vervaldatum(vervaldatum, uom, frequentie, extrapolate_years): + today = pd.Timestamp.today().normalize() + vervaldatum = pd.to_datetime(vervaldatum, errors="coerce") + + result = [] + for i in range(extrapolate_years + 1): + if uom == "D": # Dagelijks + months_to_add = round(frequentie * i / 30.44) + new_date = vervaldatum + pd.DateOffset(months=months_to_add) + # new_date = vervaldatum + pd.DateOffset(days=frequentie * i) + elif uom == "M": # Maandelijks + new_date = vervaldatum + pd.DateOffset(months=int(frequentie * i)) + elif uom == "Y": # Jaarlijks + new_date = vervaldatum + pd.DateOffset(years=int(frequentie * i)) + else: + continue # Onbekende UOM, overslaan + + if new_date <= today + pd.DateOffset(years=extrapolate_years): + result.append(new_date.strftime("%Y-%m-%d")) + + return result + + +def extrapolate_vervaldatum_assheet(vervaldatum, uom, frequentie, extrapolate_years): + today = pd.Timestamp.today().normalize() + vervaldatum = pd.to_datetime(vervaldatum, errors="coerce") + + result = [] + for i in range(extrapolate_years + 1): + if uom == "D": # Dagelijks + years_to_add = (frequentie * i) / 365 # Omrekenen naar jaren + # Afronden naar het dichtstbijzijnde jaar + rounded_years = round(years_to_add) + new_date = vervaldatum + pd.DateOffset(years=rounded_years) + + elif uom == "M": # Maandelijks + years_to_add = (frequentie * i) / 12 # Omrekenen naar jaren + # Afronden naar het dichtstbijzijnde jaar + rounded_years = round(years_to_add) + new_date = vervaldatum + pd.DateOffset(years=rounded_years) + + elif uom == "Y": # Jaarlijks + # Afronden naar het dichtstbijzijnde jaar + rounded_years = round(frequentie * i) + new_date = vervaldatum + pd.DateOffset(years=rounded_years) + + else: + continue # Onbekende UOM, overslaan + + # Controle of de nieuwe datum binnen het bereik valt + if new_date <= today + pd.DateOffset(years=extrapolate_years): + result.append(new_date.strftime("%Y-%m-%d")) + + return result + + def getextrapolation(extrapolateYears): conn, cursor = get_db_connection() @@ -119,24 +178,25 @@ def getextrapolation(extrapolateYears): 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 + vervaldatum = row.get("Vervaldatum") + uom = row.get("UOM") + frequentie = row.get("Frequentie", 0) - for i in range(extrapolateYears + 1): - new_row = row.copy() + if vervaldatum: + extrapolated_dates = extrapolate_vervaldatum( + vervaldatum, uom, frequentie, extrapolateYears) - if pd.notna(vervaldatum): - new_row["Vervaldatum"] = ( - vervaldatum + pd.DateOffset(years=i) - ).strftime("%Y-%m-%d") - else: - new_row["Vervaldatum"] = None + for date in extrapolated_dates: + new_row = row.copy() + new_row["Vervaldatum"] = date - result.append(new_row) + new_row["Overtijd"] = "" + if pd.to_datetime(date) < today: + new_row["Overtijd"] = "ja" + else: + new_row["Overtijd"] = "Nee" + result.append(new_row) return result @@ -204,5 +264,9 @@ def process_excel(filepath): if __name__ == "__main__": + if os.getenv("FLASK_DEBUG") == "1": + print("⏳ Wachten op debugger...") + debugpy.listen(("0.0.0.0", 5678)) # Luistert op poort 5678 + debugpy.wait_for_client() # Wacht op een debugger os.makedirs(UPLOAD_FOLDER, exist_ok=True) app.run(debug=True) diff --git a/delfland/ppo-insight/templates/resultaat.html b/delfland/ppo-insight/templates/resultaat.html index b4c93c7..602ac6b 100644 --- a/delfland/ppo-insight/templates/resultaat.html +++ b/delfland/ppo-insight/templates/resultaat.html @@ -5,14 +5,17 @@ Resultaat - + + + + @@ -35,9 +38,10 @@ Download als Excel ({{ x }} jaar) - - - + + + +
@@ -54,11 +58,12 @@ + {% for row in result %} - + @@ -73,16 +78,88 @@ + {% endfor %}
Object_codeLocatie_omschrijving Klasse_object CategorieOvertijd
{{ row['Object_code'] }} {{ row['Object_omschrijving'] }} {{ row['Afdeling_object'] }}{{ row['Locatie_omschrijving'] }} {{ row['Klasse_object'] }} {{ row['Categorie'] }}{{ row['Overtijd'] }}
- - - + + + + + + + diff --git a/energie/requirements.txt b/energie/requirements.txt index dab3964..0353c2d 100644 --- a/energie/requirements.txt +++ b/energie/requirements.txt @@ -1,4 +1,5 @@ paho-mqtt mysql-connector-python python-dotenv -requests \ No newline at end of file +requests +debugpy \ No newline at end of file