mirror of
https://github.com/elisiariocouto/leggen.git
synced 2025-12-14 10:52:18 +00:00
Backend changes: - Add logo field to AccountDetails model - Update accounts API endpoints to include logo data - Add database migration for logo column in accounts table - Implement institution details fetching from GoCardless API - Enrich account data with institution logos during sync - Fix type errors in banks endpoint with proper response parsing Frontend changes: - Add failedImages state to track logo loading failures - Implement conditional rendering to show bank logos when available - Add proper error handling with fallback to Building2 icon - Fix image sizing to w-6 h-6 sm:w-8 sm:h-8 for proper display - Update Account interface to include optional logo field - Remove unused useState import from System component 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
80 lines
2.0 KiB
Python
80 lines
2.0 KiB
Python
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class AccountBalance(BaseModel):
|
|
"""Account balance model"""
|
|
|
|
amount: float
|
|
currency: str
|
|
balance_type: str
|
|
last_change_date: Optional[datetime] = None
|
|
|
|
class Config:
|
|
json_encoders = {datetime: lambda v: v.isoformat() if v else None}
|
|
|
|
|
|
class AccountDetails(BaseModel):
|
|
"""Account details model"""
|
|
|
|
id: str
|
|
institution_id: str
|
|
status: str
|
|
iban: Optional[str] = None
|
|
name: Optional[str] = None
|
|
display_name: Optional[str] = None
|
|
currency: Optional[str] = None
|
|
logo: Optional[str] = None
|
|
created: datetime
|
|
last_accessed: Optional[datetime] = None
|
|
balances: List[AccountBalance] = []
|
|
|
|
class Config:
|
|
json_encoders = {datetime: lambda v: v.isoformat() if v else None}
|
|
|
|
|
|
class AccountUpdate(BaseModel):
|
|
"""Account update model"""
|
|
|
|
display_name: Optional[str] = None
|
|
|
|
class Config:
|
|
json_encoders = {datetime: lambda v: v.isoformat() if v else None}
|
|
|
|
|
|
class Transaction(BaseModel):
|
|
"""Transaction model"""
|
|
|
|
transaction_id: str # NEW: stable bank-provided transaction ID
|
|
internal_transaction_id: Optional[str] = None # OLD: unstable GoCardless ID
|
|
institution_id: str
|
|
iban: Optional[str] = None
|
|
account_id: str
|
|
transaction_date: datetime
|
|
description: str
|
|
transaction_value: float
|
|
transaction_currency: str
|
|
transaction_status: str # "booked" or "pending"
|
|
raw_transaction: Dict[str, Any]
|
|
|
|
class Config:
|
|
json_encoders = {datetime: lambda v: v.isoformat()}
|
|
|
|
|
|
class TransactionSummary(BaseModel):
|
|
"""Transaction summary for lists"""
|
|
|
|
transaction_id: str # NEW: stable bank-provided transaction ID
|
|
internal_transaction_id: Optional[str] = None
|
|
date: datetime
|
|
description: str
|
|
amount: float
|
|
currency: str
|
|
status: str
|
|
account_id: str
|
|
|
|
class Config:
|
|
json_encoders = {datetime: lambda v: v.isoformat()}
|