From 1b235e87d4808a988551836589124e29408488a5 Mon Sep 17 00:00:00 2001 From: "sebastian.serfling" Date: Wed, 14 Aug 2024 15:24:47 +0200 Subject: [PATCH] ADD many Stuff --- .env | 5 + .idea/.gitignore | 3 + .idea/Reports-Visual.iml | 8 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 + main.py | 131 ++++++++++++++++++ 8 files changed, 174 insertions(+) create mode 100644 .env create mode 100644 .idea/.gitignore create mode 100644 .idea/Reports-Visual.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.env b/.env new file mode 100644 index 0000000..28c0ea8 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +MYSQL_HOST="172.17.1.21" +MYSQL_USER="root" +MYSQL_PASSWORD="N53yBCswuawzBzS445VNAhWVMs3N59Gb9szEsrzXRBzarDqpdETpQeyt5v5CGe" +MYSQL_DATABASE="Kunden" +MYSQL_AUTH='mysql_native_password' \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/Reports-Visual.iml b/.idea/Reports-Visual.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/Reports-Visual.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a6218fe --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e5c6f48 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.py b/main.py index e69de29..3c8fb82 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,131 @@ +import streamlit as st +import pandas as pd +import mysql.connector +from datetime import datetime +import os +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + + +# Function to get filtered data from the database +def get_filtered_data(customer_id, service_id, start_date, end_date): + mydb = mysql.connector.connect( + host=os.getenv("MYSQL_HOST"), + user=os.getenv("MYSQL_USER"), + password=os.getenv("MYSQL_PASSWORD"), + database=os.getenv("MYSQL_DATABASE") + ) + + # Prepare the query + query = f""" + SELECT DATE_FORMAT(sr.reportingdate, '%Y-%m') AS month, + COUNT(DISTINCT sr.username) as count + FROM Kunden.`services.reporting` sr + JOIN Kunden.services s ON sr.service_ID = s.service_ID + WHERE sr.customer_ID = {customer_id} + AND sr.service_ID = {service_id} + AND sr.username NOT LIKE '%admin%' + AND sr.username NOT LIKE '%test%' + AND sr.reportingdate BETWEEN '{start_date}' AND '{end_date}' + GROUP BY DATE_FORMAT(sr.reportingdate, '%Y-%m') + ORDER BY DATE_FORMAT(sr.reportingdate, '%Y-%m'); + """ + + service_reporting = pd.read_sql_query(query, mydb) + mydb.close() + return service_reporting + + +# Fetch initial data for default selections +def get_initial_data(): + mydb = mysql.connector.connect( + host=os.getenv("MYSQL_HOST"), + user=os.getenv("MYSQL_USER"), + password=os.getenv("MYSQL_PASSWORD"), + database=os.getenv("MYSQL_DATABASE") + ) + # Fetch unique service IDs and names + service_id_query = """ + SELECT DISTINCT s.service_ID, s.name + FROM Kunden.`services.reporting` sr + JOIN Kunden.services s ON sr.service_ID = s.service_ID + """ + service_ids = pd.read_sql_query(service_id_query, mydb) + + # Fetch customer information + customer_query = """ + SELECT c.customer_ID, c.customer, co.companyname + FROM Kunden.company co + JOIN Kunden.customers c ON co.customer_ID = c.customer_ID + JOIN Kunden.`services.reporting` sr ON sr.customer_ID = co.customer_ID + GROUP BY c.customer_ID, c.customer, co.companyname; + """ + customers = pd.read_sql_query(customer_query, mydb) + + # Fetch date range + date_query = """ + SELECT MIN(reportingdate) AS min_date, MAX(reportingdate) AS max_date + FROM Kunden.`services.reporting` + """ + date_range = pd.read_sql_query(date_query, mydb) + mydb.close() + + return service_ids, customers, date_range + + +# Get initial data for widgets +initial_service_ids, customers, initial_date_range = get_initial_data() + + +# Combine service_ID and name for display +service_options = initial_service_ids.apply(lambda row: f"{row['service_ID']} - {row['name']}", axis=1) + +# Add selection widget for customer ID +selected_customer = st.selectbox( + 'Select Customer', + customers.apply(lambda row: f"{row['customer_ID']} - {row['companyname']} - {row['customer']}", axis=1).tolist() +) + +# Extract customer_ID from selected option +selected_customer_id = int(selected_customer.split(' - ')[0]) + +# Add selection widget for service ID +selected_service = st.selectbox( + 'Select Service', + service_options.tolist() +) + +# Extract service_ID from selected option +selected_service_id = int(selected_service.split(' - ')[0]) + +# Convert date range to datetime objects +min_date = initial_date_range['min_date'][0] +max_date = initial_date_range['max_date'][0] + +# Add date range selection widget +selected_date_range = st.date_input( + 'Select date range', + value=[min_date, max_date], + min_value=min_date, + max_value=max_date +) + +# Format the selected dates as 'YYYY-MM-DD' +start_date_str = selected_date_range[0].strftime("%Y-%m-%d") +end_date_str = selected_date_range[1].strftime("%Y-%m-%d") + +# Add a button to apply filters +if st.button('Apply Filters'): + # Fetch filtered data from the database + filtered_data = get_filtered_data(selected_customer_id, selected_service_id, start_date_str, end_date_str) + + # Sort the data by month + filtered_data = filtered_data.sort_values('month') + + # Create a bar chart with the filtered data + if not filtered_data.empty: + st.bar_chart(filtered_data.set_index('month')['count']) + else: + st.write("No data available for the selected filters.")