Commit Graph
53 Commits
Author SHA1 Message Date
prog1764 6ccea72dff fix: _set_app_icon разрывал __init__ (NameError: root is not defined) 2026-08-03 22:29:54 +04:00
prog1764 fb01a14c37 feat: иконка на окне программы (заголовок/панель задач) + в ресурсах exe 2026-08-03 22:02:32 +04:00
prog1764 5efc3a0e99 feat: иконка — 64/128px из нового оригинала (512x512) 2026-08-03 21:59:26 +04:00
prog1764 771bc6987f feat: иконка — 48px из нового оригинала (512) 2026-08-03 21:58:11 +04:00
prog1764 faf675e861 feat: иконка — 48px из отдельного оригинала (все размеры из своих файлов) 2026-08-03 21:56:50 +04:00
prog1764 7ebcf04f63 feat: иконка — каждый размер из отдельного оригинала (16/24/32/48/64/128/256) 2026-08-03 21:56:02 +04:00
prog1764 3134d19089 feat: иконка — все размеры из оригинальных рисунков (16px отдельный, 24-32 из малого, 48-256 из большого) 2026-08-03 21:55:11 +04:00
prog1764 dff3f7b971 feat: иконка — комбинированный ICO (мелкие 16-32 из малого рисунка, крупные 48-256 из большого) 2026-08-03 21:53:56 +04:00
prog1764 307f632363 feat: иконка 1024x1024 (ICO 16-256px) для exe 2026-08-03 21:52:29 +04:00
prog1764 9d156bfc0d feat: иконка приложения (dokogen/icon.ico) подключена к сборке 2026-08-03 21:49:12 +04:00
prog1764 5d7d727ef9 fix: build_exe.bat переписан в ASCII (кириллица в UTF-8 ломала cmd) 2026-08-03 21:30:56 +04:00
prog1764 2c3d25e790 feat: сборка в exe (PyInstaller)
- dokogen.spec: упаковка dictionaries/, data/, словарей pymorphy3,
  скрытые импорты lxml/openpyxl; один файл dist/DokoGen.exe
- build_exe.bat: установка PyInstaller + зависимостей + сборка
2026-08-03 20:35:17 +04:00
prog1764 5c75a72b51 fix: ttk.Checkbutton не принимает опцию font (TclError unknown option) 2026-08-03 20:27:59 +04:00
prog1764 7828684b7d fix: жёлтая подсветка пустых значений в циклах + выборочный Применить
- Циклы (item.*, user_*, алиасы): пустые значения '—'/'' теперь
  подсвечиваются жёлтым маркером (раньше подстановка шла на уровне
  XML простым replace — подсветка терялась)
- Вложенные циклы (users_loop): та же подсветка
- Панель «Проверка данных»: чекбоксы «Подставлять: склонения /
  кр. склон. / адрес / ИНН-КПП-ОГРН / руковод.» — выборочный Применить
- get_short_fio/get_initials: не теряют отчество в сокращённом ФИО
2026-08-03 19:53:08 +04:00
prog1764 1498e56579 fix: инициалы ФИО не теряли отчество
- get_short_fio/get_initials: 'Черник В.Н.' превращалось в 'Черник В.'
  (терялся инициал отчества) — добавлена функция _initial, которая
  сохраняет уже сокращённые инициалы ('В.Н.') как есть
2026-08-03 17:40:04 +04:00
prog1764 a16f5740cb fix: генератор берёт склонения из модели (интерфейса), а не пересчитывает
- {{company_full_name_genitive}} и др. теперь сначала берут готовое
  склонение из company_name_N / short_name_N (то, что пользователь
  подставил через Морфер/ИИ или ввёл вручную)
- пересчёт через pymorphy — только если поле пустое
- раньше документ всегда пересчитывал заново → расхождение с
  интерфейсом
2026-08-03 17:34:04 +04:00
prog1764 eb8801d78e fix: DaData — индекс подставляется в адрес (postal_code)
- DaData отдаёт индекс отдельным полем postal_code, а в адресе его
  не было — теперь добавляем индекс в начало адреса, если его там нет
