def make_report(report_name: str, portfolio: Portfolio): """Формирует отчет из pdf-файла и исходных xlsx-данных. Отчет сохраняется в PDF_PATH. Для каждого отчета создается папка с наименованием и датой, куда помещаются pdf- и xlsx-файлы. """ data = read_data(report_name) # Верхний колонтитул date = portfolio.date pdf_path, xlsx_path = make_report_files_path(report_name, date) canvas = pdf_style.make_blank_report(pdf_path) pdf_style.make_header(canvas, date) # Верхний блок upper_block_position = pdf_style.BlockPosition( canvas=canvas, x=pdf_style.left_margin(), y=pdf_style.bottom_margin() + FIRST_BLOCK_HEIGHT, width=pdf_style.blank_width(), height=pdf_style.blank_height() - FIRST_BLOCK_HEIGHT, ) pdf_upper.flow_and_dividends_block(data[-61:], upper_block_position) # Разделитель между верхним и средним блоком pdf_style.make_section_delimiter( canvas, pdf_style.bottom_margin() + FIRST_BLOCK_HEIGHT ) # Средний блок middle_block_position = pdf_style.BlockPosition( canvas=canvas, x=pdf_style.left_margin(), y=pdf_style.bottom_margin() + SECOND_BLOCK_HEIGHT, width=pdf_style.blank_width(), height=FIRST_BLOCK_HEIGHT - SECOND_BLOCK_HEIGHT, ) pdf_middle.portfolio_return_block(data[-61:], middle_block_position) # Разделитель между средним и нижним блоком pdf_style.make_section_delimiter( canvas, pdf_style.bottom_margin() + SECOND_BLOCK_HEIGHT ) # Нижний блок lower_block_position = pdf_style.BlockPosition( canvas=canvas, x=pdf_style.left_margin(), y=pdf_style.bottom_margin() + THIRD_BLOCK_HEIGHT, width=pdf_style.blank_width(), height=SECOND_BLOCK_HEIGHT - THIRD_BLOCK_HEIGHT, ) pdf_lower.portfolio_structure_block(portfolio, lower_block_position) # Сохранение pdf-отчета и xlsx-данных canvas.save() data.to_excel(xlsx_path, SHEET_NAME)
"""Хранение истории стоимости портфеля и составление отчетов.""" import numpy as np import pandas as pd from poptimizer.config import REPORTS_PATH, POptimizerError from poptimizer.portfolio import Portfolio, PORTFOLIO from poptimizer.reports import pdf_style, pdf_upper, pdf_middle, pdf_lower # Каталог с pdf-отчетами PDF_PATH = REPORTS_PATH / "pdf" # Лист с данными SHEET_NAME = "Data" # Положение блоков относительно нижнего поля FIRST_BLOCK_HEIGHT = pdf_style.blank_height() * 0.76 SECOND_BLOCK_HEIGHT = pdf_style.blank_height() * 0.38 THIRD_BLOCK_HEIGHT = pdf_style.blank_height() * 0 def read_data(report_name: str): """Читает исходные данные по стоимости портфеля из файла.""" data = pd.read_excel( REPORTS_PATH / f"{report_name}.xlsx", sheet_name=SHEET_NAME, header=0, index_col=0, converters={"Date": pd.to_datetime}, engine="openpyxl", ) return data