import streamlit as st import pandas as pd import subprocess import mysql.connector from datetime import datetime, timedelta import os from dotenv import load_dotenv load_dotenv() total_time_unit = [] def get_filtered_users(customer_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 base query with date filter query = f""" SELECT number, title, createdate, time FROM Kunden.tickets WHERE createdate BETWEEN '{start_date}' AND '{end_date}' """ if customer_id: query += f" AND customer_ID = {customer_id}" query += " ORDER BY createdate" users = pd.read_sql_query(query, mydb) mydb.close() # Format date columns for column in users.select_dtypes(include=['datetime64[ns]', 'datetime64[ns, UTC]']).columns: users[column] = users[column].dt.strftime('%d.%m.%Y') # Convert 'time' to integer users.iloc[:, 3] = users.iloc[:, 3].str.split('.').str[0] users['time'] = users['time'].astype(int) # Create hyperlink for ticket number base_url = "https://ticket.stines.de/#ticket/zoom/number/" users['Link'] = users['number'].apply(lambda x: f'{x}') return users 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 s """ service_ids = pd.read_sql_query(service_id_query, mydb) # Fetch customer information customer_query = """ SELECT DISTINCT c.customer_ID, c.customer, co.companyname FROM Kunden.company co JOIN Kunden.customers c ON co.customer_ID = c.customer_ID """ customers = pd.read_sql_query(customer_query, mydb) mydb.close() return service_ids, customers def run_script_and_list_documents(): output_area = st.empty() # Placeholder for output document_paths = [] # List to store generated document paths # Directory where the script should be run working_directory = "apps/ticket_export/exports" # Run the script in the specified directory result = subprocess.run( ["python3", "apps/ticket_export/main.py"], capture_output=True, text=True ) # Search for generated documents in the working directory for filename in os.listdir(working_directory): if filename.endswith(".docx"): full_path = os.path.join(working_directory, filename) document_paths.append(full_path) # Display the list of generated documents and offer them for download if document_paths: st.write("Generated Documents:") for doc_path in document_paths: with open(doc_path, "rb") as file: st.download_button( label=f"Download {os.path.basename(doc_path)}", data=file, file_name=os.path.basename(doc_path), mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) else: st.write("No documents found.") def ticket_filter(): st.title("Ticket Filter :mag_right:") # Get initial data for widgets initial_service_ids, customers = get_initial_data() # Add selection widget for customer ID selected_customer = st.selectbox( 'Select Customer', ["All"] + customers.apply(lambda row: f"{row['customer_ID']} - {row['companyname']} - {row['customer']}", axis=1).tolist() ) # Extract customer_ID from selected option selected_customer_id = None if selected_customer == "All" else int(selected_customer.split(' - ')[0]) # Add date range picker start_date = st.date_input("Start Date", datetime.now() - timedelta(days=30)) end_date = st.date_input("End Date", datetime.now()) if st.button("Create Invoice"): st.write("Running the script...") run_script_and_list_documents() # Add a button to apply filters if st.button('Apply Filters'): if start_date > end_date: st.error("Error: End date must be greater than or equal to start date.") else: # Fetch filtered data from the database filtered_data = get_filtered_users(selected_customer_id, start_date, end_date) if not filtered_data.empty: st.markdown(filtered_data.to_html(escape=False), unsafe_allow_html=True) # Convert DataFrame to CSV csv = filtered_data.drop(columns=['Link']).to_csv(index=False) st.write(f"Total Time Unit: {filtered_data['time'].sum()}") # Create a download button with a custom file name st.download_button( label="Download CSV", data=csv, file_name=f"filtered_data_{selected_customer}.csv", # Custom file name mime='text/csv', ) else: st.write("No data available for the selected filters.") if __name__ == "__main__": ticket_filter()