import streamlit as st import os import mysql.connector import pandas as pd import plotly.express as px import seaborn as sns import matplotlib.pyplot as plt # st.set_page_config(page_title="TALENTRA", layout="wide", initial_sidebar_state="collapsed") # Fungsi untuk mendapatkan gambar sebagai base64 def get_image_as_base64(image_path): import base64 with open(image_path, "rb") as img_file: return base64.b64encode(img_file.read()).decode("utf-8") def navbar(): logo_path = os.path.join(os.path.dirname(__file__), "../asset/logo.png") st.markdown( f""" """, unsafe_allow_html=True) col1, col2 = st.columns([10, 1]) with col1: st.markdown(f""" ", unsafe_allow_html=True) def menu(): if "page" not in st.session_state: st.session_state["page"] = "Home" # **Gunakan Streamlit Columns agar Navbar Sejajar (3 Kolom)** col2, col3, col4 = st.columns([1.5, 1.5, 1.5]) # 3 Kolom (Tanpa col5) # **Custom CSS untuk Tombol Navbar yang Spesifik** st.markdown( """ """, unsafe_allow_html=True ) # Tombol navigasi dengan warna berbeda di col2, col3, col4 with col2: if st.button("Prediksi", key="nav_prediksi"): st.switch_page("pages/Prediksi.py") # Pindah ke halaman yang sudah ada with col3: if st.button("Dashboard", key="nav_dashboard"): st.switch_page("pages/Dashboard.py") # Pindah ke halaman yang sesuai with col4: if st.button("Laporan", key="nav_laporan"): st.switch_page("pages/Laporan.py") # Pindah ke halaman laporan def connect_to_db(): try: conn = mysql.connector.connect( host=st.secrets["mysql"]["host"], user=st.secrets["mysql"]["user"], password=st.secrets["mysql"]["password"], database=st.secrets["mysql"]["dbname"], port=st.secrets["mysql"]["port"] ) return conn except mysql.connector.Error as e: st.error(f"Koneksi ke database gagal: {e}") return None def get_all_employee_data(filter_employee_id=None, filter_join_date=None): conn = connect_to_db() if conn: try: query = """ SELECT employee_id AS ID_Karyawan, Nama, domisili as Domisili, jenis_kelamin as Jenis_Kelamin, join_date as Tanggal_Masuk, resign_date as Tanggal_Keluar, marriage_stat as Status_Pernikahan, dependant as Jumlah_Tanggungan, education as Pendidikan, absent_90D as Absen_90Hari, avg_time_work as Rata_Rata_Jam_Kerja, departemen as Departemen, position as Posisi, income as Penghasilan, total_komp as Total_Komplain, job_satisfaction as Kepuasan_Kerja, performance_rating as Kinerja_Kerja FROM data_employee_db WHERE 1=1""" params = [] if filter_employee_id: query += " AND employee_id LIKE %s" params.append(f"%{filter_employee_id}%") if filter_join_date: query += " AND join_date >= %s" params.append(filter_join_date) df = pd.read_sql(query, conn, params=params) return df except mysql.connector.Error as e: st.error(f"Terjadi kesalahan saat mengambil data: {e}") return pd.DataFrame() finally: conn.close() def get_joined_employee_data(filter_employee_id=None): conn = connect_to_db() if conn: try: query = """ SELECT e.employee_id as ID_Karyawan, e.comment AS Komplain, s.job_satisfaction AS Skor_Kepuasan_Kerja, s.performance_rating AS Skor_Kinerja_Kerja FROM employee_comments e INNER JOIN data_employee_db s ON e.employee_id = s.employee_id WHERE 1=1 """ params = [] if filter_employee_id: query += " AND e.employee_id LIKE %s" params.append(f"%{filter_employee_id}%") df = pd.read_sql(query, conn, params=params) return df except mysql.connector.Error as e: st.error(f"Terjadi kesalahan saat mengambil data: {e}") return pd.DataFrame() finally: conn.close() def show_exploration(): navbar() menu() st.markdown(""" """, unsafe_allow_html=True) st.markdown( """

Lihat dan Temukan Informasi yang Anda Inginkan

""", unsafe_allow_html=True ) # Dropdown menu menu_option = st.selectbox( "Pilih Menu", ["Lihat Semua Informasi Karyawan", "Lihat Data Komplain Karyawan"] ) # Pilihan menu if menu_option == "Lihat Semua Informasi Karyawan": col1, col2 = st.columns(2) with col1: filter_employee_id = st.text_input("Filter berdasarkan ID Karyawan", placeholder="Contoh: EM12345") with col2: filter_join_date = st.date_input("Filter berdasarkan Tanggal Masuk", value=None) df = get_all_employee_data(filter_employee_id, filter_join_date) if not df.empty: st.dataframe(df) csv = df.to_csv(index=False) st.download_button( label="Download Data sebagai CSV", data=csv, file_name="data_employee_db.csv", mime="text/csv", ) else: st.write("Tidak ada data yang tersedia di tabel data_employee_db.") st.markdown( """

Analisis Visual Distribusi Karyawan

""", unsafe_allow_html=True ) # Layout untuk dua grafik per baris col1, col2 = st.columns(2) with col1: st.markdown( """
Distribusi Karyawan Berdasarkan Status Pernikahan
""", unsafe_allow_html=True ) fig_marriage = px.histogram( df, x="Status_Pernikahan", labels={"Status_Pernikahan": "Status Pernikahan", "count": "Jumlah Karyawan"} ) fig_marriage.update_layout(xaxis_title="Status Pernikahan", yaxis_title="Jumlah") st.plotly_chart(fig_marriage, use_container_width=True) with col2: st.markdown( """
Distribusi Karyawan Berdasarkan Pendidikan
""", unsafe_allow_html=True ) fig_education = px.histogram( df, x="Pendidikan", labels={"Pendidikan": "Pendidikan", "count": "Jumlah Karyawan"} ) fig_education.update_layout(xaxis_title="Pendidikan", yaxis_title="Jumlah") st.plotly_chart(fig_education, use_container_width=True) col1, col2 = st.columns(2) with col1: st.markdown( """
Distribusi Karyawan Berdasarkan Domisili
""", unsafe_allow_html=True ) fig_domisili = px.histogram( df, x="Domisili", labels={"Domisili": "Domisili", "count": "Jumlah Karyawan"} ) fig_domisili.update_layout(xaxis_title="Domisili", yaxis_title="Jumlah") st.plotly_chart(fig_domisili, use_container_width=True) with col2: st.markdown( """
Distribusi Karyawan Berdasarkan Departemen
""", unsafe_allow_html=True ) fig_department = px.histogram( df, x="Departemen", labels={"Departemen": "Departemen", "count": "Jumlah Karyawan"} ) fig_department.update_layout(xaxis_title="Departemen", yaxis_title="Jumlah") st.plotly_chart(fig_department, use_container_width=True) elif menu_option == "Lihat Data Komplain Karyawan": filter_employee_id = st.text_input("Filter berdasarkan ID Karyawan", placeholder="Contoh: EM12345") df = get_joined_employee_data(filter_employee_id) if not df.empty: st.dataframe(df) # Tombol download csv = df.to_csv(index=False) st.download_button( label="Download Data sebagai CSV", data=csv, file_name="joined_employee_data.csv", mime="text/csv", ) else: st.write("Tidak ada data gabungan yang tersedia.") # Footer st.markdown( """ """, unsafe_allow_html=True ) # Jalankan fungsi show_exploration if __name__ == "__main__": show_exploration()