Skip to content

Instantly share code, notes, and snippets.

@iaverin
Last active May 27, 2026 11:48
Show Gist options
  • Select an option

  • Save iaverin/92fe6354c031346982d7687c9ce1bfe3 to your computer and use it in GitHub Desktop.

Select an option

Save iaverin/92fe6354c031346982d7687c9ce1bfe3 to your computer and use it in GitHub Desktop.
"""
Сервис подгтовки отчета KPI по отделениям банка
Входящие агрументы:
- дата на которую нужно сформировать отчет
- список id отделений, день
Результат:
- данные по отношению объемы выданных кредитов к объему выданных ипотек за период
Примечание:
- необходимо сохранить сформированный отчет в базе данных (с целью логирования)
"""
import asyncio
from dataclasses import dataclass
import datetime
from decimal import Decimal
from fastapi import FastAPI
from pydantic import BaseModel
# --- Config ---
DB_SETTINGS = "postgresql://user:pass@localhost/postgres"
BRANCH_DATA_FETCHER_URL: str =""
@dataclass
class BranchDataFetcher():
"""
Класс реализует функционал запроса к системе получения данных по отделениям
"""
url: str
async def fetch_mortgage_issued_rubles(self, branch_id: str, request_date: datetime.date ) -> Decimal:
"""
получение объема выданных ипотек на дату в рублях
"""
...
async def fetch_credits_issued_rubles(self, branch_id: str, request_date: datetime.date) -> Decimal:
"""
получение объема выданных кредитов на дату в рублях
"""
...
# классы описывающие структуры данных по запросу/ответу
class BranchDataRequest(BaseModel):
report_date: datetime.date
branch_ids: list[str]
class SingleBranchAverageKpiReport(BaseModel):
branch_id: str
credits_to_mortgage_ratio: float
@dataclass
class ReportRepository():
"""
класс реализует сохранение в базу данных отчета по одному отделению
"""
session: AsyncSession
"""
сессия базы данных
"""
async def save_kpi_report(self, report_date: datetime.date, kpi_report: SingleBranchAverageKpiReport ) -> None:
...
# --- App ---
app = FastAPI(title="Order Service")
@app.get("reports/credits-to-mortgage")
async def branch_report(request: BranchDataRequest) -> list[SingleBranchAverageKpiReport]:
branch_report: list[SingleBranchAverageKpiReport] = []
branch_data_fetcher = BranchDataFetcher(BRANCH_DATA_FETCHER_URL)
for branch_id in request.branch_ids:
mortgage_issued_rubles = await branch_data_fetcher.fetch_mortgage_issued_rubles(
branch_id, request_date=request.report_date)
credit_issued_rubles = await branch_data_fetcher.fetch_credits_issued_rubles(
branch_id, request_date=request.report_date)
credits_to_mortgage_ratio = credit_issued_rubles / mortgage_issued_rubles
branch_report.append(
SingleBranchAverageKpiReport(
branch_id=branch_id, credits_to_mortage_ratio=credits_to_mortgage_ratio))
db_connection = create_db_connection(DB_SETTINGS)
db_session = db_connection.get_session()
repository = ReportRepository(db_session)
for report in branch_report:
await repository.save_kpi_report(report_date=request.report_date, kpi_report=report)
return branch_report
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment