Releases: Mist3s/duct-tape
Release list
v1.5.0
Новая утилита «Смертность стационара», наименования КСГ в отчёте экономики, имя
программы «Синяя изолента» с обновлением одним кликом и приведение всего кода к
PEP 8 / PEP 257 / PEP 20. Вывод существующих отчётов не изменился: .txt/.csv/.html
статистики.
Добавлено
- Утилита «Смертность стационара» (вкладка +
omsreg deaths/omsreg-deaths):
читает выгрузку «Отчёт по умершим» — на самом деле HTML-таблицу экспорта мед-системы,
разбирается напрямую, LibreOffice не нужен — и строит матрицу «месяц × группа причин
смерти», как ручной отчётСМЕРТНОСТЬ … СТАЦИОНАР: столбец «Всего», строка «Итого»,
приписка «(в т.ч. ИБС N, фибрилляция N)» у групп с подгруппами. Рядом с источником
сохраняются.xlsx(как образец — ширины колонок, жирная шапка, рамки),.html,
.txtи журнал.log. - Справочник причин смерти
_shared/mkb_death_groups.csv:
правила «код_от;код_до;группа;подгруппа» читаются сверху вниз, берётся первое
подходящее (инсульты I60–I69 отнесены к неврологии, а не к кровообращению). Диапазон
сопоставляется по букве и целой части кода: I20–I25 покрывает I20.0…I25.9. Свой CSV —
ключ--groupsили поле «Справочник групп», без пересборки.exe. Коды вне правил
идут в столбец «Прочие» и перечисляются в отчёте. core/xlsx.py— мини-генератор.xlsx(одна книга, один лист) на стандартной
библиотеке: ширины колонок, жирная шапка с переносом, рамки, числа записываются
числами. Сторонних зависимостей по-прежнему нет там, где CSV бессилен.- Группы КСГ в отчёте экономики подписаны официальным наименованием и профилем
медпомощи из встроенного_shared/ksg_catalog.py
(692 группы,ds…+st…) — вместо вычисляемой колонки «глава МКБ»; диагнозы из
файла остались как примеры. В.txtдлинные наименования обрезаются по ширине
колонки, в.html— многоточием, полный текст во всплывающей подсказке.
Справочник генерируетсяtools/build_ksg_catalog.pyиз официальных «Расшифровка
групп КСГ … .xlsx» и вручную не правится; веса и коэффициенты в него намеренно не
включены — они берутся из самого реестра. - Страница «О программе» (последний пункт бокового списка, отделён чертой):
версия, автор, лицензия, ссылка на GitHub, кнопки «Проверить обновление», «Обновить»
и «Страница релиза», строка статуса и галочка автопроверки. - Проверка обновлений через релизы GitHub (
core/updater.py, стандартная
библиотека): сравнение версий с учётом предвыпусков (1.5.0новее1.5.0-rc1).
Автопроверка при запуске идёт в фоновом потоке с коротким таймаутом и никогда не
показывает всплывающих ошибок — если сети нет или GitHub закрыт, статус просто
виден на странице. При ручной проверке текст ошибки отображается там же, а не
модальным окном. Когда обновление найдено, пункт списка помечается номером версии. - Обновление одним кликом: программа скачивает новый
.exe, сверяет его sha256
с суммой, опубликованной в API релиза, подменяет себя (через переименование,
которое Windows разрешает для запущенного файла) и перезапускается. При сбое подмены
прежняя версия возвращается на место, при несовпадении контрольной суммы файл
удаляется и установка отменяется. Остаток*.old.exeудаляется при следующем запуске. - Настройка
app.check_updatesвнастройки.txt(галочка на странице «О программе»).
Изменено
- Название программы: «Синяя изолента» вместо «Обработка реестров ОМС» — область
работы давно шире реестров ОМС (Excel, HTML, смертность). Подзаголовок в шапке
перечисляет фактические возможности; прежний текст про «удаление ошибочных талонов и
статистику стационара по DBF» устарел. Обновлены описание пакета и заголовок README. - PEP 8 / PEP 257 / PEP 20 по всему проекту (аудит и правка всех находок):
- докстринги приведены к PEP 257 и к фактическому поведению — убраны обещания
.csv
там, где создаётся.xlsx, мёртвая ссылка на несуществующий пакет и описание
несуществующих подпакетовremoval/stat; - приватные имена не пересекают границы модулей: слой GUI больше не импортирует
utils._shared, нужные имена реэкспортируются изomsreg.utils;_type_order
стал публичнымtype_order; DAY_KOTD_DEFAULT(«10,15,12») — единый источник истины в_shared/stat_common
(литерал был продублирован в четырёх местах, включая интерфейс);- общие поля вкладок вынесены в
gui/plugin_fields.py: вgui/plugins/остались
только модули-плагины, один файл = одна вкладка; - построители отчётов разрезаны на функции-разделы (цикломатическая сложность с
41/34/28/23/21 до ≤10), агрегаты считаются в одном слое подготовки, поэтому.txt
и.htmlне могут разойтись в цифрах; ruffужесточён:preview = true(без него правилаE301–E306недоступны) и
наборыN, D, ARG, SIM, RET, C4, PERF, PLC0415, RUF100, PTH, C90, PLR0912/0915/0913;
вignoreосознанно оставленыE501иD401(ложные срабатывания «imperative
mood» на русских докстрингах), временныеper-file-ignoresпомечены как техдолг.
- докстринги приведены к PEP 257 и к фактическому поведению — убраны обещания
- Раскраска строк журнала берётся из уровня записи, а не из подстроки «ошибк»: штатные
сообщения вроде «Найдено ошибочных талонов: N» больше не красные, у предупреждений
свой цвет. - Подпись флажка теперь на самом
Checkbuttonи тянется на всю строку — длинная
подпись в первой колонке расширяла её и перекашивала все поля вкладки.
Исправлено
- Опечатка в справочнике причин смерти больше не искажает отчёт молча: строка вида
I2O;I25(латинская «O» вместо нуля) раньше превращалась в диапазон I02–I25 и
относила, например, митральный порок к ИБС. Теперь код разбирается целиком, битое
правило отклоняется, а причина попадает в журнал — как и коды вне справочника. - Утилиты удаления больше не подделывают статистику при сбое: вместо «было 0,
удалено 0, стало 0» для файла, который мог измениться частично, в сводке печатается
«неизвестно», а первопричина уходит в.logс трассировкой (log.exception). - Сбойный плагин больше не обрывает загрузку остальных вкладок и не исчезает без следа
(предупреждение с трассировкой в журнал). - Журнал программы больше не глушит сообщения: вместо
except Exception: pass—
штатныйHandler.handleError. Внутренние ошибки задачи пишут трассировку в.log. - Настройки сообщают о непонятых строках и нечисловых значениях вместо молчаливой
подстановки значения по умолчанию (для длины кода от этого зависит, какие записи
попадут под удаление). core/dbf.py: импорт преобразователей поднят из тел трёх методов в шапку модуля —
он выполнялся на каждую прочитанную запись DBF.
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.4.0...v1.5.0
v1.4.0
Рефакторинг слоёв core / utils без изменения поведения: вывод отчётов .txt/.csv/.html
идентичен побайтово, все тесты и ruff зелёные. Публичные команды и точки входа не менялись.
Изменено
- Устранено дублирование между утилитами; общий код вынесен в переиспользуемые модули:
core/report_html.py— единая тема HTML (BASE_CSS) и каркас страницы (page,tile)
для отчётов статистики и экономики;core/format.py(money/csv_num/pct) иcore/cli.py(run_or_exit);resolve_dbf_pathперенесён вomsreg.coreкак доменно-нейтральный резолвер DBF-пути;utils/_shared/— вспомогательные модули (не вкладки): общий словарь стационара
(stat_common), помощники утилит удаления (removal_common) и построители отчётов
(stat_stacionar_report,stat_economics_report).
stat_economicsбольше не зависит отstat_stacionar(была связь util→util): общий
словарь домена берётся из нейтрального_shared/stat_common.- Рендеринг отчётов отделён от утилит-вкладок:
stat_stacionar.py644→134 строки,
stat_economics.py894→378 (тяжёлый HTML/текст — в_shared/*_report).
Исправлено
- Единые коды возврата CLI: некорректный ввод →
2, выполнено с ошибками по части
файлов →1, успех →0. Раньше утилиты удаления и статистики возвращали разные коды,
а статистика могла дважды печатать текст ошибки (в лог и в stderr). - Синхронизированы докстринг и
--helpстатистики: коды дневного стационара по умолчанию
—10,15,12(справка показывала устаревшее10,15).
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.3.1...v1.4.0
v1.3.1
Добавлено
- Отчёт «Экономика стационара»: блок «Как формируется оплата случая» — формула
с базовой ставкой и коэффициентами (значения из файла); в таблице КСГ — столбцы
«вес КСГ», «попр. коэф.» и «тариф полного случая». - «Как исход влияет на оплату» — разбивка по типам стационара и отделениям.
Изменено
KOEF_UPпереименован в «поправочный коэффициент» (прежнее «уровень отделения» неверно:
по данным он меняется по случаю). Базовая ставка подписывается кодом КСГ (st…/ds…).- Из таблицы КСГ убраны столбцы «ср. случай» и «макс. ₽/койко-день».
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.3.0...v1.3.1
v1.3.0
Добавлено
- Новая утилита «Экономика стационара» (вкладка + команда
omsreg econ) — управленческий
отчёт «как отработали и где просели», всё считается динамически из файла и раздельно
по дневному и круглосуточному стационару:- доходность койки (₽ на койко-день) и рейтинг «какая койка платит лучше»;
- разбивка каждого отделения по коэффициенту оплаты KOEF_PR (полные / переводы / короткие),
с числом переводов; значения KOEF_PR и их смысл выводятся из данных; - раздел «Как исход влияет на оплату»: сколько случаев, полных и сниженных, и сколько
недополучено по каждому исходу (перевод, смерть и т. д.); - порог полной оплаты по дням и по КСГ (со скольких дней наступает KOEF_PR=1), в т. ч.
столбец «минимальный день полной оплаты» по каждой КСГ (прочерк, если полных случаев нет); - расшифровка КСГ примерами диагнозов из файла + глава МКБ;
- упущенная выручка и выводы. Отчёт .txt и .html.
- Модель оплаты (
STOIM = БС × KOEF_Z × KOEF_UP × KOEF_PR) вынесена в отдельные функции;
базовая ставка восстанавливается из данных.
- Обновлены скриншоты в README (4 раздела, включая «Экономику стационара»).
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.2.0...v1.3.0
v1.2.0
Добавлено
- Статистика стационара: новый раздел «Исходы по стационарам и отделениям» —
исходы по каждому типу стационара (дневной/круглосуточный) и внутри — по каждому
отделению (KOTD). Есть и в текстовом, и в HTML-отчёте. - Названия отделений (KOTD) показываются в разделах «По отделениям» и «Исходы по
отделениям» и настраиваются: поле «Названия отделений» в интерфейсе, аргумент
--kotd-namesв CLI, параметрkotd_namesуrun_stat. Значения по умолчанию для
файла 0091_016 определены по преобладающим классам МКБ: 23 — Пульмонологическое,
27 — Терапевтическое, 61 — Неврологическое. - Удаление по списку кодов: коды можно вставить и отредактировать прямо в программе
(многострочное поле), а не только выбрать файлом; при заполненном поле оно имеет
приоритет над файлом. В платформу добавлен тип поля «многострочный текст» (TEXTAREA).
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.1.3...v1.2.0
v1.1.3
Изменено
- Собираемый EXE и артефакт релиза переименованы в
duct-tape.exe— в тон
репозиторию и иконке. Внутренний пакет и CLI-команды остаютсяomsreg.
Скачайте duct-tape.exe ниже — Python не нужен.
Full Changelog: v1.1.2...v1.1.3