add PDF report
This commit is contained in:
parent
4a7d89e5cb
commit
2f07950554
364
generate_pdf.py
Normal file
364
generate_pdf.py
Normal file
@ -0,0 +1,364 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from reportlab.lib import colors
|
||||
from reportlab.lib.pagesizes import A4, landscape
|
||||
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
|
||||
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
||||
from reportlab.lib.units import cm, inch
|
||||
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
|
||||
from reportlab.pdfbase import pdfmetrics
|
||||
from reportlab.pdfbase.ttfonts import TTFont
|
||||
|
||||
# Register a font that supports Cyrillic (using DejaVu or similar if available)
|
||||
# For simplicity, we'll use a standard font that should work
|
||||
try:
|
||||
pdfmetrics.registerFont(TTFont('DejaVu', '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'))
|
||||
FONT_NAME = 'DejaVu'
|
||||
except:
|
||||
FONT_NAME = 'Helvetica' # Fallback (won't support Cyrillic properly)
|
||||
|
||||
def create_pdf():
|
||||
doc = SimpleDocTemplate(
|
||||
"projects_report.pdf",
|
||||
pagesize=landscape(A4),
|
||||
rightMargin=1.5*cm,
|
||||
leftMargin=1.5*cm,
|
||||
topMargin=1.5*cm,
|
||||
bottomMargin=1.5*cm
|
||||
)
|
||||
|
||||
styles = getSampleStyleSheet()
|
||||
|
||||
# Custom styles
|
||||
title_style = ParagraphStyle(
|
||||
'CustomTitle',
|
||||
parent=styles['Heading1'],
|
||||
fontSize=24,
|
||||
textColor=colors.HexColor('#1e3a5f'),
|
||||
spaceAfter=30,
|
||||
alignment=TA_CENTER,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
subtitle_style = ParagraphStyle(
|
||||
'CustomSubtitle',
|
||||
parent=styles['Heading2'],
|
||||
fontSize=14,
|
||||
textColor=colors.HexColor('#64748b'),
|
||||
spaceAfter=20,
|
||||
alignment=TA_CENTER,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
heading_style = ParagraphStyle(
|
||||
'CustomHeading',
|
||||
parent=styles['Heading2'],
|
||||
fontSize=16,
|
||||
textColor=colors.HexColor('#1e3a5f'),
|
||||
spaceAfter=12,
|
||||
spaceBefore=12,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
subheading_style = ParagraphStyle(
|
||||
'CustomSubHeading',
|
||||
parent=styles['Heading3'],
|
||||
fontSize=12,
|
||||
textColor=colors.HexColor('#3b82f6'),
|
||||
spaceAfter=8,
|
||||
spaceBefore=8,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
normal_style = ParagraphStyle(
|
||||
'CustomNormal',
|
||||
parent=styles['Normal'],
|
||||
fontSize=10,
|
||||
textColor=colors.HexColor('#334155'),
|
||||
spaceAfter=6,
|
||||
alignment=TA_JUSTIFY,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
bullet_style = ParagraphStyle(
|
||||
'CustomBullet',
|
||||
parent=styles['Normal'],
|
||||
fontSize=10,
|
||||
textColor=colors.HexColor('#334155'),
|
||||
spaceAfter=4,
|
||||
leftIndent=20,
|
||||
fontName=FONT_NAME
|
||||
)
|
||||
|
||||
story = []
|
||||
|
||||
# Title page
|
||||
story.append(Spacer(1, 2*cm))
|
||||
story.append(Paragraph("ОТЧЕТ ПО ПРОЕКТАМ БКВ", title_style))
|
||||
story.append(Paragraph("Справка о ходе реализации 9 проектов", subtitle_style))
|
||||
story.append(Spacer(1, 1*cm))
|
||||
|
||||
# Summary table
|
||||
summary_data = [
|
||||
['№', 'Проект', 'Статус', 'Период', 'План/Освоено (тыс. ₸)'],
|
||||
['1', 'Smart Aqkol 2025', 'Завершена', '2025-2028', '334 192'],
|
||||
['2', 'Комплексное решение для приемных покоев', 'Рассмотрение заявок', '2026-2032', '3 794 965'],
|
||||
['3', 'Смарт-видеожетоны', 'Рассмотрение заявок', '2026-2033', '4 240 714'],
|
||||
['4', 'GenAI KT', 'Внедрение', '-', '727 000 (доход)'],
|
||||
['5', 'Единая инфраструктура дронов', 'Масштабирование', '2025-2030', '1 210 956'],
|
||||
['6', 'Национальный каталог товаров', 'Опытная эксплуатация', '-', 'На финансировании'],
|
||||
['7', 'ЦОД в г. Косшы', 'Завершающая стадия', '-', '3 711 077'],
|
||||
['8', 'Вычислительные мощности для ИИ', 'Масштабирование', '2 этапа', '-'],
|
||||
['9', 'Холодовая цепь', 'Подготовка к запуску', 'Старт 01.10.2026', '-']
|
||||
]
|
||||
|
||||
summary_table = Table(summary_data, colWidths=[0.8*cm, 5*cm, 3.5*cm, 3*cm, 4*cm])
|
||||
summary_table.setStyle(TableStyle([
|
||||
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#1e3a5f')),
|
||||
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
|
||||
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
|
||||
('FONTNAME', (0, 0), (-1, 0), FONT_NAME),
|
||||
('FONTSIZE', (0, 0), (-1, 0), 11),
|
||||
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
|
||||
('BACKGROUND', (0, 1), (-1, -1), colors.HexColor('#f1f5f9')),
|
||||
('FONTNAME', (0, 1), (-1, -1), FONT_NAME),
|
||||
('FONTSIZE', (0, 1), (-1, -1), 9),
|
||||
('TOPPADDING', (0, 1), (-1, -1), 8),
|
||||
('BOTTOMPADDING', (0, 1), (-1, -1), 8),
|
||||
('GRID', (0, 0), (-1, -1), 1, colors.HexColor('#cbd5e1')),
|
||||
]))
|
||||
|
||||
story.append(summary_table)
|
||||
story.append(Spacer(1, 0.5*cm))
|
||||
story.append(Paragraph("Дата формирования отчета: Август 2026", normal_style))
|
||||
story.append(PageBreak())
|
||||
|
||||
# Project details
|
||||
projects = [
|
||||
{
|
||||
'title': '1. Проект «Smart Aqkol 2025: Расширение цифровых решений и внедрение ИИ»',
|
||||
'status': 'Завершена',
|
||||
'period': '4 года (2025-2028)',
|
||||
'budget': '334 192 тыс. ₸',
|
||||
'details': [
|
||||
('СПП элемент', 'I.25.DBD.58.002'),
|
||||
('Сумма договора (без НДС)', '151 897 тыс. ₸'),
|
||||
('План доходов', '1 114 082 тыс. ₸'),
|
||||
('План расходов', '636 090 тыс. ₸'),
|
||||
('Фактический расход', '0 тыс. ₸'),
|
||||
('План CAPEX', '334 192,2 тыс. ₸'),
|
||||
('Фактически освоенный CAPEX', '334 192 тыс. ₸'),
|
||||
],
|
||||
'description': 'В рамках совместной работы, ДУПом было подписано дополнительное соглашение к договору с Консорциумом в составе АО «Логиком» совместно с ТОО «ОптикСтрой».',
|
||||
'current_status': 'По данному объекту в рамках договора № 1098000/2025/5 от 12.06.2025 подрядной организации передан заказ №1098000/2025/5/004. СМР в работе. Подрядчик продолжает выполнение строительно-монтажных работ.'
|
||||
},
|
||||
{
|
||||
'title': '2. Проект «Комплексное решение для приемных покоев»',
|
||||
'status': 'Рассмотрение заявок',
|
||||
'period': '7 лет (2026-2032)',
|
||||
'budget': '3 794 965 тыс. ₸',
|
||||
'details': [
|
||||
('СПП элемент', 'I.26.DBD.58.006/01-01'),
|
||||
('План БКВ на 2026 год', '3 794 965 тыс. ₸'),
|
||||
('План доходов', '12 362 599 тыс. ₸'),
|
||||
('План расходов', '6 061 935 тыс. ₸'),
|
||||
('План CAPEX', '3 794 964,9 тыс. ₸'),
|
||||
],
|
||||
'description': '',
|
||||
'current_status': 'Прием заявок завершен. Ведется рассмотрение заявок на портале zakup.sk.kz.'
|
||||
},
|
||||
{
|
||||
'title': '3. Проект «Смарт-видеожетоны»',
|
||||
'status': 'Рассмотрение заявок',
|
||||
'period': '8 лет (2026-2033)',
|
||||
'budget': '4 240 714 тыс. ₸',
|
||||
'details': [
|
||||
('Ответственный', 'Қапан Даурен'),
|
||||
('СПП элемент', 'I.26.DBD.58.002/01-01'),
|
||||
('План БКВ на 2026 год', '4 240 714 тыс. ₸'),
|
||||
('План доходов', '10 614 456 тыс. ₸'),
|
||||
('План расходов', '5 143 647 тыс. ₸'),
|
||||
('План CAPEX', '4 240 714,2 тыс. ₸'),
|
||||
],
|
||||
'description': '',
|
||||
'current_status': 'Прием заявок завершен. Ведется рассмотрение заявок на портале zakup.sk.kz.'
|
||||
},
|
||||
{
|
||||
'title': '4. Проект «GenAI KT»',
|
||||
'status': 'Внедрение',
|
||||
'period': '-',
|
||||
'budget': '727 млн ₸ (доход 2026)',
|
||||
'details': [
|
||||
('Направление', 'Разработка и коммерциализация решений на базе ИИ'),
|
||||
('Клиенты', 'АО «Самрук-Қазына» и портфельные компании'),
|
||||
],
|
||||
'description': 'GenAI KT - это направление по разработке и коммерциализации решений на базе искусственного интеллекта для корпоративного и государственного сектора. Проект включает создание AI-агентов, Generative AI и аналитических решений.',
|
||||
'current_status': 'В 2026 году получены доходы в размере 727 млн. тенге. Разработаны: AI-рекрутер, AI-юрист, AI БиОТ, AI по социальной стабильности, SKAI, SKAI Data, AI-агент «Жеті Жарғы» для Сената. Проводятся тестирование и внедрение с портфельными компаниями (АО «Казпочта», АО «Самрук-Энерго», АО «НГК «Тау-Кен Самрук», АО «KEGOC»).',
|
||||
'bullets': [
|
||||
'Внедрение ИИ-агентов - 727 млн. тенге',
|
||||
'Увеличение штатной численности Департамента AI',
|
||||
'Проводится работа по коммерциализации и заключению доходных договоров'
|
||||
]
|
||||
},
|
||||
{
|
||||
'title': '5. Проект «Единая инфраструктура дронов»',
|
||||
'status': 'Масштабирование',
|
||||
'period': '2025-2030',
|
||||
'budget': '1 210 956,26 тыс. ₸ (освоено в 2025)',
|
||||
'details': [
|
||||
('Освоено 2025', '1 210 956,26 тыс. ₸'),
|
||||
('CAPEX 2026', 'Не предусмотрен'),
|
||||
('Оборудование', '89 дронов с док-станциями'),
|
||||
('Штат', '18 сотрудников (Служба БПЛА)'),
|
||||
],
|
||||
'description': 'Инновационная платформа, объединяющая сервисную модель предоставления дронов и облачное ПО для планирования миссий и управления воздушным трафиком.',
|
||||
'current_status': '2025: Закуп оборудования и платформы, создание Службы БПЛА, пилотные проекты с госорганами, введение в эксплуатацию. 2026: Получение разрешений на полеты, заключены доходные договоры с госорганами, ведется масштабирование.'
|
||||
},
|
||||
{
|
||||
'title': '6. Проект «Национальный каталог товаров»',
|
||||
'status': 'Опытная эксплуатация',
|
||||
'period': '-',
|
||||
'budget': 'На рассмотрении в Минфине',
|
||||
'details': [
|
||||
('Утверждение БП', 'Протокол № 32 от 8 июля 2026'),
|
||||
('Статус системы', 'Акт запуска от 31.12.2025'),
|
||||
('Финансирование', 'На рассмотрении в Министерстве финансов'),
|
||||
],
|
||||
'description': 'ТОО «Центр развития цифровой экономики» обеспечивает функционирование и развитие информационной системы НКТ.',
|
||||
'current_status': 'НКТ функционирует в режиме опытной эксплуатации с 1 января 2026 года. Выполняются функции по регистрации товаров и актуализации сведений. Разработаны Методика пост-мониторинга и План-график реализации (на проверке).',
|
||||
'bullets': [
|
||||
'Регистрация и ведение карточек товаров',
|
||||
'Присвоение кодов NTIN',
|
||||
'Модерация и актуализация сведений',
|
||||
'Развитие ИИ-инструментов для анализа карточек',
|
||||
'Проработка обеспечения GPU-ресурсами'
|
||||
]
|
||||
},
|
||||
{
|
||||
'title': '7. Проект «Строительство ЦОД в г. Косшы»',
|
||||
'status': 'Завершающая стадия',
|
||||
'period': '-',
|
||||
'budget': '3 711 077 тыс. ₸ (освоено янв-авг 2026)',
|
||||
'details': [
|
||||
('Освоено (янв-авг 2026)', '3 711 077 тыс. ₸'),
|
||||
('Готовность здания', '100%'),
|
||||
('Готовность оборудования', '100%'),
|
||||
('Характеристики', '248 стоек, мощность ≥ 3,5 МВт'),
|
||||
('№ закупа подстанций', '1234623'),
|
||||
],
|
||||
'description': 'Проект предусматривает создание современной инфраструктуры ЦОД с размещением IT-оборудования и соответствующими инженерными системами.',
|
||||
'current_status': 'Основное здание и оборудование имеют 100% готовность. Проводятся тендерные процедуры по расширению (модернизации) подстанций (рассмотрение заявок).'
|
||||
},
|
||||
{
|
||||
'title': '8. Проект «Развитие вычислительных мощностей для ИИ-решений»',
|
||||
'status': 'Масштабирование (2 этап)',
|
||||
'period': '-',
|
||||
'budget': '-',
|
||||
'details': [
|
||||
('Основание', 'Поручение ГГ от 25.01.2025 (ППРК № 592)'),
|
||||
('Локация', 'г. Алматы, ул. Диваева, 39'),
|
||||
('Этап I', '50 серверов HGX, 400 GPU NVIDIA H200, СХД 6 ПБ'),
|
||||
('Этап II', '60 серверов HGX, 480 GPU NVIDIA B300'),
|
||||
('Статус Этапа I', 'Введен в эксплуатацию 19.09.2025, используется на 100%'),
|
||||
('Статус Этапа II', 'Договор от 05.06.2026, монтаж до конца 2026'),
|
||||
],
|
||||
'description': 'Суперкомпьютерный комплекс Al-Farabium для предоставления вычислительных мощностей в аренду B2B & B2G клиентам.',
|
||||
'current_status': 'Этап I: 323 GPU (80%) выделено коммерческим клиентам, 77 GPU (20%) - пилотным проектам. Этап II: Договор с ТОО «АСБИС Казахстан» заключен, планируется поставка, монтаж и установка в ЦОД г. Косшы до конца III квартала 2026.',
|
||||
'bullets': [
|
||||
'1 квартал 2026: Защита бизнес-плана, закупочные процедуры',
|
||||
'2 квартал 2026: Закуп B300, заключение договора',
|
||||
'3 квартал 2026: Монтаж и установка в ЦОД Косшы',
|
||||
'4 квартал 2026: Бенч-тесты, ввод в эксплуатацию, коммерциализация'
|
||||
]
|
||||
},
|
||||
{
|
||||
'title': '9. Проект «Холодовая цепь»',
|
||||
'status': 'Подготовка к запуску',
|
||||
'period': 'Старт 1 октября 2026',
|
||||
'budget': '-',
|
||||
'details': [
|
||||
('Старт услуг', '1 октября 2026'),
|
||||
('Датчики', '15 000 штук (первая партия)'),
|
||||
('Технический партнер', '«КейДата»'),
|
||||
],
|
||||
'description': 'Система мониторинга для медицинских организаций.',
|
||||
'current_status': 'Подписан договор на 33 медорганизации с УЗ ЗКО, на регистрации договор на 51 медорганизацию по Астане. Ожидается подписание на 27 организаций в Актобе. В Жетісу и Шымкенте договоры заключаются напрямую. В 5 областях бюджет выделен, КП направлено.',
|
||||
'bullets': [
|
||||
'ИС развернута в тестовой среде',
|
||||
'Датчики проходят таможенные процедуры',
|
||||
'Вопросы с техпартнером прорабатываются ежедневно'
|
||||
]
|
||||
},
|
||||
]
|
||||
|
||||
for i, project in enumerate(projects):
|
||||
story.append(Paragraph(project['title'], heading_style))
|
||||
story.append(Spacer(1, 0.3*cm))
|
||||
|
||||
# Status bar
|
||||
status_data = [['Статус:', project['status'], 'Период:', project['period'], 'Бюджет:', project['budget']]]
|
||||
status_table = Table(status_data, colWidths=[1.5*cm, 4*cm, 1.5*cm, 4*cm, 1.5*cm, 5*cm])
|
||||
status_table.setStyle(TableStyle([
|
||||
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#f1f5f9')),
|
||||
('FONTNAME', (0, 0), (-1, 0), FONT_NAME),
|
||||
('FONTSIZE', (0, 0), (-1, 0), 9),
|
||||
('TOPPADDING', (0, 0), (-1, 0), 8),
|
||||
('BOTTOMPADDING', (0, 0), (-1, 0), 8),
|
||||
('ALIGN', (0, 0), (-1, 0), 'LEFT'),
|
||||
]))
|
||||
story.append(status_table)
|
||||
story.append(Spacer(1, 0.3*cm))
|
||||
|
||||
# Details table
|
||||
if project['details']:
|
||||
details_data = [['Параметр', 'Значение']]
|
||||
for key, value in project['details']:
|
||||
details_data.append([key, value])
|
||||
|
||||
details_table = Table(details_data, colWidths=[6*cm, 8*cm])
|
||||
details_table.setStyle(TableStyle([
|
||||
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#3b82f6')),
|
||||
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
|
||||
('FONTNAME', (0, 0), (-1, 0), FONT_NAME),
|
||||
('FONTSIZE', (0, 0), (-1, 0), 10),
|
||||
('TOPPADDING', (0, 0), (-1, 0), 8),
|
||||
('BOTTOMPADDING', (0, 0), (-1, 0), 8),
|
||||
('BACKGROUND', (0, 1), (-1, -1), colors.HexColor('#f8fafc')),
|
||||
('FONTNAME', (0, 1), (-1, -1), FONT_NAME),
|
||||
('FONTSIZE', (0, 1), (-1, -1), 9),
|
||||
('TOPPADDING', (0, 1), (-1, -1), 6),
|
||||
('BOTTOMPADDING', (0, 1), (-1, -1), 6),
|
||||
('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor('#cbd5e1')),
|
||||
('VALIGN', (0, 0), (-1, -1), 'TOP'),
|
||||
]))
|
||||
story.append(details_table)
|
||||
story.append(Spacer(1, 0.3*cm))
|
||||
|
||||
# Description
|
||||
if project.get('description'):
|
||||
story.append(Paragraph("Описание проекта:", subheading_style))
|
||||
story.append(Paragraph(project['description'], normal_style))
|
||||
story.append(Spacer(1, 0.2*cm))
|
||||
|
||||
# Current status
|
||||
if project.get('current_status'):
|
||||
story.append(Paragraph("Текущий статус:", subheading_style))
|
||||
story.append(Paragraph(project['current_status'], normal_style))
|
||||
story.append(Spacer(1, 0.2*cm))
|
||||
|
||||
# Bullets
|
||||
if project.get('bullets'):
|
||||
for bullet in project['bullets']:
|
||||
story.append(Paragraph(f"• {bullet}", bullet_style))
|
||||
|
||||
story.append(Spacer(1, 0.5*cm))
|
||||
if i < len(projects) - 1:
|
||||
story.append(PageBreak())
|
||||
|
||||
# Build PDF
|
||||
doc.build(story)
|
||||
print("PDF успешно создан: projects_report.pdf")
|
||||
|
||||
if __name__ == '__main__':
|
||||
create_pdf()
|
||||
BIN
projects_report.pdf
Normal file
BIN
projects_report.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user