Last active
May 27, 2026 11:48
-
-
Save iaverin/92fe6354c031346982d7687c9ce1bfe3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Сервис подгтовки отчета 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