ppo dedup and smooth flow

celery-integration
peter.fong 9 months ago
parent 19c9584139
commit 068af86fcb

Binary file not shown.

@ -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 []

@ -16,12 +16,28 @@
</head>
<body>
<div class="container mt-5">
<!-- Flash-meldingen weergeven -->
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="alert alert-dismissible fade show mt-3" role="alert">
{% for category, message in messages %}
<div class="alert alert-{{ category }} d-flex justify-content-between align-items-center">
<span>{{ message|safe }}</span>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
{% endfor %}
</div>
{% endif %}
{% endwith %}
<h1>Resultaten van de query</h1>
<a href="{{ url_for('upload_file') }}" class="btn btn-secondary mt-3">Terug naar upload</a>
<form method="POST" class="mt-3">
<div class="form-group">
<label for="datepicker">Selecteer een extrapoleer cutoff ddatum:</label>
<input type="text" id="datepicker" name="selected_date" value="{{ selected_date or today }}" class="form-control w-auto d-inline">
<div class="form-group">
<label>Keuze voor frequentie omrekenen (indien UOM D):</label><br>
<div class="form-check form-check-inline">
@ -43,7 +59,11 @@
<button type="submit" class="btn btn-primary">Extrapoleer!</button>
</div>
</form>
<a href="{{ url_for('download_excel', x=selected_date) }}" class="btn btn-success">Download als Excel ({{ selected_date }})</a>
<form id="dateForm" method="POST" action="{{ url_for('download_excel') }}">
<input type="hidden" name="selected_date" id="selected_date_hidden" value="{{ selected_date or today }}">
<button type="submit" class="btn btn-success">Download als Excel ({{ selected_date or today }})</button>
</form>
<button id="resetTable" class="btn btn-warning mt-2">Reset tabel</button>
<table id="resultTable" class="table table-sm table-bordered table-striped mt-3">
<thead class="thead-dark">
@ -148,6 +168,18 @@
$('#resetTable').on('click', function () {
window.location.href = "{{ url_for('show_result') }}";
});
// Wanneer de download-knop wordt ingedrukt, stel dan de geselecteerde datum in
$(".btn.btn-success").on('click', function (e) {
var selectedDate = $("#datepicker").val(); // Haal de geselecteerde datum op
if (selectedDate) {
$("#selected_date_hidden").val(selectedDate); // Zet de waarde van het verborgen veld
}
// Verstuur het formulier
$("#dateForm").submit();
});
});
</script>
</body>

Loading…
Cancel
Save