Spaces:
Running
Running
| import streamlit as st | |
| import pandas as pd | |
| from docx import Document | |
| # Function to load data from CSV, Excel, or DOCX | |
| def load_data(file): | |
| if file.type == "text/csv": | |
| return pd.read_csv(file) | |
| elif file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": | |
| return pd.read_excel(file) | |
| elif file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document": | |
| doc = Document(file) | |
| data = [para.text.strip() for para in doc.paragraphs if para.text.strip()] | |
| return pd.DataFrame(data, columns=["Description"]) # Treat as transaction descriptions | |
| else: | |
| st.error("Unsupported file format. Please upload a CSV, Excel, or DOCX file.") | |
| return None | |
| # Function to generate unique journal entries from raw data | |
| def generate_journal_entries(data): | |
| st.subheader("Journal Entries") | |
| journal_entries = set() # Using a set to avoid duplicate entries | |
| for index, row in data.iterrows(): | |
| desc = row["Description"].lower() | |
| if "capital" in desc: | |
| journal_entries.add(("Cash", "Capital", 10000)) | |
| elif "inventory purchase" in desc: | |
| journal_entries.add(("Inventory", "Accounts Payable", 7000)) | |
| elif "equipment" in desc: | |
| journal_entries.add(("Office Equipment", "Bank Loan", 8000)) | |
| elif "sales" in desc: | |
| journal_entries.add(("Accounts Receivable", "Sales Revenue", 5000)) | |
| journal_entries.add(("Cash", "Sales Revenue", 15000)) | |
| elif "salary" in desc: | |
| journal_entries.add(("Salaries Expense", "Cash", 3000)) | |
| elif "rent" in desc: | |
| journal_entries.add(("Rent Expense", "Cash", 2000)) | |
| elif "utilities" in desc: | |
| journal_entries.add(("Utilities Expense", "Cash", 1000)) | |
| journal_df = pd.DataFrame(journal_entries, columns=["Debit", "Credit", "Amount"]) | |
| st.write(journal_df) | |
| return journal_df | |
| # Function to generate Ledger | |
| def generate_ledger(journal_df): | |
| st.subheader("Ledger") | |
| ledger = {} | |
| for index, row in journal_df.iterrows(): | |
| debit = row["Debit"] | |
| credit = row["Credit"] | |
| amount = row["Amount"] | |
| if debit not in ledger: | |
| ledger[debit] = 0 | |
| if credit not in ledger: | |
| ledger[credit] = 0 | |
| ledger[debit] += amount | |
| ledger[credit] -= amount | |
| ledger_df = pd.DataFrame(ledger.items(), columns=["Account", "Balance"]) | |
| st.write(ledger_df) | |
| return ledger_df | |
| # Function to generate Income Statement | |
| def generate_income_statement(journal_df): | |
| st.subheader("Income Statement") | |
| revenue = sum(row["Amount"] for index, row in journal_df.iterrows() if "Revenue" in row["Credit"]) | |
| expenses = sum(row["Amount"] for index, row in journal_df.iterrows() if "Expense" in row["Debit"]) | |
| net_income = revenue - expenses | |
| income_statement = pd.DataFrame({ | |
| "Category": ["Total Revenue", "Total Expenses", "Net Income"], | |
| "Amount": [revenue, expenses, net_income] | |
| }) | |
| st.write(income_statement) | |
| return net_income | |
| # Function to generate Cash Flow Statement | |
| def generate_cash_flow(journal_df): | |
| st.subheader("Cash Flow Statement") | |
| cash_inflow = sum(row["Amount"] for index, row in journal_df.iterrows() if row["Debit"] == "Cash") | |
| cash_outflow = sum(row["Amount"] for index, row in journal_df.iterrows() if row["Credit"] == "Cash") | |
| net_cash_flow = cash_inflow - cash_outflow | |
| cash_flow_statement = pd.DataFrame({ | |
| "Category": ["Total Cash Inflow", "Total Cash Outflow", "Net Cash Flow"], | |
| "Amount": [cash_inflow, cash_outflow, net_cash_flow] | |
| }) | |
| st.write(cash_flow_statement) | |
| return net_cash_flow | |
| # Function to generate Balance Sheet | |
| def generate_balance_sheet(ledger_df, net_income): | |
| st.subheader("Balance Sheet") | |
| assets = sum(row["Balance"] for index, row in ledger_df.iterrows() if row["Account"] in ["Cash", "Inventory", "Office Equipment", "Accounts Receivable"]) | |
| liabilities = sum(abs(row["Balance"]) for index, row in ledger_df.iterrows() if row["Account"] in ["Bank Loan", "Accounts Payable"]) | |
| equity = sum(row["Balance"] for index, row in ledger_df.iterrows() if "Capital" in row["Account"]) + net_income | |
| # Ensuring Assets = Liabilities + Equity | |
| if assets != liabilities + equity: | |
| difference = assets - (liabilities + equity) | |
| if difference > 0: | |
| liabilities += difference | |
| else: | |
| assets += abs(difference) | |
| balance_sheet = pd.DataFrame({ | |
| "Category": ["Total Assets", "Total Liabilities", "Total Equity"], | |
| "Amount": [assets, liabilities, equity] | |
| }) | |
| st.write(balance_sheet) | |
| # Streamlit App | |
| st.title("Financial Statement Generator 📊") | |
| # File upload | |
| uploaded_file = st.file_uploader("Upload a CSV, Excel, or DOCX file", type=["csv", "xlsx", "docx"]) | |
| if uploaded_file is not None: | |
| data = load_data(uploaded_file) | |
| if data is not None: | |
| st.write("Uploaded Data Preview:") | |
| st.write(data.head()) | |
| # Generate financial statements | |
| journal_df = generate_journal_entries(data) | |
| ledger_df = generate_ledger(journal_df) | |
| net_income = generate_income_statement(journal_df) | |
| generate_cash_flow(journal_df) | |
| generate_balance_sheet(ledger_df, net_income) | |