Muhammadrafique92/Security_tracker_demo
0
1import streamlit as st2import pandas as pd3from datetime import datetime4 5# App configuration6st.set_page_config(page_title="Security Management Portal", layout="wide")7st.title("๐ก๏ธ Security Management Portal")8 9# Sidebar navigation10menu = ["Home", "Work Order Entry", "Work Orders Dashboard"]11choice = st.sidebar.radio("Select Option", menu)12 13# Initialize session state with different columns for each category14if "work_orders" not in st.session_state:15 st.session_state.work_orders = pd.DataFrame(columns=[16 "WO Number", "Date", "Type", "Site ID", "Start Date", "Close Date", "Visitor Name", 17 "Visitor CNIC", "Visitor Cell", "Company", "Approver", "Approved via", 18 "Activity Type", "Remarks", "FSR#", "Fuel Poured", "Quantity", 19 "Fuel Inhand", "Vehicle#", "Hardware Detail", "To/Destination"20 ])21 22# Function to generate WO number23def generate_wo_number():24 timestamp = datetime.now().strftime("%Y%m%d%H%M%S")25 counter = len(st.session_state.work_orders) + 126 return f"WO{timestamp}{counter:03d}"27 28# Home Page29if choice == "Home":30 st.subheader("Welcome to the Security Access Management Portal")31 st.write("""32 This portal helps manage and track **site access requests** for:33 - ๐ **Access**: Site entry permissions and visitor management34 - โฝ **Fueling**: Vehicle fueling operations and fuel tracking35 - ๐ฆ **Hardware Movement**: Equipment transfer and hardware logistics36 37 Use the sidebar to create or view Work Orders.38 """)39 40 # Display summary statistics41 if not st.session_state.work_orders.empty:42 col1, col2, col3, col4 = st.columns(4)43 44 total_orders = len(st.session_state.work_orders)45 access_orders = len(st.session_state.work_orders[st.session_state.work_orders['Type'] == 'Access'])46 fueling_orders = len(st.session_state.work_orders[st.session_state.work_orders['Type'] == 'Fueling'])47 hardware_orders = len(st.session_state.work_orders[st.session_state.work_orders['Type'] == 'Hardware Movement'])48 49 col1.metric("Total Orders", total_orders)50 col2.metric("Access", access_orders)51 col3.metric("Fueling", fueling_orders)52 col4.metric("Hardware Movement", hardware_orders)53 54# Work Order Entry55elif choice == "Work Order Entry":56 st.subheader("Create New Work Order")57 58 # Work type selection59 work_type = st.selectbox("Select Work Type", ["Access", "Fueling", "Hardware Movement"])60 61 # Common fields for all types62 col1, col2 = st.columns(2)63 with col1:64 site_id = st.text_input("Site ID*")65 start_date = st.date_input("Start Date*")66 visitor_name = st.text_input("Visitor Name*")67 visitor_cnic = st.text_input("Visitor CNIC*")68 69 with col2:70 close_date = st.date_input("Close Date*")71 visitor_cell = st.text_input("Visitor Cell*")72 company = st.text_input("Company*")73 approver = st.text_input("Approver*")74 75 approved_via = st.selectbox("Approved via", ["Email", "SMS", "Phone", "WhatsApp"])76 77 # Category-specific fields78 if work_type == "Access":79 st.markdown("### ๐ Access Specific Details")80 col1, col2 = st.columns(2)81 with col1:82 activity_type = st.text_input("Activity Type")83 with col2:84 remarks = st.text_area("Remarks")85 86 # Set unused fields to empty87 fsr, fuel_poured, quantity, fuel_inhand, vehicle, hardware_detail, destination = "", "", "", "", "", "", ""88 89 elif work_type == "Fueling":90 st.markdown("### โฝ Fueling Specific Details")91 col1, col2, col3 = st.columns(3)92 with col1:93 fsr = st.text_input("FSR#")94 fuel_poured = st.number_input("Fuel Poured (L)", min_value=0.0, step=0.1)95 with col2:96 quantity = st.number_input("Quantity", min_value=0, step=1)97 fuel_inhand = st.number_input("Fuel Inhand (L)", min_value=0.0, step=0.1)98 with col3:99 vehicle = st.text_input("Vehicle#")100 101 remarks = st.text_area("Remarks")102 103 # Set unused fields to empty104 activity_type, hardware_detail, destination = "", "", ""105 106 elif work_type == "Hardware Movement":107 st.markdown("### ๐ฆ Hardware Movement Specific Details")108 col1, col2 = st.columns(2)109 with col1:110 hardware_detail = st.text_area("Hardware Detail")111 with col2:112 destination = st.text_input("To/Destination")113 114 remarks = st.text_area("Remarks")115 116 # Set unused fields to empty117 activity_type, fsr, fuel_poured, quantity, fuel_inhand, vehicle = "", "", "", "", "", ""118 119 # Create Work Order button120 if st.button("Create Work Order", type="primary"):121 # Validation122 required_fields = [site_id, start_date, close_date, visitor_name, visitor_cnic, visitor_cell, company, approver]123 124 if all(required_fields):125 # Generate WO number126 wo_number = generate_wo_number()127 128 new_wo = {129 "WO Number": wo_number,130 "Date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),131 "Type": work_type,132 "Site ID": site_id,133 "Start Date": start_date.strftime("%Y-%m-%d"),134 "Close Date": close_date.strftime("%Y-%m-%d"),135 "Visitor Name": visitor_name,136 "Visitor CNIC": visitor_cnic,137 "Visitor Cell": visitor_cell,138 "Company": company,139 "Approver": approver,140 "Approved via": approved_via,141 "Activity Type": activity_type,142 "Remarks": remarks,143 "FSR#": fsr,144 "Fuel Poured": fuel_poured,145 "Quantity": quantity,146 "Fuel Inhand": fuel_inhand,147 "Vehicle#": vehicle,148 "Hardware Detail": hardware_detail,149 "To/Destination": destination150 }151 152 st.session_state.work_orders = pd.concat(153 [st.session_state.work_orders, pd.DataFrame([new_wo])], 154 ignore_index=True155 )156 157 st.success(f"โ
{work_type} Work Order created successfully!")158 st.info(f"๐ **WO Number:** {wo_number} | **Site ID:** {site_id}")159 st.balloons()160 else:161 st.error("โ ๏ธ Please fill all required fields marked with *")162 163# Dashboard164elif choice == "Work Orders Dashboard":165 st.subheader("๐ Work Orders Dashboard")166 167 if st.session_state.work_orders.empty:168 st.info("No work orders created yet. Go to 'Work Order Entry' to create your first order.")169 else:170 # Filter options171 col1, col2, col3 = st.columns(3)172 with col1:173 type_filter = st.selectbox("Filter by Type", ["All", "Access", "Fueling", "Hardware Movement"])174 with col2:175 site_filter = st.text_input("Filter by Site ID")176 with col3:177 company_filter = st.text_input("Filter by Company")178 179 # Apply filters180 filtered_df = st.session_state.work_orders.copy()181 182 if type_filter != "All":183 filtered_df = filtered_df[filtered_df['Type'] == type_filter]184 185 if site_filter:186 filtered_df = filtered_df[filtered_df['Site ID'].str.contains(site_filter, case=False, na=False)]187 188 if company_filter:189 filtered_df = filtered_df[filtered_df['Company'].str.contains(company_filter, case=False, na=False)]190 191 # Display different columns based on type192 if type_filter == "Access":193 display_columns = ["WO Number", "Date", "Type", "Site ID", "Start Date", "Close Date", "Visitor Name", 194 "Visitor CNIC", "Visitor Cell", "Company", "Approver", "Approved via", 195 "Activity Type", "Remarks"]196 elif type_filter == "Fueling":197 display_columns = ["WO Number", "Date", "Type", "Site ID", "Start Date", "Close Date", "Visitor Name", 198 "Visitor CNIC", "Visitor Cell", "Company", "Approver", "Approved via", 199 "FSR#", "Fuel Poured", "Quantity", "Fuel Inhand", "Vehicle#", "Remarks"]200 elif type_filter == "Hardware Movement":201 display_columns = ["WO Number", "Date", "Type", "Site ID", "Start Date", "Close Date", "Visitor Name", 202 "Visitor CNIC", "Visitor Cell", "Company", "Approver", "Approved via", 203 "Hardware Detail", "To/Destination", "Remarks"]204 else:205 display_columns = filtered_df.columns.tolist()206 207 # Remove empty columns for cleaner display208 if not filtered_df.empty:209 non_empty_columns = []210 for col in display_columns:211 if col in filtered_df.columns and not filtered_df[col].astype(str).str.strip().eq('').all():212 non_empty_columns.append(col)213 214 st.dataframe(filtered_df[non_empty_columns], use_container_width=True)215 216 # Summary statistics217 st.markdown("### ๐ Summary Statistics")218 col1, col2, col3 = st.columns(3)219 220 with col1:221 st.metric("Total Filtered Records", len(filtered_df))222 with col2:223 unique_sites = filtered_df['Site ID'].nunique()224 st.metric("Unique Sites", unique_sites)225 with col3:226 unique_companies = filtered_df['Company'].nunique()227 st.metric("Unique Companies", unique_companies)228 229 # Download feature230 csv = filtered_df.to_csv(index=False).encode('utf-8')231 st.download_button(232 label="๐ฅ Download Filtered Data (CSV)",233 data=csv,234 file_name=f"work_orders_{type_filter}_{datetime.now().strftime('%Y%m%d')}.csv",235 mime="text/csv"236 )237 else:238 st.info("No records match the current filters.")239 240# Footer241st.markdown("---")242st.markdown("**๐ก๏ธ Security Management Portal** - Streamlit App for Work Order Management")