- Add CURRENCY_DECIMALS dict (JPY=0, BHD/KWD/OMR=3, rest=2) and DEFAULT_CURRENCY_DECIMALS=2
- Add CurrencyConverter.format_money() staticmethod with ROUND_HALF_UP; symbol-prefix for known, code-prefix for unknown
- Replace 14 :,.2f literals across services.py / info.py / config_cmd.py with format_money() calls
- Refactor 2 i18n templates (transaction_add.ok, recurring_add.ok): {amount:.2f} -> {amount_str}; callers pass pre-formatted string
- New _account_currency() helper for transaction currency lookup
- Extend test_currency.py: 8 new tests (JPY/BHD/USD/CHF/negative/zero/float-int/lowercase)
- 75/75 tests pass; 0 :,.2f literals remain in infrastructure/cli/
83 lines
3.9 KiB
Python
83 lines
3.9 KiB
Python
"""cf info — сводка всей финансовой модели."""
|
|
import typer
|
|
from rich.table import Table
|
|
|
|
from domain import CurrencyConverter
|
|
from infrastructure.cli.i18n import t
|
|
from infrastructure.cli.services import console, load_model
|
|
|
|
app = typer.Typer()
|
|
|
|
|
|
@app.command()
|
|
def info() -> None:
|
|
"""Сводка всей финансовой модели"""
|
|
model = load_model()
|
|
converter = CurrencyConverter(model.exchange_rates)
|
|
symbol = converter.get_symbol(model.base_currency)
|
|
|
|
console.print(f"[bold]{t('cmd.info.metadata')}[/bold]")
|
|
console.print(f" {t('cmd.info.base_currency', currency=model.base_currency, symbol=symbol)}")
|
|
console.print(f" {t('cmd.info.accounts', count=len(model.accounts))}")
|
|
console.print(f" {t('cmd.info.transactions', count=len(model.transactions))}")
|
|
console.print(f" {t('cmd.info.recurring', count=len(model.recurring))}")
|
|
console.print(f" {t('cmd.info.assets', count=len(model.assets))}")
|
|
console.print(f" {t('cmd.info.liabilities', count=len(model.liabilities))}")
|
|
console.print(f" {t('cmd.info.rates', count=len(model.exchange_rates))}")
|
|
|
|
if model.accounts:
|
|
tbl = Table(title=t("table.accounts.title"))
|
|
tbl.add_column(t("table.accounts.col.name"), style="cyan")
|
|
tbl.add_column(t("table.accounts.col.currency"))
|
|
tbl.add_column(t("table.accounts.col.balance"), justify="right")
|
|
for a in model.accounts:
|
|
tbl.add_row(a.name, a.currency, CurrencyConverter.format_money(a.balance, a.currency))
|
|
console.print(tbl)
|
|
|
|
if model.transactions:
|
|
tbl = Table(title=t("table.transactions.title"))
|
|
tbl.add_column(t("table.transactions.col.date"))
|
|
tbl.add_column(t("table.transactions.col.category"))
|
|
tbl.add_column(t("table.transactions.col.amount"), justify="right")
|
|
tbl.add_column(t("table.transactions.col.description"))
|
|
for tx in model.transactions[:10]:
|
|
amount_str = CurrencyConverter.format_money(tx.amount, model.base_currency)
|
|
tbl.add_row(tx.date, tx.category, amount_str, tx.description)
|
|
if len(model.transactions) > 10:
|
|
console.print(tbl)
|
|
console.print(t("cmd.info.more", count=len(model.transactions) - 10))
|
|
else:
|
|
console.print(tbl)
|
|
|
|
if model.recurring:
|
|
tbl = Table(title=t("table.recurring.title"))
|
|
tbl.add_column(t("table.recurring.col.period"))
|
|
tbl.add_column(t("table.recurring.col.amount"), justify="right")
|
|
tbl.add_column(t("table.recurring.col.category"))
|
|
for r in model.recurring:
|
|
amount_str = CurrencyConverter.format_money(r.amount, model.base_currency)
|
|
tbl.add_row(r.frequency, amount_str, r.category)
|
|
console.print(tbl)
|
|
|
|
if model.assets:
|
|
tbl = Table(title=t("table.assets.title"))
|
|
tbl.add_column(t("table.assets.col.name"), style="cyan")
|
|
tbl.add_column(t("table.assets.col.value"), justify="right")
|
|
tbl.add_column(t("table.assets.col.growth"), justify="right")
|
|
for a in model.assets:
|
|
value_str = CurrencyConverter.format_money(a.value, model.base_currency)
|
|
tbl.add_row(a.name, value_str, f"{a.growth_rate:.1f}%")
|
|
console.print(tbl)
|
|
|
|
if model.liabilities:
|
|
tbl = Table(title=t("table.liabilities.title"))
|
|
tbl.add_column(t("table.liabilities.col.name"), style="cyan")
|
|
tbl.add_column(t("table.liabilities.col.balance"), justify="right")
|
|
tbl.add_column(t("table.liabilities.col.rate"), justify="right")
|
|
tbl.add_column(t("table.liabilities.col.payment"), justify="right")
|
|
for li in model.liabilities:
|
|
balance_str = CurrencyConverter.format_money(li.balance, model.base_currency)
|
|
payment_str = CurrencyConverter.format_money(li.payment, model.base_currency)
|
|
tbl.add_row(li.name, balance_str, f"{li.interest:.1f}%", payment_str)
|
|
console.print(tbl)
|