#!/usr/bin/env python3 """ Legal Corpus Builder for Domovoy 2.0 (PyMuPDF Native Engine). Формирует сводный нормативно-правовой корпус законов РФ (LEGAL_CORPUS_MANDATORY.pdf). Полностью автономен, не требует сторонних рендереров. """ import os import sys import logging from pathlib import Path import fitz # PyMuPDF BASE_DIR = Path(__file__).resolve().parent LEGAL_DIR = BASE_DIR / "legal_sources" LEGAL_DIR.mkdir(parents=True, exist_ok=True) OUTPUT_MASTER = BASE_DIR / "LEGAL_CORPUS_MANDATORY.pdf" logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") log = logging.getLogger("LegalCorpusBuilder") CORE_LAWS = [ { "filename": "01_Конституция_РФ_Выдержки_МКД.pdf", "title": "КОНСТИТУЦИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ (НОРМЫ ЗАЩИТЫ ПРАВ ГРАЖДАН)", "subtitle": "Принята всенародным голосованием 12 декабря 1993 г.", "articles": [ ("Статья 33", "Граждане Российской Федерации имеют право обращаться лично, а также направлять индивидуальные и коллективные обращения в государственные органы и органы местного самоуправления."), ("Статья 35", "Право частной собственности охраняется законом. Каждый вправе иметь имущество в собственности, владеть, пользоваться и распоряжаться им как единолично, так и совместно с другими лицами. Никто не может быть лишен своего имущества иначе как по решению суда."), ("Статья 45", "Государственная защита прав и свобод человека и гражданина в Российской Федерации гарантируется. Каждый вправе защищать свои права и свободы всеми способами, не запрещенными законом."), ("Статья 46", "Каждому гарантируется судебная защита его прав и свобод. Решения и действия (или бездействие) органов государственной власти, органов местного самоуправления, общественных объединений и должностных лиц могут быть обжалованы в суд."), ("Статья 53", "Каждый имеет право на возмещение государством вреда, причиненного незаконными действиями (или бездействием) органов государственной власти или их должностных лиц.") ] }, { "filename": "02_ФЗ_59_Порядок_Рассмотрения_Обращений.pdf", "title": "ФЕДЕРАЛЬНЫЙ ЗАКОН № 59-ФЗ «О ПОРЯДКЕ РАССМОТРЕНИЯ ОБРАЩЕНИЙ ГРАЖДАН РФ»", "subtitle": "От 02 мая 2006 года (с изменениями)", "articles": [ ("Статья 8. Направление и регистрация письменного обращения", "Ч. 2. Письменное обращение подлежит обязательной регистрации в течение трех дней с момента поступления в государственный орган или орган местного самоуправления.\n" "Ч. 6. ЗАПРЕЩАЕТСЯ направлять жалобу на рассмотрение в государственный орган, орган местного самоуправления или должностному лицу, решение или действие (бездействие) которых обжалуется."), ("Статья 10. Обязанности должностных лиц при рассмотрении обращения", "Государственный орган или должностное лицо: обеспечивает объективное, всестороннее и своевременное рассмотрение обращения; запрашивает необходимые документы и материалы; принимает меры, направленные на восстановление или защиту нарушенных прав; дает письменный ответ по существу."), ("Статья 12. Сроки рассмотрения письменного обращения", "Ч. 1. Письменное обращение рассматривается в течение 30 ДНЕЙ со дня регистрации.\n" "Ч. 2. В исключительных случаях срок может быть продлен не более чем на 30 дней с обязательным письменным уведомлением гражданина до истечения первого срока."), ("Статья 15. Ответственность за нарушение законодательства", "Лица, виновные в нарушении настоящего Федерального закона, несут ответственность, предусмотренную законодательством РФ (ст. 5.59 КоАП РФ — административный штраф на должностных лиц).") ] }, { "filename": "03_Жилищный_Кодекс_РФ_Ключевые_Главы.pdf", "title": "ЖИЛИЩНЫЙ КОДЕКС РОССИЙСКОЙ ФЕДЕРАЦИИ (КЛЮЧЕВЫЕ СТАТЬИ ПО УПРАВЛЕНИЮ МКД)", "subtitle": "Федеральный закон от 29.12.2004 № 188-ФЗ", "articles": [ ("Статья 36. Право собственности на общее имущество собственников в МКД", "Собственникам помещений в МКД принадлежит на праве общей долевой собственности общее имущество: крыши, ограждающие несущие и ненесущие конструкции, механическое, электрическое, санитарно-техническое и иное оборудование, земельный участок под домом."), ("Статья 39. Содержание общего имущества в многоквартирном доме", "Собственники несут бремя расходов на содержание общего имущества соразмерно своей доле. Правила содержания устанавливаются Правительством РФ (ПП № 491)."), ("Статьи 44-46. Общее собрание собственников (ОСС)", "ОСС является высшим органом управления МКД. Решения ОСС оформляются протоколами. Решения и протокол ОСС являются официальными документами, влекущими юридические последствия. Их фальсификация влечет уголовную ответственность по ст. 327 УК РФ."), ("Статья 161. Выбор способа управления МКД", "Управление МКД должно обеспечивать благоприятные и безопасные условия проживания граждан, надлежащее содержание общего имущества. Надлежащее содержание общего имущества обеспечивается управляющей организацией."), ("Статья 162. Договор управления многоквартирным домом", "По договору управления управляющая организация по заданию собственников обязуется выполнять работы и оказывать услуги по надлежащему содержанию и ремонту общего имущества, предоставлять коммунальные услуги. УК обязана ежегодно в течение первого квартала представлять собственникам отчет о выполнении договора."), ("Статьи 192-196. Лицензирование деятельности по управлению МКД", "Деятельность УК осуществляется на основании лицензии. За грубые нарушения лицензионных требований дом исключается из реестра лицензий УК (ст. 198 ЖК РФ).") ] }, { "filename": "04_ПП_РФ_354_Коммунальные_Услуги.pdf", "title": "ПОСТАНОВЛЕНИЕ ПРАВИТЕЛЬСТВА РФ № 354 «ПРАВИЛА ПРЕДОСТАВЛЕНИЯ КОММУНАЛЬНЫХ УСЛУГ»", "subtitle": "От 06 мая 2011 года", "articles": [ ("Пункт 31. Обязанности исполнителя (УК)", "Исполнитель обязан: предоставлять потребителю коммунальные услуги надлежащего качества; немедленно, но НЕ ПОЗДНЕЕ 2 ЧАСОВ с момента получения сообщения потребителя об аварии организовать проверку факта нарушения; вести учет жалоб; производить перерасчет размера платы."), ("Пункты 98-103. Перерасчет платы за коммунальные услуги ненадлежащего качества", "При предоставлении коммунальной услуги ненадлежащего качества размер платы снижается вплоть до полного освобождения потребителя от оплаты за каждый час превышения допустимой продолжительности перерыва."), ("Пункты 104-109. Порядок фиксации нарушения качества услуги и составления акта", "По результатам проверки составляется акт проверки. Если представитель УК не явился в течение 2 часов, потребитель вправе составить акт с участием председателя совета дома и не менее чем 2 соседей.") ] }, { "filename": "05_ПП_РФ_491_Содержание_Общего_Имущества.pdf", "title": "ПОСТАНОВЛЕНИЕ ПРАВИТЕЛЬСТВА РФ № 491 «ПРАВИЛА СОДЕРЖАНИЯ ОБЩЕГО ИМУЩЕСТВА В МКД»", "subtitle": "От 13 августа 2006 года", "articles": [ ("Пункт 10. Требования к содержанию общего имущества", "Общее имущество должно содержаться в состоянии, обеспечивающем: надежность и безопасность многоквартирного дома; безопасность для жизни и здоровья граждан; постоянную готовность инженерных коммуникаций; соблюдение прав и законных интересов собственников."), ("Пункт 42. Ответственность управляющей организации", "Управляющие организации отвечают перед собственниками помещений за нарушение своих обязательств и несут ответственность за надлежащее содержание общего имущества в соответствии с законодательством РФ и договором управления.") ] }, { "filename": "06_Постановление_Госстроя_170_Сроки_Ремонта.pdf", "title": "ПОСТАНОВЛЕНИЕ ГОССТРОЯ РФ № 170 «ПРАВИЛА И НОРМЫ ТЕХНИЧЕСКОЙ ЭКСПЛУАТАЦИИ ЖИЛФОНДА»", "subtitle": "От 27 сентября 2003 года (Предельные сроки устранения неисправностей при авариях)", "articles": [ ("Приложение № 2. Предельные сроки устранения аварий", "• Протечки в отдельных местах кровли: СТРОГО 1 СУТКИ с момента обращения.\n" "• Повреждения водосточных труб, воронок, колен: 1 СУТКИ.\n" "• Неисправности аварийного порядка трубопроводов (отопление, ГВС, ХВС): НЕМЕДЛЕННО.\n" "• Неисправности лифта: НЕ БОЛЕЕ 1 СУТОК.\n" "• Разбитые стекла и сорванные створки оконных переплетов в подъездах (зимой): 1 СУТКИ.\n" "• Неисправности электроснабжения (отсутствие света в подъездах): 7 ЧАСОВ.\n" "• Засор мусоропровода, канализации: 1 СУТКИ."), ("Пункт 4.6.3.2", "При обнаружении протечек в отдельных местах кровли, независимо от причин их возникновения, управляющая организация обязана немедленно принять меры к их устранению.") ] }, { "filename": "07_КоАП_РФ_Статьи_Нарушений_ЖКХ.pdf", "title": "КОДЕКС ОБ АДМИНИСТРАТИВНЫХ ПРАВОНАРУШЕНИЯХ РФ (СТАТЬИ ОТВЕТСТВЕННОСТИ УК И ВЕДОМСТВ)", "subtitle": "Применяются при обращениях в ГЖИ, Прокуратуру и Роспотребнадзор", "articles": [ ("Статья 5.39. Отказ в предоставлении информации", "Неправомерный отказ в предоставлении гражданину информации, предоставление которой предусмотрено законом — влечет наложение штрафа на должностных лиц до 10 000 руб."), ("Статья 5.59. Нарушение порядка рассмотрения обращений граждан (по 59-ФЗ)", "Нарушение установленного порядка рассмотрения обращений граждан должностными лицами госорганов — влечет наложение штрафа от 5 000 до 10 000 руб."), ("Статья 7.22. Нарушение правил содержания и ремонта жилых домов", "Нарушение лицами, ответственными за содержание жилых домов, правил содержания и ремонта — влечет наложение штрафа на юридических лиц (УК) от 40 000 до 50 000 рублей."), ("Статья 7.23. Нарушение нормативов обеспечения коммунальными услугами", "Нарушение нормативного уровня или режима обеспечения населения коммунальными услугами — влечет наложение штрафа на юридических лиц до 100 000 рублей (повторное — до 500 000 руб.)."), ("Статья 7.23.3. Нарушение правил предпринимательской деятельности по управлению МКД", "Влечет наложение штрафа на УК от 150 000 до 250 000 рублей."), ("Статья 14.1.3. Управление МКД с нарушением лицензионных требований", "Влечет наложение штрафа на УК от 250 000 до 300 000 рублей или дисквалификацию руководителя на срок до 3 лет.") ] }, { "filename": "08_Уголовный_Кодекс_РФ_Преступления_ЖКХ.pdf", "title": "УГОЛОВНЫЙ КОДЕКС РФ (СТАТЬИ ПО ФАЛЬСИФИКАЦИЯМ И ХИЩЕНИЯМ В СФЕРЕ ЖКХ)", "subtitle": "Применяются при обращениях в Следственный Комитет и МВД", "articles": [ ("Статья 159. Мошенничество", "Хищение денежных средств собственников МКД путем обмана или злоупотребления доверием (приписки в отчетах, списание средств за невыполненные работы). Наказывается лишением свободы на срок до 10 лет."), ("Статья 160. Присвоение или растрата", "Хищение чужого имущества, вверенного виновному (нецелевое расходование средств текущего ремонта или фонда содержания общего имущества дома)."), ("Статья 201. Злоупотребление полномочиями", "Использование лицом, выполняющим управленческие функции в УК, своих полномочий вопреки законным интересам организации и граждан."), ("Статья 293. Халатность", "Неисполнение или ненадлежащее исполнение должностным лицом надзорного органа (ГЖИ, Администрации) своих обязанностей вследствие недобросовестного отношения к службе."), ("Статья 327. Подделка официальных документов", "Подделка официального документа (бюллетеней голосования ОСС, протокола общего собрания собственников МКД) в целях его использования. Наказывается лишением свободы на срок до 2 лет.") ] } ] def build_pdf_document(law: dict) -> Path: doc = fitz.open() page = doc.new_page(width=595, height=842) # A4 # Header page.draw_rect(fitz.Rect(35, 30, 560, 85), color=(0.1, 0.25, 0.5), fill=(0.95, 0.97, 1.0), width=1) page.insert_text(fitz.Point(45, 52), law["title"][:70], fontsize=10.5, color=(0.05, 0.15, 0.35)) page.insert_text(fitz.Point(45, 68), law["subtitle"][:85], fontsize=8, color=(0.3, 0.3, 0.3)) page.insert_text(fitz.Point(45, 80), "ЮРИДИЧЕСКИЙ КОРПУС СИСТЕМЫ «ДОМОВОЙ 2.0» | ЛЕНКОМ 37", fontsize=7, color=(0.1, 0.3, 0.6)) y = 105 for title, text in law["articles"]: # Проверяем, помещается ли статья на странице est_height = 40 + len(text) * 0.25 if y + est_height > 800: page = doc.new_page(width=595, height=842) y = 40 page.draw_rect(fitz.Rect(35, y, 560, y + 16), color=(0.85, 0.88, 0.92), fill=(0.92, 0.94, 0.97), width=0.5) page.insert_text(fitz.Point(42, y + 12), title[:85], fontsize=9, color=(0.08, 0.2, 0.45)) y += 22 rect = fitz.Rect(40, y, 555, y + est_height) page.insert_textbox(rect, text, fontsize=8.5, color=(0.12, 0.12, 0.12)) y += est_height + 10 out_path = LEGAL_DIR / law["filename"] doc.save(out_path, garbage=3, deflate=True) doc.close() log.info(f"Generated: {out_path.name}") return out_path def consolidate_legal_corpus(): log.info("Generating individual legal PDFs...") pdf_paths = [build_pdf_document(law) for law in CORE_LAWS] log.info("Consolidating all legal sources into master LEGAL_CORPUS_MANDATORY.pdf...") master = fitz.open() toc = [] page_count = 0 for idx, p in enumerate(pdf_paths, 1): doc = fitz.open(p) doc_len = len(doc) title = CORE_LAWS[idx-1]["title"] toc.append([1, title, page_count + 1]) master.insert_pdf(doc) page_count += doc_len doc.close() master.set_toc(toc) master.save(OUTPUT_MASTER, garbage=3, deflate=True) master.close() size_kb = OUTPUT_MASTER.stat().st_size / 1024 log.info(f"✅ Master Legal Corpus compiled: {OUTPUT_MASTER} ({size_kb:.1f} KB, {page_count} pages)") if __name__ == "__main__": consolidate_legal_corpus()