CoolFace
Apppublic

Muhammadrafique92/Security_tracker_demo

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
app.py242 linesDownload Raw Back to root
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")