From 690431472cbce51bc6965d9c5e906e93aaa11339 Mon Sep 17 00:00:00 2001 From: foefl Date: Wed, 30 Apr 2025 14:46:23 +0200 Subject: [PATCH] add option for multiple company IDs, related to #26 --- src/delta_barth/analysis/forecast.py | 4 ++-- src/delta_barth/api/requests.py | 12 +++--------- src/delta_barth/constants.py | 2 +- src/delta_barth/pipelines.py | 4 ++-- tests/analysis/test_forecast.py | 4 +++- tests/api/test_requests.py | 19 +++++++++---------- tests/test_pipelines.py | 5 ++++- 7 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/delta_barth/analysis/forecast.py b/src/delta_barth/analysis/forecast.py index 1f10d5a..3790c2b 100644 --- a/src/delta_barth/analysis/forecast.py +++ b/src/delta_barth/analysis/forecast.py @@ -403,13 +403,13 @@ def _export_on_fail( def pipeline_sales_forecast( session: Session, - company_id: int | None = None, + company_ids: list[int] | None = None, start_date: Datetime | None = None, ) -> SalesPrognosisResultsExport: logger_pipelines.info("[PIPELINES] Starting main sales forecast pipeline...") response, status = get_sales_prognosis_data( session, - company_id=company_id, + company_ids=company_ids, start_date=start_date, ) if status != STATUS_HANDLER.SUCCESS: diff --git a/src/delta_barth/api/requests.py b/src/delta_barth/api/requests.py index 2adf1cc..a29c5d1 100644 --- a/src/delta_barth/api/requests.py +++ b/src/delta_barth/api/requests.py @@ -20,7 +20,7 @@ if TYPE_CHECKING: # ** sales data # ** import class SalesPrognosisRequestP(BaseModel): - FirmaId: SkipValidation[int | None] + FirmaIds: SkipValidation[list[int] | None] BuchungsDatum: SkipValidation[Datetime | None] @@ -55,20 +55,14 @@ class SalesPrognosisResultsExport(ExportResponse): def get_sales_prognosis_data( session: Session, - company_id: int | None = None, + company_ids: list[int] | None = None, start_date: Datetime | None = None, ) -> tuple[SalesPrognosisResponse, Status]: - # TODO check elimination of assertion for login, #25 - # _, status = session.assert_login() - # if status != STATUS_HANDLER.SUCCESS: - # response = SalesPrognosisResponse(daten=tuple()) - # return response, status - ROUTE: Final[str] = "verkauf/umsatzprognosedaten" URL: Final = combine_route(session.base_url, ROUTE) sales_prog_req = SalesPrognosisRequestP( - FirmaId=company_id, + FirmaIds=company_ids, BuchungsDatum=start_date, ) empty_response = SalesPrognosisResponse(daten=tuple()) diff --git a/src/delta_barth/constants.py b/src/delta_barth/constants.py index da0f5bc..4166daf 100644 --- a/src/delta_barth/constants.py +++ b/src/delta_barth/constants.py @@ -50,7 +50,7 @@ class KnownDelBarApiErrorCodes(enum.Enum): # ** API -API_CON_TIMEOUT: Final[float] = 10.0 # secs to response +API_CON_TIMEOUT: Final[float] = 20.0 # secs to response MAX_LOGIN_RETRIES: Final[int] = 1 # ** API response parsing diff --git a/src/delta_barth/pipelines.py b/src/delta_barth/pipelines.py index a63597c..4985bd3 100644 --- a/src/delta_barth/pipelines.py +++ b/src/delta_barth/pipelines.py @@ -44,14 +44,14 @@ def _write_performance_metrics_wrapped( def pipeline_sales_forecast( - company_id: int | None, + company_ids: list[int] | None, start_date: Datetime | None, ) -> JsonExportResponse: PIPELINE_NAME: Final[str] = "sales_forecast" logger.info("[EXT-CALL PIPELINES] Starting main sales forecast pipeline...") t_start = time.perf_counter_ns() result = forecast.pipeline_sales_forecast( - SESSION, company_id=company_id, start_date=start_date + SESSION, company_ids=company_ids, start_date=start_date ) export = JsonExportResponse(result.model_dump_json()) t_end = time.perf_counter_ns() diff --git a/tests/analysis/test_forecast.py b/tests/analysis/test_forecast.py index 1488b01..4e316a1 100644 --- a/tests/analysis/test_forecast.py +++ b/tests/analysis/test_forecast.py @@ -432,6 +432,8 @@ def test_export_on_fail(): @patch("delta_barth.session.CFG_HOT_RELOAD", False) def test_pipeline_sales_forecast_SuccessDbWrite(exmpl_api_sales_prognosis_resp, session): + date = Datetime(2023, 8, 15) + company_ids = [5661, 1027, 1024] with ( patch( "delta_barth.analysis.forecast.get_sales_prognosis_data", @@ -440,7 +442,7 @@ def test_pipeline_sales_forecast_SuccessDbWrite(exmpl_api_sales_prognosis_resp, ): get_mock.return_value = exmpl_api_sales_prognosis_resp, STATUS_HANDLER.SUCCESS sess_mock.cfg.forecast.threshold_month_data_points = 1 - result = fc.pipeline_sales_forecast(None) # type: ignore + result = fc.pipeline_sales_forecast(None, company_ids, date) # type: ignore assert result.status == STATUS_HANDLER.SUCCESS assert len(result.response.daten) > 0 diff --git a/tests/api/test_requests.py b/tests/api/test_requests.py index e9f63c0..ab9bf08 100644 --- a/tests/api/test_requests.py +++ b/tests/api/test_requests.py @@ -11,7 +11,7 @@ def test_get_sales_prognosis_data_Success(session): resp, status = session.login() # test without company ID assert status.code == 0 - date = Datetime(2022, 6, 1) + date = Datetime(2023, 12, 15) resp, status = requests_.get_sales_prognosis_data(session, None, date) assert status.code == 0 assert len(resp.daten) > 0 @@ -21,26 +21,25 @@ def test_get_sales_prognosis_data_Success(session): assert len(resp.daten) == 0 # test with company ID assert status.code == 0 - date = Datetime(2022, 6, 1) - company_id = 1024 - resp, status = requests_.get_sales_prognosis_data(session, company_id, date) + date = Datetime(2023, 8, 15) + company_ids = [5661, 1027] + resp, status = requests_.get_sales_prognosis_data(session, company_ids, date) assert status.code == 0 assert len(resp.daten) > 0 date = Datetime(2030, 1, 1) - resp, status = requests_.get_sales_prognosis_data(session, company_id, date) + resp, status = requests_.get_sales_prognosis_data(session, company_ids, date) assert status.code == 0 assert len(resp.daten) == 0 # test with non-existent company ID assert status.code == 0 date = Datetime(2022, 6, 1) - company_id = 1000024 - resp, status = requests_.get_sales_prognosis_data(session, company_id, date) - # TODO check if this behaviour is still considered "successful" + company_ids = [1000024] + resp, status = requests_.get_sales_prognosis_data(session, company_ids, date) assert status.code == 0 assert len(resp.daten) == 0 # test without date - company_id = 1024 - resp, status = requests_.get_sales_prognosis_data(session, company_id, None) + company_ids = [1024] + resp, status = requests_.get_sales_prognosis_data(session, company_ids, None) assert status.code == 0 assert len(resp.daten) > 0 # test without filters diff --git a/tests/test_pipelines.py b/tests/test_pipelines.py index fb62f39..1e26829 100644 --- a/tests/test_pipelines.py +++ b/tests/test_pipelines.py @@ -1,4 +1,5 @@ import json +from datetime import datetime as Datetime from unittest.mock import patch import pytest @@ -47,6 +48,8 @@ def test_write_performance_metrics_FailStartingTime(session): @patch("delta_barth.session.CFG_HOT_RELOAD", False) def test_sales_prognosis_pipeline(exmpl_api_sales_prognosis_resp, session, monkeypatch): + date = Datetime(2023, 8, 15) + company_ids = [5661, 1027, 1024] with ( patch( "delta_barth.analysis.forecast.get_sales_prognosis_data", @@ -56,7 +59,7 @@ def test_sales_prognosis_pipeline(exmpl_api_sales_prognosis_resp, session, monke ): get_mock.return_value = (exmpl_api_sales_prognosis_resp, STATUS_HANDLER.SUCCESS) sess_mock.cfg.forecast.threshold_month_data_points = 1 - json_export = pl.pipeline_sales_forecast(None, None) + json_export = pl.pipeline_sales_forecast(company_ids, date) assert isinstance(json_export, str) parsed_resp = json.loads(json_export) -- 2.34.1