"""cf forecast — прогноз денежных потоков.""" import typer from rich.table import Table from infrastructure.cli.i18n import t from infrastructure.cli.services import ( build_services, console, convert_value, fmt_amount, load_model, resolve_currency, ) app = typer.Typer() CURRENCY_OPTION = typer.Option(None, "--currency", "-c", help=t("cmd.forecast.opt.currency")) @app.command() def forecast( months: int = typer.Option(12, "--months", "-m", help=t("cmd.forecast.opt.months")), currency: str | None = CURRENCY_OPTION, ) -> None: """Запустить прогноз денежных потоков""" model = load_model() target_curr, symbol = resolve_currency(model, currency) forecast_service, _, _, converter = build_services(model) base_curr = model.base_currency results = forecast_service.forecast_cashflow(months) summary = forecast_service.summary(months) if results: table = Table(title=t("cmd.forecast.title", months=months, currency=target_curr)) table.add_column(t("cmd.forecast.col.account"), style="cyan") table.add_column(t("cmd.forecast.col.month"), style="white") table.add_column(t("cmd.forecast.col.balance"), justify="right", style="green") table.add_column(t("cmd.forecast.col.income"), justify="right") table.add_column(t("cmd.forecast.col.expenses"), justify="right") for r in results: table.add_row( r["account"], str(r["month"]), fmt_amount(convert_value(converter, r["balance"], base_curr, target_curr), target_curr, symbol), fmt_amount(convert_value(converter, r["income"], base_curr, target_curr), target_curr, symbol), fmt_amount(convert_value(converter, r["expenses"], base_curr, target_curr), target_curr, symbol), ) console.print(table) cb = convert_value(converter, summary["total_balance"], base_curr, target_curr) ci = convert_value(converter, summary["total_income"], base_curr, target_curr) ce = convert_value(converter, summary["total_expenses"], base_curr, target_curr) console.print(t("cmd.forecast.total", balance=fmt_amount(cb, target_curr, symbol), income=fmt_amount(ci, target_curr, symbol), expenses=fmt_amount(ce, target_curr, symbol)))