from fpdf import FPDF import os def generate_pdf_report(hotel_name, reservations, start_date, end_date): """Генерация PDF отчета.""" pdf = FPDF(orientation='L', unit="mm", format="A4") pdf.add_page() # Укажите путь к шрифту font_path = os.path.join("bot", "fonts", "OpenSans-Regular.ttf") if not os.path.exists(font_path): raise FileNotFoundError(f"Шрифт {font_path} не найден. Убедитесь, что он находится в указанной папке.") pdf.add_font("OpenSans", "", font_path, uni=True) pdf.set_font("OpenSans", size=12) # Заголовки title = f"Отчет по заселениям: {hotel_name}" period = ( f"Период: {start_date.strftime('%d.%m.%Y')} - {end_date.strftime('%d.%m.%Y')}" if start_date and end_date else "Период: Все время" ) pdf.cell(0, 10, txt=title, ln=True, align="C") pdf.cell(0, 10, txt=period, ln=True, align="C") pdf.ln(10) # Ширины колонок page_width = pdf.w - 10 col_widths = [page_width * 0.2, page_width * 0.2, page_width * 0.15, page_width * 0.25, page_width * 0.1, page_width * 0.1] # Заголовки таблицы pdf.set_font("OpenSans", size=10) headers = ["Дата заезда", "Дата выезда", "Номер", "Тип комнаты", "Цена"] for width, header in zip(col_widths, headers): pdf.cell(width, 15, header, border=1, align="C") pdf.ln() total_price = 0 total_discount = 0 for res in reservations: price = res.price or 0 discount = res.discount or 0 total_price += price total_discount += discount pdf.cell(col_widths[0], 10, res.check_in.strftime('%d.%m.%Y %H:%M'), border=1) pdf.cell(col_widths[1], 10, res.check_out.strftime('%d.%m.%Y %H:%M'), border=1) pdf.cell(col_widths[2], 10, res.room_number, border=1) pdf.cell(col_widths[3], 10, res.room_type, border=1) pdf.cell(col_widths[4], 10, f"{price:.2f} р.", border=1, align="R") pdf.ln() pdf.ln(5) pdf.set_font("OpenSans", size=18) pdf.cell(0, 10, "Итоги:", ln=True) pdf.cell(0, 10, f"Общая сумма цен: {total_price:.2f} руб.", ln=True) file_path = os.path.join("reports", f"{hotel_name}_report.pdf") os.makedirs(os.path.dirname(file_path), exist_ok=True) pdf.output(file_path) return file_path