# Currency conversion utilities for API boundary from decimal import Decimal from typing import Union def gtq_to_centavos(gtq_amount: Union[float, int, str]) -> int: """Convert GTQ to centavos for database storage""" return int(Decimal(str(gtq_amount)) * 100) def centavos_to_gtq(centavos: int) -> float: """Convert centavos to GTQ for API responses""" return float(centavos) / 100 def format_gtq_currency(centavos: int) -> str: """Format centavos as GTQ currency string""" gtq_amount = centavos_to_gtq(centavos) return f"Q{gtq_amount:.2f}" # Conversion helpers for API responses def deposit_db_to_api(deposit_db) -> dict: """Convert database deposit model to API response""" return { "id": deposit_db.id, "client_id": deposit_db.client_id, "amount_gtq": centavos_to_gtq(deposit_db.amount), "currency": deposit_db.currency, "status": deposit_db.status, "notes": deposit_db.notes, "created_at": deposit_db.created_at, "confirmed_at": deposit_db.confirmed_at } def balance_summary_db_to_api(balance_db) -> dict: """Convert database balance summary to API response""" return { "client_id": balance_db.client_id, "total_deposits_gtq": centavos_to_gtq(balance_db.total_deposits), "total_payments_gtq": centavos_to_gtq(balance_db.total_payments), "remaining_balance_gtq": centavos_to_gtq(balance_db.remaining_balance), "currency": balance_db.currency }