|
import pandas as pd |
|
import streamlit as st |
|
|
|
from functions import Functions, StreamlitFunctions |
|
from logs import logger |
|
|
|
|
|
def calculate_salary_parameters(): |
|
logger.info("Calculating based on Salary parameters") |
|
st.session_state.type_to_calculate = "salary_parameters" |
|
|
|
|
|
def calculate_initial_salary_parameter(): |
|
logger.info("Calculating based on Desired Salary") |
|
st.session_state.type_to_calculate = "desired_salary" |
|
|
|
|
|
def calculate_tax_on_current_salary(): |
|
logger.info("Calculating Tax on Current Salary") |
|
st.session_state.type_to_calculate = "tax_on_current_salary" |
|
|
|
|
|
def calculate_tax_on_yearly_salary(): |
|
logger.info("Calculating Tax on Yearly Salary") |
|
st.session_state.type_to_calculate = "tax_on_yearly_salary" |
|
|
|
|
|
StreamlitFunctions.initialize_session_values() |
|
StreamlitFunctions.print_tax_brackets() |
|
StreamlitFunctions.reset_tax_brackets() |
|
|
|
tab1, tab2, tab3, tab4 = st.tabs( |
|
[ |
|
"Tax on Monthly Salary", |
|
"Tax on Yearly Salary", |
|
"Final Desired Net Salary", |
|
"Desired Salary Calculation", |
|
] |
|
) |
|
|
|
with tab1: |
|
StreamlitFunctions.print_tax_on_current_salary() |
|
StreamlitFunctions.reset_tax_on_current_salary() |
|
st.button( |
|
"Calculate Tax on Current Salary", |
|
use_container_width=True, |
|
on_click=calculate_tax_on_current_salary, |
|
) |
|
|
|
with tab2: |
|
StreamlitFunctions.print_tax_on_yearly_salary() |
|
StreamlitFunctions.reset_tax_on_yearly_salary() |
|
st.button( |
|
"Calculate Tax on Yearly Salary", |
|
use_container_width=True, |
|
on_click=calculate_tax_on_yearly_salary, |
|
) |
|
|
|
with tab3: |
|
StreamlitFunctions.initial_salary_parameter() |
|
StreamlitFunctions.reset_initial_salary_parameter() |
|
st.button( |
|
"Calculate Based on Desired Net Salary", |
|
use_container_width=True, |
|
on_click=calculate_initial_salary_parameter, |
|
) |
|
|
|
with tab4: |
|
StreamlitFunctions.print_salary_parameters() |
|
StreamlitFunctions.reset_salary_parameters() |
|
st.button( |
|
"Calculate Based on Salary Parameters", |
|
use_container_width=True, |
|
on_click=calculate_salary_parameters, |
|
) |
|
|
|
if st.session_state.type_to_calculate is not None: |
|
if st.session_state.type_to_calculate == "tax_on_current_salary": |
|
initial_desired_net = Functions.calculated_current_salary_after_tax( |
|
st.session_state.tax_on_current_salary, st.session_state.tax_brackets |
|
) |
|
elif st.session_state.type_to_calculate == "tax_on_yearly_salary": |
|
initial_desired_net = Functions.calculated_yearly_salary_after_tax( |
|
st.session_state.tax_on_yearly_salary, st.session_state.tax_brackets |
|
) |
|
elif st.session_state.type_to_calculate == "desired_salary": |
|
initial_desired_net = st.session_state.user_initial_desired_net |
|
elif st.session_state.type_to_calculate == "salary_parameters": |
|
initial_desired_net = Functions.calculated_initial_desired_net( |
|
st.session_state.current_salary, |
|
st.session_state.desired_increment_percentage, |
|
st.session_state.daily_cost_of_travel, |
|
st.session_state.physical_days_per_week, |
|
) |
|
|
|
result = Functions.calculate_additional_amount( |
|
initial_desired_net, st.session_state.tax_brackets |
|
) |
|
|
|
|
|
st.markdown("---") |
|
if st.session_state.type_to_calculate == "tax_on_current_salary": |
|
st.success( |
|
"β
Calculation was done based on the selected value of 'Tax on Current Salary'" |
|
) |
|
summary_df = pd.DataFrame( |
|
{ |
|
"Parameter": [ |
|
"Current Salary", |
|
"Tax", |
|
"Gross Salary", |
|
], |
|
"Value": [ |
|
f"PKR {result['final_net_salary']:,.2f}", |
|
f"PKR {result['tax']:,.2f}", |
|
f"PKR {result['gross_salary_needed']:,.2f}", |
|
], |
|
} |
|
) |
|
elif st.session_state.type_to_calculate == "tax_on_yearly_salary": |
|
st.success( |
|
"β
Calculation was done based on the selected value of 'Tax on Yearly Salary'" |
|
) |
|
result = {key: value * 12 for key, value in result.items()} |
|
summary_df = pd.DataFrame( |
|
{ |
|
"Parameter": [ |
|
"Yearly Salary", |
|
"Yearly Tax", |
|
"Gross Yearly Salary", |
|
], |
|
"Value": [ |
|
f"PKR {result['final_net_salary']:,.2f}", |
|
f"PKR {result['tax']:,.2f}", |
|
f"PKR {result['gross_salary_needed']:,.2f}", |
|
], |
|
} |
|
) |
|
elif st.session_state.type_to_calculate == "desired_salary": |
|
st.success( |
|
"β
Calculation was done based on the selected value of 'Final Desired Net Salary'" |
|
) |
|
summary_df = pd.DataFrame( |
|
{ |
|
"Parameter": [ |
|
"Final Net Salary", |
|
"Tax", |
|
"Gross Salary", |
|
], |
|
"Value": [ |
|
f"PKR {result['final_net_salary']:,.2f}", |
|
f"PKR {result['tax']:,.2f}", |
|
f"PKR {result['gross_salary_needed']:,.2f}", |
|
], |
|
} |
|
) |
|
elif st.session_state.type_to_calculate == "salary_parameters": |
|
st.success( |
|
"β
Calculation was done based on the selected values of 'Salary Parameters'" |
|
) |
|
summary_df = pd.DataFrame( |
|
{ |
|
"Parameter": [ |
|
"Current Salary", |
|
"Desired Increment", |
|
"Daily Travel Cost", |
|
"On-Site Days/Week", |
|
"Gross Salary", |
|
"Tax", |
|
"Final Net Salary", |
|
], |
|
"Value": [ |
|
f"PKR {st.session_state.current_salary:,.2f}", |
|
f"{st.session_state.desired_increment_percentage:.2%}", |
|
f"PKR {st.session_state.daily_cost_of_travel:,.2f}", |
|
f"{st.session_state.physical_days_per_week}", |
|
f"PKR {result['gross_salary_needed']:,.2f}", |
|
f"PKR {result['tax']:,.2f}", |
|
f"PKR {result['final_net_salary']:,.2f}", |
|
], |
|
} |
|
) |
|
st.header("Salary Calculation Results") |
|
col1, col2 = st.columns(2) |
|
with col1: |
|
|
|
StreamlitFunctions.custom_metric("Final Net Salary", result["final_net_salary"]) |
|
StreamlitFunctions.custom_metric("Tax", result["tax"]) |
|
|
|
with col2: |
|
|
|
StreamlitFunctions.custom_metric( |
|
"Gross Salary Needed", result["gross_salary_needed"] |
|
) |
|
|
|
st.subheader("Calculation Summary") |
|
st.data_editor(summary_df, use_container_width=True, hide_index=True) |
|
st.session_state.type_to_calculate = None |
|
|