- если индекс уже есть — не дублируем
2026-08-03 17:20:47 +04:00
prog1764 fd6fd60507 fix: именительный падеж при веб-склонении (Морфер/ИИ)
- Морфер и ИИ не всегда возвращают именительный падеж (он равен
  исходному слову) — теперь подставляем его сами
- табло результатов склонения показывает ВСЕ 6 падежей, включая
  именительный (раньше показывал только Р,Д,В,Т,П)
2026-08-03 16:59:28 +04:00
prog1764 17a99627bc fix: табы больше не съедаются при обработке циклов
- _normalize_loop_markers при склейке run'ов выбрасывал <w:tab/>
- теперь табы превращаются в символ \t при сборе и восстанавливаются
  как <w:tab/> при пересборке параграфа
2026-08-03 16:16:22 +04:00
prog1764 d02e2ac9a0 fix: дубль роли в подписи комиссии
- {{item.signature}} больше НЕ содержит роль (роль выводится
  отдельной колонкой {{item.role}}) — иначе «Председатель комиссии |
  Председатель комиссии: ___»
- signature = «___________ / » (только подчёркивание и слэш)
- signature_full по-прежнему полная: «Роль: ___________ / И.О. Фамилия»
2026-08-03 16:12:48 +04:00
prog1764 26b51b53ce fix: незаменённые переменные снова подсвечиваются красным
- при пересборке параграфа незаменённая переменная оставалась
  в тексте (раньше выбрасывалась) → красный маркер снова работает
2026-08-03 16:08:59 +04:00
prog1764 0929f2c551 fix: добавлен import sys в ui.py (NameError при запуске) 2026-08-03 15:58:35 +04:00
prog1764 7c88351252 feat: вложенный цикл users_loop — все пользователи ИС включая администратора
- <!-- loop:users_loop --> внутри цикла ИС: {{user_fio}}, {{user_position}}
- администратор НЕ исключается (как просил Костя), убираются только
  дубли по ФИО (нормализованное сравнение)
2026-08-03 15:20:11 +04:00
prog1764 208e449953 feat: сравнение полученных значений с введёнными
- после проверки DaData/ИИ программа сравнивает результат с тем,
  что заполнено в программе
- серьёзные расхождения выводятся КРАСНЫМИ БОЛЬШИМИ буквами:
  «ВНИМАНИЕ! НАЙДЕНЫ РАСХОЖДЕНИЯ: Руководитель (ФИО): было
  «Иванов И.И.», стало «Петров П.П.»»
- регистр/пунктуация (ИВАНОВ.И.И. vs Иванов И.И.) НЕ считаются
  расхождением; ИНН/КПП/ОГРН — любое отличие цифр = ошибка
- расхождения также пишутся в лог
2026-08-03 14:35:28 +04:00
prog1764 50d3afdbf2 feat: логи, фикс табов, справка с инструкциями
1) Логи: все действия пишутся в dokogen.log (импорт, генерация,
   обращения к Морфер/DaData/ИИ с ответами), кнопка «Экспорт логов»
   на вкладке «Лог»
2) Табы: при пересборке параграфа табуляция сохраняется как <w:tab/>
   (раньше Word «съедал» табы между «_____» и датой)
3) Справка: инструкция пользователя (циклы, программа), инструкция
   администратора (словари, API-ключи, лимиты), справочник переменных,
   пустой опросник Excel — всё скачивается в Word/Excel
2026-08-03 14:32:59 +04:00
prog1764 01d317eab1 feat: импорт «Описание ИС» из опросника
- новая строка 8 «Описание ИС» на листах ИС → {{item.description}}
- значение кладётся напрямую в description (без префикса «Описание ИС:»)
2026-08-03 14:07:01 +04:00
prog1764 e7b1af3f05 fix: {{item.signature}} — рамка без ФИО (дубль с {{item.fio_short}})
- раньше signature содержала ФИО внутри: при шаблоне
  {{item.signature}}{{item.fio_short}} получалось «Черник В.Н.Черник В.Н.»
- теперь: signature = «Роль: ___________ / » (только рамка),
  signature_full = полная подпись «Роль: ___________ / И.О. Фамилия»
  для тех, кто использует одну переменную
2026-08-03 14:03:39 +04:00
prog1764 fc374a4974 fix: категории ПДн — {{category}} берётся из галочек
- раньше переменная читала отдельное поле category (пустое при
  работе с галочками) → в документ вставлялось «—»
- теперь: ', '.join(personal_data_category) — галочки «иные»,
  «специальные» и т.д. попадают в документ
2026-08-03 13:59:02 +04:00
prog1764 0b540f093b fix: проверка информации — 4 замечания
1) ИИ универсален: вместо DeepSeek — «ИИ» (OpenAI-совместимый:
   DeepSeek, ChatGPT и др.). В настройках: API-ключ, модель, базовый URL
2) склонение проверяет И полное, И краткое название (Морфер и ИИ)
3) ИИ-проверка реквизитов показывает снимок полей (статус каждого),
   замечания и предложения — а не просто «ОК»
4) DaData: регистр нормализуется (КАПС → обычный), адрес (г., ул., д.),
   дата ОГРН из миллисекунд → 09.02.2005
- совместимость со старым api_settings.json (deepseek_* → ai_*)
2026-08-03 13:29:09 +04:00
prog1764 9d2690e3e0 fix: 6 замечаний по генератору
1) нормализация адреса: «Р-Н Крымский» → «р-н. Крымский»,
   «Г Крымск» → «г. Крымск», «УЛ» → «ул.», «Д.» → «д.»
2) убрана строчка «ПО» на вкладке ИС
3) СЗИ без категорий: «Kaspersky, КриптоПро» (через запятую)
4) кнопка «Выбрать из списка» в подвкладке «Пользователи ИС»
5) бумажные документы: «хранятся в сейфе» (авто-предлог+падеж)
6) незаполненные данные «—» подсвечиваются жёлтым (незаменённые
   переменные — красным, как было)
2026-08-03 13:23:52 +04:00
prog1764 2f4a08b2e4 feat: проверка данных через Морфер/DaData/DeepSeek (ИИ)
- правая панель на вкладке «Организация»: проверка склонений
  (Морфер 3.0 — бесплатно, без ключа; DeepSeek — ИИ) и реквизитов
  (DaData по ИНН; DeepSeek — ИИ-рецензия)
- мини-табло результата: источник, дисклеймер для ИИ («сгенерировано
  ИИ — перепроверьте»), кнопки «Применить»/«Очистить»
- меню «Файл → Настройки…»: вкладка API-ключей (DaData, DeepSeek,
  модель), сохраняются в api_settings.json рядом с программой
- веб-проверки показывают источник (morpher.ru / dadata.ru)
2026-08-03 12:59:51 +04:00
prog1764 3a4cd2fde4 fix: нормализация КАПСа по словам (город + должности)
- раньше: если в тексте есть аббревиатура (ООО, И.О.) или цифры
  (индекс в адресе) — весь текст оставался КАПСОМ
- теперь: каждое слово нормализуется отдельно, аббревиатуры
  (АРМ, СКУД, ООО, ИНН и т.п.) и инициалы сохраняются
- город: '350000, Г. КРАСНОДАР...' → 'Г. Краснодар' → город
  снова определяется при импорте
- должность: 'ГЛАВА' → 'Глава', ФИО: 'ИВАНОВ ИВАН ИВАНОВИЧ' → 'Иванов Иван Иванович'
2026-08-03 12:45:10 +04:00
prog1764 4fca29e7d6 fix: структура ИС — чтение и из колонки B, и из той же ячейки после ':'
- если значение записано в B7 — берём оттуда
- если в A7 «Структура ИС: АРМ 2 шт.» — извлекаем после двоеточия
2026-08-03 12:39:42 +04:00
prog1764 12817588ff fix: ЛВС не импортировалась в модель ИС (галочка терялась)
- is_local_network=is_data.get('is_has_lan') при создании ИС из импорта
- проверено: АРМ №1 → ЛВС=да, Интернет=да
2026-08-03 12:33:02 +04:00
prog1764 1faf6196af feat: вкладка «Бумажные документы» + импорт из опросника
- Новая вкладка: название документа + место хранения, добавить/удалить
- Импорт из опросника: «Названия документов» (строка 61) и «Место
  хранения» (строка 62) → цикл {{paper_documents}} ({{document}}/{{storage}})
