From 4592ba3bb25a324e2017e80bec7fe396ce710633 Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Tue, 12 May 2026 06:41:55 +0000 Subject: [PATCH] refactor(server): update expense claims service - services/expense_claims.py: update expense claims business logic --- server/src/app/services/expense_claims.py | 44 ++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/server/src/app/services/expense_claims.py b/server/src/app/services/expense_claims.py index 197aa31..0882244 100644 --- a/server/src/app/services/expense_claims.py +++ b/server/src/app/services/expense_claims.py @@ -45,7 +45,7 @@ class ExpenseClaimService: employee = self._resolve_employee(ontology=ontology, context_json=context_json) amount = self._resolve_amount(ontology.entities) - occurred_at = self._resolve_occurred_at(ontology) + occurred_at = self._resolve_occurred_at(ontology, context_json=context_json) expense_type = self._resolve_expense_type(ontology.entities) location = self._resolve_location(message=message, context_json=context_json) reason = self._resolve_reason( @@ -306,8 +306,18 @@ class ExpenseClaimService: context_json: dict[str, Any], allow_message_fallback: bool, ) -> str | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("reason", "business_reason"): + value = str(review_form_values.get(key) or "").strip() + if value: + return value + request_context = context_json.get("request_context") - if isinstance(request_context, dict): + if ( + isinstance(request_context, dict) + and str(context_json.get("entry_source") or "").strip() == "detail" + ): for key in ("reason", "title"): value = str(request_context.get(key) or "").strip() if value: @@ -318,8 +328,18 @@ class ExpenseClaimService: @staticmethod def _resolve_location(*, message: str, context_json: dict[str, Any]) -> str | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("business_location", "location"): + value = str(review_form_values.get(key) or "").strip() + if value: + return value + request_context = context_json.get("request_context") - if isinstance(request_context, dict): + if ( + isinstance(request_context, dict) + and str(context_json.get("entry_source") or "").strip() == "detail" + ): for key in ("city", "location"): value = str(request_context.get(key) or "").strip() if value: @@ -330,7 +350,23 @@ class ExpenseClaimService: return None @staticmethod - def _resolve_occurred_at(ontology: OntologyParseResult) -> datetime | None: + def _resolve_occurred_at( + ontology: OntologyParseResult, + *, + context_json: dict[str, Any], + ) -> datetime | None: + review_form_values = context_json.get("review_form_values") + if isinstance(review_form_values, dict): + for key in ("occurred_date", "time_range", "business_time"): + value = str(review_form_values.get(key) or "").strip() + if not value: + continue + try: + parsed = date.fromisoformat(value) + return datetime(parsed.year, parsed.month, parsed.day, tzinfo=UTC) + except ValueError: + continue + start_date = ontology.time_range.start_date if start_date: try: