Skip to content

Releases: Mist3s/duct-tape

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 10:33

Новая утилита «Смертность стационара», наименования КСГ в отчёте экономики, имя
программы «Синяя изолента» с обновлением одним кликом и приведение всего кода к
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 (без него правила E301E306 недоступны) и
      наборы N, D, ARG, SIM, RET, C4, PERF, PLC0415, RUF100, PTH, C90, PLR0912/0915/0913;
      в ignore осознанно оставлены E501 и D401 (ложные срабатывания «imperative
      mood» на русских докстрингах), временные per-file-ignores помечены как техдолг.
  • Раскраска строк журнала берётся из уровня записи, а не из подстроки «ошибк»: штатные
    сообщения вроде «Найдено ошибочных талонов: 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

Choose a tag to compare

@github-actions github-actions released this 24 Jul 20:25

Рефакторинг слоёв 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.py 644→134 строки,
    stat_economics.py 894→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

Choose a tag to compare

@github-actions github-actions released this 19 Jul 16:55

Добавлено

  • Отчёт «Экономика стационара»: блок «Как формируется оплата случая» — формула
    с базовой ставкой и коэффициентами (значения из файла); в таблице КСГ — столбцы
    «вес КСГ», «попр. коэф.» и «тариф полного случая».
  • «Как исход влияет на оплату» — разбивка по типам стационара и отделениям.

Изменено

  • KOEF_UP переименован в «поправочный коэффициент» (прежнее «уровень отделения» неверно:
    по данным он меняется по случаю). Базовая ставка подписывается кодом КСГ (st…/ds…).
  • Из таблицы КСГ убраны столбцы «ср. случай» и «макс. ₽/койко-день».

Скачайте duct-tape.exe ниже — Python не нужен.

Full Changelog: v1.3.0...v1.3.1

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 12:16

Добавлено

  • Новая утилита «Экономика стационара» (вкладка + команда 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

Choose a tag to compare

@github-actions github-actions released this 18 Jul 16:31

Добавлено

  • Статистика стационара: новый раздел «Исходы по стационарам и отделениям»
    исходы по каждому типу стационара (дневной/круглосуточный) и внутри — по каждому
    отделению (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

Choose a tag to compare

@github-actions github-actions released this 18 Jul 15:43

Изменено

  • Собираемый EXE и артефакт релиза переименованы в duct-tape.exe — в тон
    репозиторию и иконке. Внутренний пакет и CLI-команды остаются omsreg.

Скачайте duct-tape.exe ниже — Python не нужен.

Full Changelog: v1.1.2...v1.1.3

v1.1.2

Choose a tag to compare

@github-actions github-actions released this 18 Jul 11:29
omsreg 1.1.2