plan_maker_v2.0 / app2.py
Ninad077's picture
Upload 8 files
01d5640 verified
import streamlit as st
import pandas as pd
from datetime import datetime
from utilities import (
initialize_session_state, save_user_data, generate_rule_id, generate_plan_id,
display_saved_records, load_theme_config, store_and_fetch_company_info,
get_feature_user_data, default_button_click, custom_button_click, uploader,
render_selectboxes, slab_data, insert_into_bq
)
from html_templates import (
app_title, plan_info_header, button_styles, rule_info_header,
expected_billing_header, final_billing_header, side_logo
)
from placeholders import (
fee_type_options, fee_nature_options, variable_options, chargeable_on_options,
plan_validity_options, payment_method_options, fee_reversal_options, threshold_options
)
from mapping import new_mapping
initialize_session_state()
theme_settings = load_theme_config()
user_input_1 = st.sidebar.number_input("Enter Commercial value:")
user_input_2 = float(user_input_1)
st.session_state['user_input_3'] = "{:.2f}".format(user_input_2)
plan_name = st.sidebar.text_input("Plan Name", help="Enter the name of the plan")
plan_description = st.sidebar.text_area("Plan Description", max_chars=250, help="Describe the plan")
plan_start_date = st.sidebar.date_input("Plan Start Date", value=datetime.now(), help="Select the start date of the plan")
# Initialize session state variables if they don't exist
if 'new_mapping' not in st.session_state:
st.session_state['new_mapping'] = {}
if 'file_data' not in st.session_state:
st.session_state['file_data'] = None
if 'mapping_mode' not in st.session_state:
st.session_state['mapping_mode'] = None # None, 'default', 'custom'
if 'button_clicked' not in st.session_state:
st.session_state['button_clicked'] = None
# Function to handle custom button click
def custom_button_click():
st.session_state.button_clicked = 'custom'
# Function to handle default button click
def default_button_click():
st.session_state.button_clicked = 'default'
# Display buttons without immediate execution on click
col1, col2 = st.sidebar.columns([0.25, 0.45])
with col1:
default_clicked = st.button("Default mapping")
with col2:
custom_clicked = st.button("Custom mapping")
# Determine action based on button clicked
if default_clicked:
default_button_click()
elif custom_clicked:
custom_button_click()
st.markdown(button_styles, unsafe_allow_html=True)
# Default button mapping
if st.session_state.button_clicked == 'default':
st.session_state['new_mapping'] = new_mapping
st.session_state['mapping_mode'] = 'default'
st.sidebar.markdown(rule_info_header, unsafe_allow_html=True)
# Handle Custom Mapping
elif st.session_state.button_clicked == 'custom':
st.markdown(button_styles, unsafe_allow_html=True)
uploaded_file = st.sidebar.file_uploader("Upload a file:", type=['csv', 'xlsx'], key='file_uploader')
st.sidebar.markdown(rule_info_header, unsafe_allow_html=True)
if uploaded_file is not None:
uploader(uploaded_file)
if st.session_state.get('mapping_mode'):
render_selectboxes(st.session_state, st.session_state.get('new_mapping'))
selected_variable_type = st.session_state['selected_variable_type']
usage_1 = st.number_input(f"Usage limit for {selected_variable_type}", min_value=0.0, help="Enter the usage limit")
usage_2 = float(usage_1)
usage_3 = "{:.2f}".format(usage_2)
expected_billing = user_input_1
st.markdown(expected_billing_header, unsafe_allow_html= True)
selected_plan_validity = st.selectbox("Plan Validity", [""] + plan_validity_options, help="Plan validity defines the periodicity of calculation for the above billing", key="plan_vd_2")
selected_payment_method = st.selectbox("Payment Method", [""] + payment_method_options, help="Payment method defines the mode of payment of the plan", key="py_vd_2")
initial_net_billing = 0
user_input_3 = st.session_state['user_input_3']
if selected_plan_validity == 'One time':
final_billing = 1 * expected_billing
elif selected_plan_validity == 'Monthly':
final_billing = 1 * expected_billing
elif selected_plan_validity == 'Quarterly':
final_billing = 3 * expected_billing
elif selected_plan_validity == 'Bi-Annually':
final_billing = 6 * expected_billing
elif selected_plan_validity == 'Annually':
final_billing = 12 * expected_billing
else:
final_billing = initial_net_billing
st.markdown(final_billing_header, unsafe_allow_html= True)
st.markdown(button_styles, unsafe_allow_html=True)
rule_id = None
plan_id = None
user_data = None
project_id = "fynd-db"
dataset_id = "finance_dwh"
table_id = "plan_v2"
service_account_info = {
"type": "service_account",
"project_id": "fynd-db",
"private_key_id": "48954327ef172acc3091a91881840dc353ff0413",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmIs0vgXflZmHD\n0IeHCiDEXavRb2GvRQqkCZGLy/EHFO7XLmpNrFzZHTSQach6HErARWTMsd2AMIA5\nHbmjEyt9deTOMUmICszkwNwpn6pzuoF2v4+fL2PQ4VBElLfCv4qbP9JGljvLsj5b\nC9UWe9rWgRrw2Z88LlVmFy3k4Om80Q57gW3hSYZpG4rBhC9+YRXjZ+Iq5SFEJQ+U\nj8ej7q6DnI8Prbvw/e13JH1pxm9AUQDm+sTsBmvjh4Ye02vKbfUP+pFOM0eC3Eoa\nOyG7unZnDuAaK9g87xVjd9HtD6MfaM0EHAEF1eyC4UqeiXTbVMwi7+0IGA2evEDZ\n3WRR2i+lAgMBAAECggEAF7Vis7NVsVqFfCS/moFTAMLfWLF87r67EIK/DwSpHloZ\n5YJdsDz3ORKmZC98aRSthDfC9UUyt270dXItAj0jmTFgWB6HgE8OQ1zUbmo3MHG+\ntPwMWmqwY2gsBMV2Xefot1QJxYH+AYkrxeFv5NgC+FaPSiy8QSHZlQqcxYtlP8kY\nzv8QFMgZ3b0sixK+YcSjCRXHu/DznnS/ZU7XlTALxANa50hT11rVLq6zYDF40fqC\nOWCOZvupjMOnNimXCWn7q6D1F8S/IMYlnHArJpEb7SdbJnJzxUvJC2rrMSoY896r\nyFEVhlElWp5GfTopu0WnL7iaw3pukM1OtpanFAk29wKBgQDW+yMzL7RiQ5LdElVP\n7Ml5hs+t6cjrUJTgBI8Uf9qGxE+tMe7Ye1fyJfbYslbOYO9xIUUT1jJmU6jadNWX\nA7UT59/IjvAOBIYyMEdh6Xo+H6ggW8DeU1HSdvixnQdgi0c03E6OCbOKi9E/UzK/\nTK2RBJJLN4MCiNL0FzrhTuxyEwKBgQDF1cz9Sb2UbrL5hr8LdcEH0ctatNlhJcSN\nnMd0Fn+e1EAkip+Hs9HmTvNdty4gQE+yEq/Tj0cRHXmjzK2AYx0WYRAhWGNSTlTS\n4OJdjE6vsoPu7Ouz1R/i/egKniUifEXYSgyL+oPBUrqqsnk9lgGBkJipN3u1f9+K\niuUJJP/OZwKBgF6ZvqCcom0HPU5I7f+wu+vdVfA6yy45lHmLqAamSFw7cLBPI8Jh\nbI7jA9/Rgn9oipUmxcX34M/Eiq4u8Xp1qC4tP/16YMpaVU8qjY7ZdfB2b75lgdaT\npZLOxZsq9X8Xauso8uxv+nDCG/8YtmEV9d61u0acE+t+mA3PVxqkZ0m/AoGBAI5c\nY76AqeN+JVxaEm/0tIsj9Om46hR2URJ2lzB6YCuzINUqy9GjHJBWj9oITzD2FmNV\n/yCGIeW3CClOyCtzJyNLhYf5Sr+XjoKRQVN/+7+C/l2YL6Sg4Ok/PRMm6iH+u2QB\nJTY1d0pOdfUPqR8gKsVJgBGE04iwE/RmLpp9/XZRAoGAFtaa9JeHk9dmZiST3lev\ns5syeOK1cCj1+nJer/GPEjqWMKxbCULvoEYBp7RaoEXjfGi7P4Mc6YHnbljHc+sL\niJzHhxrv/HYZdlCdTU3IRWT0sNHzqZemfYnsVTSp+4y61sGDxioDYL4CLnMq5T2F\nqzfc2qp3s8ApVloY3giuqnI=\n-----END PRIVATE KEY-----\n",
"client_email": "plan-maker@fynd-db.iam.gserviceaccount.com",
"client_id": "114883060650442183907",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/plan-maker%40fynd-db.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
# Submit button
if st.button("Submit"):
# Save user data
user_data = {
"Business_Head": selected_business_head,
"Company_ID": company_id.strip() if company_id else None,
"Company_Name": st.session_state.get('company_name', ''),
"Currency": currency,
"Bundle_by": bundle_by,
"Plan_Name": plan_name,
"Plan_Description": plan_description,
"Product_lines": st.session_state.get('ordering_channel', ''),
"Fulfilling_Location": st.session_state.get('fulfilling_location', ''),
"Application_ID": st.session_state.get('application_id', ''),
"Fee_Type": st.session_state.get('selected_fee_type', ''),
"Variable_Type": selected_variable_type,
"Chargeable_on": st.session_state.get('selected_chargeable_on', ''),
"Fee_Nature": 0,
"Commercial_value": user_input_3,
"Fee_reversal": 0,
"Reversal_%": 0,
"Usage_limit": usage_3,
"Threshold_value": 0,
"Threshold_option": 0,
"Expected_Billing": user_input_3,
"Plan_Validity": selected_plan_validity,
"Payment_Method": selected_payment_method,
"Net_total_billing":int(final_billing)
}
# Save and display user data
save_user_data(user_data)
st.session_state.user_data = user_data
st.session_state.df = pd.DataFrame([user_data])
st.write("User Data Submitted")
st.write(st.session_state.df)
# Display saved records
# display_saved_records()
# Insert into BigQuery
if st.button("Export to BQ"):
if project_id and dataset_id and table_id and service_account_info:
user_data = st.session_state.user_data
# Generate rule_id and plan_id
rule_id = generate_rule_id(user_data)
plan_id = generate_plan_id(user_data)
# Update user_data with generated IDs
user_data['rule_id'] = rule_id
user_data['plan_id'] = plan_id
st.session_state['created_at'] = datetime.now().isoformat()
user_data = {
"Business_Head": st.session_state.get('selected_business_head'),
"Company_ID": st.session_state.get('company_id'.strip()) if st.session_state.get('company_id') else None,
"Company_Name": st.session_state.get('company_name', ''),
"Currency": st.session_state.get('currency'),
"Bundle_by": st.session_state.get('bundle_by'),
"Plan_Name": plan_name,
"Plan_Description": plan_description,
"Product_lines": st.session_state.get('ordering_channel', ''),
"Fulfilling_Location": st.session_state.get('fulfilling_location', ''),
"Application_ID": st.session_state.get('application_id', ''),
"Fee_Type": st.session_state.get('selected_fee_type', ''),
"Variable_Type": selected_variable_type,
"Chargeable_on": st.session_state.get('selected_chargeable_on', ''),
"Fee_Nature": 0,
"Commercial_value": user_input_3,
"Fee_reversal": 0,
"Reversal_%": 0,
"Usage_limit": usage_3,
"Threshold_value": 0,
"Threshold_option": 0,
"Expected_Billing": user_input_3,
"Plan_Validity": selected_plan_validity,
"Payment_Method": selected_payment_method,
"Net_total_billing":int(final_billing)
}
# Save the user data locally and to session state
save_user_data(user_data)
# Display saved records
display_saved_records()
# Store created_at, rule_id, and plan_id in session state
st.session_state['created_at'] = datetime.now().isoformat()
st.session_state['rule_id'] = rule_id
st.session_state['plan_id'] = plan_id
insert_into_bq(user_data, project_id, dataset_id, table_id, service_account_info)
else:
st.error("One or more required variables are not defined.")