Приём документов → реестр + журнал

Внесение данных из файлов приёма в реестр невостребованных документов
и заполнение журнала. Дата внесения — текущая; журнал заполняется чисто
(без строк-примеров шаблона).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
jze9
2026-06-26 03:11:18 +05:00
commit b5f7060a1f
20 changed files with 1571 additions and 0 deletions

80
README.md Normal file
View File

@@ -0,0 +1,80 @@
# Приём документов → реестр + журнал
Программа вносит данные о принятых документах из файлов в папке `прием`
в файл **2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ** на соответствующие
листы (последующими записями) и заполняет **Журнал внесения**.
Работает на чистых Python-библиотеках (`odfpy`, `openpyxl`, `xlrd`),
**LibreOffice не требуется**. Оформление реестра (стили ячеек, формат дат,
прочие листы) сохраняется: новые строки копируют стиль последней строки листа.
## Запуск
Графический интерфейс (выбор файлов мышью, кнопка «Внести данные»):
```bash
pip install -r requirements.txt
python3 gui.py
```
Или из командной строки (по умолчанию берёт файлы из текущей папки):
```bash
python3 run.py
```
Оригиналы не изменяются — результат пишется рядом:
* `2026_ЕДИНЫЙ РЕЕСТР НЕВОСТРЕБОВАННЫХ ДОКУМЕНТОВ._ЗАПОЛНЕНО.ods`
* `Журнал внесения_ЗАПОЛНЕНО.xlsx`
Скрипт идемпотентен: всегда читает оригиналы, повторный запуск не задваивает данные.
## Правило сопоставления
Файл `DD.MM.YYYY_74_NN.<ext>` из папки `ТОk` → лист `ТОk_NN` реестра.
По заданию: **«внести все строки, начиная со второй»**. Поэтому пропускается
только шапка (строка 1), а каждая последующая **непустая** строка вносится как
отдельная запись — без фильтрации по № п/п. № п/п в реестре проставляется
заново (сквозной, продолжает нумерацию листа), исходный № отбрасывается.
Колонки источника B…M переносятся **позиционно** в одноимённые колонки листа.
Значения ячеек очищаются от внешних пробелов (единообразно для всех форматов).
## Данные правее колонки M
В реестре 13 колонок (A…M). Если в источнике есть данные в 14-й колонке
(напр. «закладная погашена» в `16.04.2026_74_33`), отдельной колонки для них
нет — они добавляются в «Примечание» той же строки. Все такие случаи
перечисляются в `Pipeline().run().notes` (информационно).
## Известное ограничение
Сопоставление колонок — **позиционное** (колонка N источника → колонка N листа).
Это верно для текущего шаблона приёма. Если появится файл с другим порядком
или набором колонок (сдвиг влево), значения попадут не в свои поля, и это
**не** будет обнаружено автоматически — сдвиг вправо/лишние колонки ловятся
предупреждением, сдвиг влево — нет. При смене шаблона нужна проверка по
заголовкам.
## Структура
```
gui.py десктоп-интерфейс (tkinter)
run.py точка входа из командной строки
priem_register/
config.py пути, константы, раскладка колонок A..M
models.py Record, SourceFile, JournalEntry
mapping.py поиск файлов приёма и привязка к листам
readers/ чтение источников по форматам
base.py SourceReader: пропуск шапки, все непустые строки, нарезка колонок
xls_reader.py .xls (xlrd; даты-сериалы Excel)
xlsx_reader.py .xlsx (openpyxl)
ods_reader.py .ods (odfpy; разворот повторов)
factory.py выбор читателя по расширению
writers/
register_writer.py дозапись строк в .ods с копированием стилей
journal_writer.py заполнение журнала .xlsx
pipeline.py оркестратор
```