diff --git a/src/utils/table_sql.py b/src/utils/table_sql.py index 67d7dcc..f67cff9 100644 --- a/src/utils/table_sql.py +++ b/src/utils/table_sql.py @@ -1,3 +1,5 @@ +from datetime import datetime, timedelta + import polars as pl from src.utils import logger @@ -100,3 +102,36 @@ def sort_by_to_sql(sort_by: list[dict] | None, schema: pl.Schema) -> str: fragments.append(f'"{col}" {direction.upper()} NULLS LAST') return ", ".join(fragments) + + +def dashboard_filters_to_sql( + dashboard_year=None, + dashboard_acheteur_id=None, + dashboard_acheteur_categorie=None, + dashboard_acheteur_departement_code=None, + dashboard_titulaire_id=None, + dashboard_titulaire_categorie=None, + dashboard_titulaire_departement_code=None, + dashboard_marche_type=None, + dashboard_marche_objet=None, + dashboard_marche_code_cpv=None, + dashboard_marche_considerations_sociales=None, + dashboard_marche_considerations_environnementales=None, + dashboard_marche_techniques=None, + dashboard_marche_innovant=None, + dashboard_marche_sous_traitance_declaree=None, + dashboard_montant_min=None, + dashboard_montant_max=None, +) -> tuple[str, list]: + """Traduit les filtres du tableau de bord en (where_clause, params) DuckDB.""" + clauses: list[str] = [] + params: list = [] + + if dashboard_year: + clauses.append('YEAR("dateNotification") = ?') + params.append(int(dashboard_year)) + else: + clauses.append('"dateNotification" > ?') + params.append(datetime.now() - timedelta(days=365)) + + return " AND ".join(clauses), params diff --git a/tests/test_dashboard_filters_to_sql.py b/tests/test_dashboard_filters_to_sql.py new file mode 100644 index 0000000..a9ca535 --- /dev/null +++ b/tests/test_dashboard_filters_to_sql.py @@ -0,0 +1,18 @@ +from datetime import datetime, timedelta + +from src.utils.table_sql import dashboard_filters_to_sql + + +def test_no_filters_uses_default_365_day_window(): + where_sql, params = dashboard_filters_to_sql() + assert where_sql == '"dateNotification" > ?' + assert len(params) == 1 + assert isinstance(params[0], datetime) + expected = datetime.now() - timedelta(days=365) + assert abs((params[0] - expected).total_seconds()) < 2 + + +def test_year_filter_overrides_default_window(): + where_sql, params = dashboard_filters_to_sql(dashboard_year="2025") + assert where_sql == 'YEAR("dateNotification") = ?' + assert params == [2025]