11"""Start met: streamlit run dashboard/app.py"""
22
33from pathlib import Path
4+ import os
45import sys
56
67import pandas as pd
2829 top_customers ,
2930)
3031from src .clean_data import clean_sales_data # noqa: E402
31- from src .load_data import load_customer_directory_csv , load_monthly_targets_csv , load_sales_csv # noqa: E402
32+ from src .load_data import load_customer_directory_csv , load_monthly_targets_csv , load_sales_csv , load_sales_from_postgres # noqa: E402
3233from visualizations .plotly_charts import create_actual_vs_target_chart , create_cohort_retention_chart , create_monthly_performance_chart # noqa: E402
3334
3435
4950RAW_DATA_PATH = PROJECT_ROOT / "data" / "raw" / "sales.csv"
5051TARGETS_DATA_PATH = PROJECT_ROOT / "data" / "raw" / "monthly_targets.csv"
5152CUSTOMERS_DATA_PATH = PROJECT_ROOT / "data" / "raw" / "customers.csv"
53+ POSTGRES_QUERY_PATH = PROJECT_ROOT / "sql" / "dashboard_sales.sql"
54+
55+
56+ def get_database_url () -> str | None :
57+ """Lees een optionele lokale of cloud databaseverbinding zonder secrets te loggen."""
58+ if database_url := os .getenv ("DATABASE_URL" ):
59+ return database_url
60+ try :
61+ return st .secrets .get ("DATABASE_URL" )
62+ except Exception :
63+ return None
5264
5365
5466@st .cache_data
55- def get_sales_data (source_version : int ) -> pd .DataFrame :
56- """Clean raw data; its file version safely refreshes Streamlit's cache ."""
67+ def get_sales_data (source_version : int , database_url : str | None ) -> pd .DataFrame :
68+ """Gebruik PostgreSQL wanneer geconfigureerd, anders de betrouwbare CSV-fallback ."""
5769 del source_version
70+ if database_url :
71+ query = POSTGRES_QUERY_PATH .read_text (encoding = "utf-8" )
72+ return clean_sales_data (load_sales_from_postgres (database_url , query ))
5873 return clean_sales_data (load_sales_csv (RAW_DATA_PATH ))
5974
6075
@@ -72,12 +87,14 @@ def get_customer_directory(source_version: int) -> pd.DataFrame:
7287 return load_customer_directory_csv (CUSTOMERS_DATA_PATH )
7388
7489
75- data = get_sales_data (RAW_DATA_PATH .stat ().st_mtime_ns )
90+ database_url = get_database_url ()
91+ data = get_sales_data (RAW_DATA_PATH .stat ().st_mtime_ns , database_url )
7692monthly_targets = get_monthly_targets (TARGETS_DATA_PATH .stat ().st_mtime_ns )
7793customer_directory = get_customer_directory (CUSTOMERS_DATA_PATH .stat ().st_mtime_ns )
7894st .markdown ('<p class="eyebrow">Portfolio project · Sales intelligence</p>' , unsafe_allow_html = True )
7995st .title ("Sales analytics dashboard" )
8096st .caption ("Analyseer 24 maanden verkoopdata, vergelijk periodes en exporteer gefilterde inzichten." )
97+ st .caption ("Data source: PostgreSQL" if database_url else "Data source: CSV fallback" )
8198
8299with st .sidebar :
83100 st .header ("Filters" )
0 commit comments