"""Parse raw OCR / multimodal extraction results into TransactionRecord instances.""" from datetime import datetime from uuid import UUID from app.models.transaction import TransactionRecord, Direction from app.models.evidence_image import SourceApp def parse_extracted_fields( raw: dict | list, case_id: UUID, image_id: UUID, source_app: SourceApp, ) -> list[TransactionRecord]: """Convert raw extraction dict(s) into TransactionRecord ORM objects.""" items = raw if isinstance(raw, list) else [raw] records: list[TransactionRecord] = [] for item in items: if not item or not item.get("amount"): continue try: trade_time = datetime.fromisoformat(item["trade_time"]) except (ValueError, KeyError): trade_time = datetime.now() direction_str = item.get("direction", "out") direction = Direction.in_ if direction_str == "in" else Direction.out record = TransactionRecord( case_id=case_id, evidence_image_id=image_id, source_app=source_app, trade_time=trade_time, amount=float(item.get("amount", 0)), direction=direction, counterparty_name=str(item.get("counterparty_name", "")), counterparty_account=str(item.get("counterparty_account", "")), self_account_tail_no=str(item.get("self_account_tail_no", "")), order_no=str(item.get("order_no", "")), remark=str(item.get("remark", "")), confidence=float(item.get("confidence", 0.5)), ) records.append(record) return records