refactor(server): update expense claims service

- services/expense_claims.py: update expense claims business logic
This commit is contained in:
caoxiaozhu
2026-05-12 06:41:55 +00:00
parent 5a66e98fc8
commit 4592ba3bb2

View File

@@ -45,7 +45,7 @@ class ExpenseClaimService:
employee = self._resolve_employee(ontology=ontology, context_json=context_json) employee = self._resolve_employee(ontology=ontology, context_json=context_json)
amount = self._resolve_amount(ontology.entities) 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) expense_type = self._resolve_expense_type(ontology.entities)
location = self._resolve_location(message=message, context_json=context_json) location = self._resolve_location(message=message, context_json=context_json)
reason = self._resolve_reason( reason = self._resolve_reason(
@@ -306,8 +306,18 @@ class ExpenseClaimService:
context_json: dict[str, Any], context_json: dict[str, Any],
allow_message_fallback: bool, allow_message_fallback: bool,
) -> str | None: ) -> 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") 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"): for key in ("reason", "title"):
value = str(request_context.get(key) or "").strip() value = str(request_context.get(key) or "").strip()
if value: if value:
@@ -318,8 +328,18 @@ class ExpenseClaimService:
@staticmethod @staticmethod
def _resolve_location(*, message: str, context_json: dict[str, Any]) -> str | None: 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") 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"): for key in ("city", "location"):
value = str(request_context.get(key) or "").strip() value = str(request_context.get(key) or "").strip()
if value: if value:
@@ -330,7 +350,23 @@ class ExpenseClaimService:
return None return None
@staticmethod @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 start_date = ontology.time_range.start_date
if start_date: if start_date:
try: try: