SakshithBillava/My_app
0
1import streamlit as st2import pandas as pd3import numpy as np4from bokeh.plotting import figure5import streamlit_authenticator as stauth6import pymongo7import database as dbase8import updation as upd9from PIL import Image10from streamlit_option_menu import option_menu11from streamlit_custom_notification_box import custom_notification_box as scnb12import matplotlib.pyplot as plt13import plotly.express as px14import seaborn as sns 15 16 17original_title = '<p style="font-family:Bodoni MT Black; color:white; font-size: 60px;">EXPENSE MANAGER</p>'18st.markdown(original_title,unsafe_allow_html=True)19 20login = Image.open("login.jpg")21#names = ['sakshith','shaun','abcd']22#usernames = ['sakshith2002','rds','abd17']23#password = ['2002','2001','2003']24 25bckg_img = """26<style> 27[data-testid = "stAppViewContainer"] {28background-image: url("https://wallpaperaccess.com/full/2200497.jpg");29background-size = cover;30}31 32</style>33"""34#st.markdown(bckg_img, unsafe_allow_html=True)35 36def update():37 st.session_state.confirm_add_user = True38 if(st.session_state.confirm_add_user==True and len(st.session_state.l)==3):39 upd.update_user(st.session_state.l[0],st.session_state.l[1],st.session_state.l[2])40 st.sidebar.success("New user aded successfully")41 st.sidebar.warning("LOGIN TO CONTINUE")42 43 st.session_state.category_dict = {44 "Username": st.session_state.username,45 "Food": 0,46 "Rent": 0,47 "Lifestyle": 0,48 "Travel": 049 }50 collection4.insert_one(st.session_state.category_dict)51 st.session_state.confirm_add_user = False52 53 54 55@st.cache_resource56def init_connection():57 return pymongo.MongoClient(**st.secrets["mongo"])58client = pymongo.MongoClient("mongodb+srv://sakshith2002:admin@cluster0.frpdmtc.mongodb.net/?retryWrites=true&w=majority")59 60db = client.Expenses61collection2 = db.user_credentials62st.session_state.get_cred_item = list(db.user_credentials.find())63collection3 = db.user_expenses64st.session_state.get_user_data = list(db.user_expenses.find())65collection4 = db.user_expense_data66st.session_state.get_user_portfolio = list(db.user_expense_data.find())67 68if "username" not in st.session_state:69 st.session_state.username = ""70st.session_state.current_user_portfolio = []71for i in st.session_state.get_user_portfolio:72 if(st.session_state.username==i['Username']):73 st.session_state.current_user_portfolio.append(i)74 75if "was_logged_in" not in st.session_state:76 st.session_state.was_logged_in = False77 78 79 80d = {}81d2 = {}82for i in st.session_state.get_cred_item:83 d1 = {}84 d1["name"] = i['names']85 d1["password"] = i['password']86 d2[i['username']] = d187 88d["usernames"] = d289 90st.session_state.list_of_usernames = []91for i in st.session_state.get_cred_item:92 st.session_state.list_of_usernames.append(i['username'])93 94#print(st.session_state.list_of_usernames)95 96if "login" not in st.session_state:97 st.session_state.login = True98 99 100credentials = {101 "usernames":{102 "sakshith2002":{103 "name":"sakshith",104 "password":"$2b$12$EsUyWrvHb.JUaz5L8G8x6uG5zi73ZhxS7Dhn61IwlQJqwGzJns.Ea"105 },106 "rds":{107 "name":"shaun",108 "password":"$2b$12$TErpIHkdK0k7B7JQS6dlMevhry4hduFo3rtTN6UW800B7wgRA8Xy6"109 },110 "hg":{111 "name":"abcd",112 "password":"$2b$12$CSi12pOLeLmDTeZZDitQYuY8tEGGpS85l5awPuDluYq5WPDUFkVRu"113 } 114 }115 }116 117st.session_state.authenticator = stauth.Authenticate(d,"expense_cookie","abcdef",cookie_expiry_days=10)118if "input_display" not in st.session_state:119 st.session_state.input_display = True120def add_new_user(): 121 if(st.session_state.display and st.session_state.input_display and st.session_state.isLogged==False):122 st.session_state.l = []123 st.session_state.name = st.text_input("Enter your Name",key = 1)124 st.session_state.username = st.text_input("Enter your Username",key = 2)125 st.session_state.password = st.text_input("Enter the Password",key = 3, type = "password")126 if(st.session_state.username!="" and st.session_state.name!="" and st.session_state.password!=""):127 st.session_state.l.append(st.session_state.username)128 st.session_state.l.append(st.session_state.name)129 st.session_state.l.append(st.session_state.password)130 if(st.button("SIGN UP") and len(st.session_state.l)==3):131 st.session_state.input_display = False132 update()133 #st.warning("LOGIN TO CONTINUE")134 135 136 137 #if(st.session_state.confirm_add):138 # st.warning("LOGIN TO CONTINUE")139if "isLogged" not in st.session_state:140 st.session_state.isLogged = False141with st.sidebar:142 st.session_state.selected = option_menu("User Menu", ["Home","Login", 'Sign Up(New user)',"About"], 143 icons=["house",'unlock', 'person',"info"], menu_icon="cast",default_index = 1)144 145 if "confirm_add_user" not in st.session_state:146 st.session_state.confirm_add_user = False147 if "display" not in st.session_state:148 st.session_state.display = False149 if(len(st.session_state.selected)!=0):150 st.session_state.display = True151 152 if(st.session_state.selected=="Sign Up(New user)" and st.session_state.display):153 #st.session_state.input_display = True154 if(st.session_state.isLogged == True):155 st.warning("PLEASE LOGOUT TO ADD NEW USER")156 if(st.session_state.input_display == False):157 st.success("LOGIN TO CONTINUE")158 st.warning("User already added")159 st.session_state.added = add_new_user()160 161 elif(st.session_state.selected == "About"):162 text = '<p style=" color:white; font-size: 15px;"><b>This is an Expenser Manager <br> where you can manage all your<br>expense in one place.</b></p>'163 st.markdown(text,unsafe_allow_html=True)164 165 166 elif(st.session_state.selected=="Login"):167 #authenticator = stauth.Authenticate(credentials,"expense_cookie","abcdef",cookie_expiry_days=1)168 169 st.session_state.name,st.session_state.authentication_status,st.session_state.username = st.session_state.authenticator.login("login","main")170 if(st.session_state.authenticator.logout("LOGOUT","sidebar")):171 st.session_state.login = False172 st.session_state.isLogged = False173 st.session_state.was_logged_in = False174 175 if(st.session_state.authentication_status):176 st.session_state.isLogged = True177 st.session_state.was_logged_in = True178 st.success("SUCCESSFULLY LOGGED IN")179 st._main.success("Welcome " + st.session_state.name)180 st.balloons()181 else:182 st.session_state.isLogged = False183 st.write("Logged Out")184 #@st.experimental_singleton 185 collection1 = db.myexpense186 187if(st.session_state.authentication_status and st.session_state.selected=="Login"):188 #login_success = Image.open("login_success.png")189 #st.image(login_success)190 bckg_img_for_login = """191 <style>192 [data-testid = "stAppViewContainer"] {193 background-image: url("https://images.pexels.com/photos/9486675/pexels-photo-9486675.jpeg?cs=srgb&dl=pexels-rocketmann-team-9486675.jpg&fm=jpg");194 background-size: cover;195 }196 [data-testid = "stHeader"]{197 background-color: rgba(0,0,0,0);198 }199 [data-testid = "stToolbar"]{200 right: 2rem;201 }202 </style>203 """204 st.markdown(bckg_img_for_login,unsafe_allow_html=True)205 206elif(st.session_state.isLogged==False and st.session_state.selected=="Login"):207 bckg_img_for_login = """208 <style>209 [data-testid = "stAppViewContainer"] {210 background-image: url("https://i.ibb.co/zS7XKNR/login-to-continue-1.png");211 background-size = cover;212 }213 [data-testid = "stHeader"]{214 background-color: rgba(0,0,0,0);215 }216 [data-testid = "stToolbar"]{217 right: 2rem;218 }219 </style>220 """221 st.markdown(bckg_img_for_login, unsafe_allow_html=True)222elif(st.session_state.selected=="Sign Up(New user)"):223 #sign_up = Image.open("sign_up.png")224 #sign_up_text = Image.open("sign_up_text.jpg")225 #st.image(sign_up)226 #st.image(sign_up_text) 227 bckg_img_for_sign_up = """228 <style>229 [data-testid = "stAppViewContainer"] {230 background-image: url("https://i.ibb.co/b3KC8xG/PLEASE-SIGN-UP-1-1.png");231 background-size : cover;232 }233 [data-testid = "stHeader"]{234 background-color: rgba(0,0,0,0);235 }236 [data-testid = "stToolbar"]{237 right: 2rem;238 }239 </style>240 """ 241 st.markdown(bckg_img_for_sign_up,unsafe_allow_html=True)242if(st.session_state.selected=="Home" and st.session_state.isLogged==False):243 bckg_img_for_home = """244 <style>245 [data-testid = "stAppViewContainer"] {246 background-image: url("https://img.freepik.com/premium-vector/success-money-motivational-quotes-white-black-background-vector-script-lettering-as-t-shirt-print-poster-banner-greeting-card-time-is-money-keep-calm-business-finance-concept_504907-329.jpg?w=2000");247 background-size : cover;248 }249 [data-testid = "stHeader"]{250 background-color: rgba(0,0,0,0);251 }252 [data-testid = "stToolbar"]{253 right: 2rem;254 }255 </style>256 """ 257 st.markdown(bckg_img_for_home,unsafe_allow_html=True)258 259if "click" not in st.session_state:260 st.session_state.click = False261 262if "goOn" not in st.session_state:263 st.session_state.goOn = False264 265def callback():266 st.session_state.click = True267 268 269def Commit():270 st.session_state.click = False271 st.session_state.confirm = True272 if(st.session_state.confirm):273 collection3.insert_one(st.session_state.item)274 st.session_state.goOn = True275 st.session_state.confirm = False276 277def Commit_user_expense_data(case,updated_value):278 if(case==1):279 st.session_state.new_data = {"$set": {"Food": updated_value}}280 collection4.update_one(st.session_state.previous_query,st.session_state.new_data)281 elif(case==2):282 st.session_state.new_data = {"$set": {"Rent": updated_value}}283 collection4.update_one(st.session_state.previous_query,st.session_state.new_data)284 elif(case==3):285 st.session_state.new_data = {"$set": {"Lifestyle": updated_value}}286 collection4.update_one(st.session_state.previous_query,st.session_state.new_data)287 elif(case==4):288 st.session_state.new_data = {"$set": {"Travel": updated_value}}289 collection4.update_one(st.session_state.previous_query,st.session_state.new_data)290 291def cancel_clicked():292 st.session_state.click = False293 294if "proceed_with_user_expense_data" not in st.session_state:295 st.session_state.proceed_with_user_expense_data = False296 297if(st.session_state.authentication_status==True and st.session_state.selected =="Home" ):298 if(st.button("CLICK HERE TO ADD YOUR EXPENSE OR INCOME",on_click=callback) or st.session_state.click):299 st.button("CANCEL",on_click=cancel_clicked)300 options = ["Income","Expenditure"]301 def Income():302 st.session_state.option = 1303 def Expenditure():304 st.session_state.option = 0305 type = st.radio("Select the appropriate",options=options)306 if(type=="Income"):307 Income()308 else:309 Expenditure()310 if(st.session_state.option==0):311 category = ["Food","Rent","Lifestyle","Travel"]312 st.session_state.category_input = st.radio("Select the category",options=category)313 if(st.session_state.option==1):314 st.session_state.income = st.number_input("Enter the income amount")315 else:316 st.session_state.expense = st.number_input("Enter the expense amount")317 st.session_state.date = st.date_input("Date of transaction")318 st.session_state.date = st.session_state.date.strftime('%m/%d/%Y')319 320 if(st.session_state.option==1):321 st.session_state.item = {322 "Username": st.session_state.username,323 "Option": st.session_state.option,324 "Category": "NA",325 "Amount": st.session_state.income,326 "Date": st.session_state.date327 }328 elif(st.session_state.option==0): 329 st.session_state.item = {330 "Username": st.session_state.username,331 "Option": st.session_state.option,332 "Category": st.session_state.category_input,333 "Amount": st.session_state.expense,334 "Date": st.session_state.date335 }336 337 st.button("CONFIRM",on_click=Commit)338 339def done():340 if(st.session_state.option==0):341 if(st.session_state.category_input=="Food"):342 st.session_state.previous_query = {"Username": st.session_state.username,"Food": st.session_state.current_user_portfolio[0]["Food"]}343 st.session_state.updated_food_cost = st.session_state.current_user_portfolio[0]["Food"] + st.session_state.expense344 case=1345 Commit_user_expense_data(case,st.session_state.updated_food_cost)346 st.session_state.goOn=False347 elif(st.session_state.category_input=="Rent"):348 st.session_state.previous_query = {"Username": st.session_state.username,"Rent": st.session_state.current_user_portfolio[0]["Rent"]}349 st.session_state.updated_rent_cost = st.session_state.current_user_portfolio[0]["Rent"] + st.session_state.expense350 case=2351 Commit_user_expense_data(case,st.session_state.updated_rent_cost)352 st.session_state.goOn=False353 elif(st.session_state.category_input=="Lifestyle"):354 st.session_state.previous_query = {"Username": st.session_state.username,"Lifestyle": st.session_state.current_user_portfolio[0]["Lifestyle"]}355 st.session_state.updated_lifestyle_cost = st.session_state.current_user_portfolio[0]["Lifestyle"] + st.session_state.expense356 case=3357 Commit_user_expense_data(case,st.session_state.updated_lifestyle_cost)358 st.session_state.goOn=False359 elif(st.session_state.category_input=="Travel"):360 st.session_state.previous_query = {"Username": st.session_state.username,"Travel": st.session_state.current_user_portfolio[0]["Travel"]}361 st.session_state.updated_travel_cost = st.session_state.current_user_portfolio[0]["Travel"] + st.session_state.expense362 case=4363 Commit_user_expense_data(case,st.session_state.updated_travel_cost)364 st.session_state.goOn=False365 366if(st.session_state.goOn==True):367 done()368 369 370 371#print(st.session_state.username)372#print(st.session_state.get_user_data)373st.session_state.current_user_data = []374for i in st.session_state.get_user_data:375 if(i["Username"]==st.session_state.username):376 st.session_state.current_user_data.append(i)377 378#print(st.session_state.current_user_data)379st.session_state.user_budget = 0380for i in st.session_state.current_user_data:381 if(i['Option']==1):382 st.session_state.user_budget += i['Amount']383#print(st.session_state.user_budget)384 385st.session_state.category_dict = {}386st.session_state.user_dataframe = pd.DataFrame.from_dict(st.session_state.current_user_data)387 388for i in st.session_state.current_user_portfolio:389 st.session_state.category_dict["Food"] = i["Food"]390 st.session_state.category_dict["Rent"] = i["Rent"]391 st.session_state.category_dict["Lifestyle"] = i["Lifestyle"]392 st.session_state.category_dict["Trvel"] = i["Travel"]393 394 395st.session_state.users_expense_category = []396st.session_state.users_expense_amounts = []397sizes = st.session_state.users_expense_amounts398labels = st.session_state.users_expense_category 399for i,j in st.session_state.category_dict.items():400 st.session_state.users_expense_category.append(i)401 st.session_state.users_expense_amounts.append(j)402 403#print(st.session_state.users_expense_category)404#print(st.session_state.users_expense_amounts)405if(st.session_state.selected=="About"):406 bckg_img_for_about = """407 <style>408 [data-testid = "stAppViewContainer"] {409 background-image: url("https://w0.peakpx.com/wallpaper/730/772/HD-wallpaper-dollars-dark-money-us-dollars-us.jpg");410 background-size : auto;411 }412 [data-testid = "stHeader"]{413 background-color: rgba(0,0,0,0);414 }415 [data-testid = "stToolbar"]{416 right: 2rem;417 }418 </style>419 """ 420 st.markdown(bckg_img_for_about,unsafe_allow_html=True)421 422 423try:424 if(len(st.session_state.users_expense_amounts)!=0 and st.session_state.selected=="Home"):425 col1,col2,col3 = st.columns(3)426 coll1,coll2,coll3 = st.columns(3)427 st.session_state.total_expense = sum(sizes)428 st.session_state.budget_left = st.session_state.user_budget-st.session_state.total_expense429 st.session_state.budget_percentage_left = f'{(st.session_state.budget_left*100)/st.session_state.user_budget}%'430 st.session_state.budget_percentage_spent = f'{(st.session_state.total_expense*100)/st.session_state.user_budget}%'431 col1.metric("TOTAL BUDGET",st.session_state.user_budget,'100%')432 col2.metric("TOTAL SPENT",st.session_state.total_expense,st.session_state.budget_percentage_spent)433 col3.metric("BUDGET LEFT",st.session_state.budget_left,st.session_state.budget_percentage_left)434 coll1.metric("BUDGET SPENT PERCENTAGE",st.session_state.budget_percentage_spent)435 coll2.metric("BUDGET LEFT PERCENTAGE",st.session_state.budget_percentage_left)436 if(st.session_state.total_expense>st.session_state.user_budget):437 """ALERT!! 438 Your budget has gone over limit"""439 440 cols = st.columns([1, 1])441 with cols[0]:442 fig1 = px.pie(values=sizes,names=labels,hover_name=labels)443 fig1.update_layout(margin = dict(l=1,r=1,b=1,t=1),width=400,height=400 ,font=dict(color='#383635',size=15))444 st.write(fig1)445 446 with cols[1]:447 ll = []448 ll.append(sizes)449 chart_data = pd.DataFrame(450 np.array(ll),451 columns=labels)452 453 st.bar_chart(chart_data)454 455 dict_of_items = {}456 dict_of_items['Category'] = labels457 dict_of_items['Amount Spent'] = sizes458 new_df = pd.DataFrame.from_dict(dict_of_items)459 new_df = new_df.set_index('Category')460 fig4 = st.bar_chart(new_df,height=400,width=100,)461 462 463 updated_df = st.session_state.user_dataframe.drop('_id',axis=1)464 st.table(updated_df)465 466except KeyError as e:467 pass 468except ZeroDivisionError as er:469 pass470 471 472 473 474 475 476 