Skip to content

v1.5.0

Latest

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