- Сохранение/автосохранение/генерация собирают данные вкладки
- Загрузка файла проекта восстанавливает список документов
2026-08-03 12:27:32 +04:00
prog1764 353e7403d0 fix: импорт под новый формат опросника 5.25
- clean_value не портит аббревиатуры/номера (АРМ №1, СКУД)
- ПО: 'Названия программ...' → {{item.software}}
- 'локальную сеть' → is_has_lan (поле is_local_network)
- Цель обработки ПД — значение из объединённой ячейки (val_b)
- Роли комиссии ищутся и в колонке E, и в Примечании (D)
- Проверено на присланном опроснике: КПП, подразделение по
  безопасности, действия с ПДн, структура ИС — импортируются
2026-08-03 12:22:49 +04:00
prog1764 79952bf735 feat: настройки импорта вынесены в текстовый файл-словарь
- import_settings.json рядом с программой (создаётся автоматически):
  что импортировать (var), откуда (cell: 'Общие сведения'!B2 или
  keywords: регэксп поиска по колонке A)
- importer.py читает словарь: сначала конкретная ячейка, потом ключевые слова
- листы общих сведений/сотрудников/ИС тоже настраиваются (ключевые слова)
- UI: меню «Генерация → Файл настроек импорта…» — выбор пути к словарю
- при сборке .exe файл остаётся редактируемым без пересборки
2026-08-03 12:09:13 +04:00
prog1764 9998410dd6 feat: импорт новых переменных из опросника 152-ФЗ
- {{security_department}} — наименование структурного подразделения
  по безопасности (из поля 'структурное подразделение')
- {{item.pd_actions}} — действия с ПДн в цикле ИС
- {{item.structure}} — структура ИС импортируется из листов ИС
- КПП уже импортировался ({{company_kpp}})
- UI: применение подразделения, структуры и действий при импорте
2026-08-03 12:00:57 +04:00
prog1764 ee76fabdf6 feat: поддержка синтаксиса {{item_поле}} (без точки) в циклах
Работают оба варианта: {{item.fio_initials}} и {{item_fio_initials}},
{{item.fio_short}} и {{item_fio_short}}.
Проверено: И.О. Фамилия -> В.Н. Черник, Фамилия И.О. -> Черник В.Н.
2026-08-03 11:20:20 +04:00
prog1764 c5f03164c8 feat: недостающие переменные из инструкции 152-ФЗ
- {{item.fio_initials}} (И.О. Фамилия) и {{item.fio_short}} (Фамилия И.О.)
  для комиссии
- {{item.software}} (ПО) для ИС + поле «ПО» в интерфейсе
- модель: поле software у InformationSystem
2026-08-03 11:17:20 +04:00
prog1764 4b4fcbc59d fix: убраны пустые строки между итерациями цикла + сохранены разрывы страниц
Word оставляет пустые параграфы и обрывки вокруг маркеров <!-- loop:... -->.
При размножении цикла они копировались между строками (комиссия слипалась
с пустыми строками). Теперь:
- template разделяется на prefix/core/suffix, пустые параграфы в core чистятся
- остатки маркеров удаляются после обработки (не трогая таблицы и page breaks)
- разрыв страницы из параграфа loop_end выносится между итерациями

Проверено: комиссия без пустых строк, акт 6 с 2 ИС — 2 разрыва страниц, XML валиден.
2026-08-03 11:14:10 +04:00
prog1764 24956cd27c feat: переменная подписи {{item.signature}} в цикле комиссии
Председатель комиссии: ___________ / А.А. Емельянов
Члены комиссии: _________________ / К.Е. Кузина
_________________ / Т.Б. Ахаева
2026-08-03 10:58:15 +04:00
prog1764 47630dbbfb feat: переменная «Структура ИС» (structure) в цикле information_systems
- models.py: поле structure у InformationSystem
- variables.py: {{item.structure}} / {{structure}} в цикле,
  {{is_structure_N}} в индексированных
- ui.py: поле «Структура ИС» на вкладке ИС
2026-08-03 10:56:35 +04:00
prog1764 577bed22d6 feat: клавиши (Ctrl/Alt/Del) в исключения + подсветка маркером только переменной
- IGNORED_OLD_VARS: <Ctrl>, <Alt>, <Del> и др. клавиши больше не
  считаются незаменёнными переменными (7.6 Инструкция Пользователя)
- Подсветка: вместо красного цвета текста — красный маркер
  (w:highlight) на самой переменной, а не на всём абзаце
- OLD_VAR_MAP: ShortCompanyName1-6 (склонения краткого названия),
  IspdnName → {{is_name_1}}
2026-08-03 10:53:59 +04:00
prog1764 f5e9d3523d feat: группировка комиссии — председатель отдельно, члены без повтора роли
- Председатель/Секретарь/Заместитель — своей ролью
- Первый обычный член получает «Члены комиссии», остальные — пустая роль
- Пустая строка в цикле больше не превращается в «—»
Проверено: 1 председатель + 4 члена в шаблоне «6. Акт...»
2026-08-03 10:34:05 +04:00
prog1764 65480ea5ed fix: сохранять разрыв страницы (w:br type=page) при развороте циклов
Word хранит перенос страницы отдельным run в параграфе с <!-- loop_end -->.
Нормализация раньше удаляла его при склейке текста — акты слипались.
Теперь page break сохраняется и копируется в каждую итерацию цикла.
Проверено: 2 ИС -> 2 разрыва страниц, XML валиден.
2026-08-03 10:29:10 +04:00
prog1764 f4306f130e fix: заменять переменные без префикса item. внутри циклов
Word разбивает на run'ы не только маркеры циклов, но и переменные
({{name}}, {{number}}, {{pd_list}} и т.д.). Нормализация теперь
склеивает все параграфы с {{...}}, а размножение цикла подставляет
и {{item.field}}, и {{field}} (шаблон '0. Акт обследования.docx')
2026-08-03 10:12:09 +04:00
prog1764 ab96991a72 fix: Word разбивает маркеры циклов/переменные на run'ы + адрес ИС
- _normalize_loop_markers: склейка текста параграфа в один run перед
  поиском <!-- loop:... --> и {{item.*}}, иначе циклы не разворачивались
  (шаблон '6. Акт определения уровня защищенности ПДн.docx')
- variables.py: поле address в цикле information_systems
2026-08-03 10:08:45 +04:00
prog1764 28ac7f69ab fix: пустой временный файл при отсутствии циклов в шаблоне (Package not found)
expand_loops_in_zip возвращал путь к пустому tmp-файлу, если в шаблоне
не было маркеров <!-- loop:... -->. python-docx падал с
'Package not found'. Теперь при отсутствии циклов возвращается
исходный шаблон, tmp удаляется. Тесты: без циклов, с циклом,
вложенные циклы — всё ок.
2026-08-03 09:28:45 +04:00
prog1764 12df5f106c Revert "feat: import_mapper + кнопка в UI"
This reverts commit dd909792d4.
2026-08-03 09:15:28 +04:00
prog1764 dd909792d4 feat: import_mapper + кнопка в UI 2026-07-31 00:39:07 +04:00
prog1764 44b4060021 fix: unpack 4→3 в _employee_entries (ui.py) 2026-07-31 00:36:57 +04:00
prog1764 66753f6607 merge: рабочий генератор из rewrite + тест пройден 2026-07-31 00:35:52 +04:00