*

Шаблоны печати

Содержание



===== Общие принципы =====

'''Шаблон''' - это текст, состоящий из двух "компонент" - обычного html-я, и специальных вставок в {}. Кодировка текста может быть utf-8 или cp1251; если во вставках нужны строки, то независимо от кодировки нужно использовать префикс unicode - типа u'привет'. Вставки "равнодушны" к синтаксису окружающего html. В процессе обработки шаблона html превращается в операторы печати, вставки - в соотв. фрагменты программы на python. В случае успеха компиляции полученная программа выполняется - а результат выводится в окно просмотра.

Вставки имеют следующий синтаксис:

*'{'<ключевое слово>':'<выражение>'}'
*'{'<выражение>[':'[формат]]'}'

<ключевое слово> ::= 'if' | 'elif' | 'else' | 'for' | 'end' | ' ' ;

Поскольку в python используются отступы, а в шаблоне печати отступы не так удобны как в программе, мы добавили ключевое слово end, ключевые слова if, elif и else, for увеличивает отступ, а end уменьшает. Пустое ключевое слово { : setPageSize('A4') } приводит к генерации соотв. выражения как оператора. Вторая форма (без ключевого слова) приводит к генерации оператора печати значения выражения. Образцы применения будут дальше по тексту. <выражение> - выражение на python, его необходимость и смысл определяется ключевым словом. <формат> := 'h'|'n'| ' '; - применяется для "пост-обработки" полученного в процессе вычисления выражения значения. Если двоеточие пропущено, то формат считается пустым. • 'h': считается, что выражение содержит фрагмент не требующий обработки • ' ': производится замена символов типа '<' на '<' • 'n': в дополнение к предыдущему добавляется замена \n на

так

----

{'[1]\n[2]\n[3]\n[<]\n['''bold''']':h}

----

{'[1]\n[2]\n[3]\n[<]\n['''bold''']'}

----

{'[1]\n[2]\n[3]\n[<]\n['''bold''']':n}

{{begDate} - значение параметра "Дата начала" (или "На дату" для вкладки Состоят), CDateInfo
{endDate} - значение параметра "Дата окончания", CDateInfo
{orgStructureId} - значение параметра "Подразделение врача", COrgStructureInfo
{specialityType} - значение параметра "Специальность", определение типа отбора, 0 - "Отбор по ИЛИ", 1 - "Отбор по И"
{for: spec in specialityId}{spec.code} {spec.name} {end:} - значение параметра "Специальность", CSpecialityInfo
{personId} - значение параметра "Врач", CPersonInfo
{MKBFilter} - значение параметра "Коды диагнозов по МКБ", определение типа фильтра, 0 - "Игнор.", 1 - "Интервал",
{MKBFrom} - значение параметра "Коды диагнозов по МКБ", определение первого значения диапазона, CMKBInfo
{MKBTo} - значение параметра "Коды диагнозов по МКБ", определение последнего значения диапазона, CMKBInfo}}

превратится в

________________________________________

• [1] [2] [3] [<] [bold]

________________________________________

• [1] [2] [3] [<] ['''bold''']

________________________________________

• [1]

• [2]

• [3]

• [<]

• [bold]

________________________________________

'''Параметры печати'''

• Формат бумаги А3/А4/А5/A6 {: setPageSize('A4')} или размеры в мм: A3 - 297x420, A4 - 210x297, A5 - 148x210, A6 - 105x148 {: setPageSize('210x297') }

• Ориентация Книжный-P/Альбомный-L {: setOrientation('L')}

• Поля:

1. все {:setMargins(5)}

2. правое {:setLeftMargin(150)}

3. верхнее {:setTopMargin(5)}

4. нижнее {:setBottomMargin(5)}

5. левое {:setRightMargin(5)}

• Наименование подписываемого файла:

{:documentName = (action.endDate.toString('dd.MM.yyyy') +u' '+ action.title)
setDocumentName(documentName)}

Подписанный и прикрепленный документ будет иметь имя вида - "01.01.2022 Осмотр врача.pdf".

________________________________________

'''Поиск по тексту шаблона'''

Реализована возможность поиска текста в выведенном шаблоне печати.
ПКМ - Найти (или Ctrl+F) - в верхней части окна шаблона появится окно для ввода запроса.
Переход между найденными результатами осуществляется с помощью кнопок "Следующее" и "Предыдущее".
Если больше совпадений нет - появится надпись "Поиск не дал результатов".

Данным нововведением особенно удобно пользоваться в шаблонах Логи ИЭМК, Логи УО и других подобных.



===== Оперативный ввод переменных (Диалоги) =====

dialogs (CDialogsInfo) - мастер диалогов. Содержит список диалогов, по которому можно перемещаться вперёд и назад и вводить простейшие данные. Каждый диалог имеет тип CSimplePrintDialog и содержит метод getVar(), позволяющий извлекать эти данные. Кнопка "OK" - переход к следующему диалогу. Кнопка "Отмена" - также переход к следующему диалогу, при этом считается, что в диалог введено значение по умолчанию default. Но, если при создании диалога значение default не указано, getVar() возвращает None.

Мастер диалогов содержит методы:

*dialXXX(title, ...) - создать, добавить в конец списка и запустить диалог ввода простейших данных.
*createDialXXX(title, ...) - создать и добавить в конец списка диалог ввода простейших данных.
*activate(dialog) - запустить диалог 

Методы, запускающие диалоги ввода простейших данных:

• dialInt(title, min, max, step=1, default=min) - диалог ввода целого числа с заголовком title. Число - от min до max, меняется с шагом step, начальное значение default

• dialFloat(self, title, min, max, step, decimals, default=min) - диалог ввода вещественного числа с заголовком title. Число - от min до max, меняется с шагом step, начальное значение default, отображается decimals знаков после запятой

• dialBool(self, title, name, default=False) - диалог ввода логического значения (CheckBox) с заголовком title. name - текст, который будет написан рядом с CheckBox. default - начальное состояние CheckBox (True - нажата, False - нет)

• dialDate(self, title, default=currentDate) - диалог ввода даты с заголовком title.

• dialTime(self, title, default='00:00') - диалог ввода времени с заголовком title.

• dialString(self, title, default="") - диалог ввода строки с заголовком title.

• dialList(self, title, lst=[], default=0) - диалог выбора строки из списка lst с заголовком title. default - начальный номер текущего элемента. Для диалога getVar() возвращает номер выбранной строки в списке, getListValue() - саму выбранную строку.

• dialMultiList(self, title, lst=[] [, select]) - диалог выбора нескольких строк из списка lst с заголовком title. Пераметр select задает выбор элементов списка: 0-не выбраны, 1-выбран первый элемент (по умолчанию), 2- выбраны все элементы. Для диалога getVar() возвращает массив номеров выбранных строк в списке, getListValues() - сами выбранные строки.

''Пример 1:''

{dialogs.dialString(u"Введите имя врача", "").getVar()} - отображает строку, введённую в диалоге

''Пример 2:''

{: dial1 = dialogs.dialString(u"Введите строку", "default string" ) }
{: str = dial1.getVar()}
{: dial2 = dialogs.dialList(u"Выберите элемент", ["first", "second", str], 1) }
{:dial2m = dialogs.dialMultiList(u"Выберите элементы", ["first", "second", str], 1) }
{: dial3 = dialogs.dialInt(u"Введите целое число", 66, 78, 3, 70) }
{: dial4 = dialogs.dialFloat(u"Введите вещественное число", -2, -1.5, 0.11, 2)}
{: dialb = dialogs.dialBool(u"Введите логическое значение", u"Я хочу продолжить", True)}
{: yes = dialb.getVar() }
{if: yes}
{: dial5 = dialogs.dialDate(u"Введите дату" ) }
{: dial6 = dialogs.dialTime(u"Введите время", '00:00' ) }
{: dat = dial5.getVar() }
{: tim = dial6.getVar() }
{end:}
{: str = dial1.getVar() }
{: value = dial2.getListValue()}
{: values = dial2m.getListValues()}
{: integ = dial3.getVar() }
{: flo = dial4.getVar() }

Выводится диалог ввода строки. Затем диалог выбора элемента из списка, в котором данная строка - третья по счёту. Затем диалог выбора нескольких элементов из такого же списка. При возвращении назад и вводе новой строки диалоги выбора из списка не изменятся - они уже созданы и запущены! Затем диалог ввода целого числа от 66 до 78 с начальным элементов 70 и шагом 3. Затем - диалог выбора вещественного числа от -2 до -1.5 с начальным элементом -2 и шагом 0.11. Затем диалог с CheckBox, рядом с которым написано "Я хочу продолжить". Если пользователь не снял CheckBox, отображается диалог ввода даты и времени. Между всеми этими диалогами можно двигаться вперёд-назад. Выбранные значения сохраняются, соответственно, в переменных str, value, values, integ, flo, yes, dat, tim.



===== Вывод диалогового окна подтверждения =====

В шаблоне печати есть возможность вывести диалоговое окно с подтверждением действия. В случае нажатия "Да" произойдет дальнейшее формирование шаблона печати. В случае нажатия "Нет" шаблон печати сформирован не будет.

Пример:
{if: currentPerson.post.identify('urn:oid:1.2.643.5.1.13.13.11.1002') not in ( '4', '5', '427', '428', '6', '7', '429', '430', '431', '432', '433', '434', '435', '436', '437', '438', '8')}
{:from PyQt4.QtGui import QMessageBox as mb }
{if: mb.critical(None, u'Проверка должности', u'ВНИМАНИЕ!\nДолжность текущего пользователя\nне соответствует требованиям ЕГИСЗ!\nВсе равно продолжить?',
mb.Yes|mb.No, mb.No) != mb.Yes }
{ exit(0) }
{end:}
{end:}



Определение числа дней в периоде дат

Для объекта типа CDateInfo (в том числе, currentDate), есть свойство date типа QDate. У QDate, в свою очередь, есть метод daysTo и workDaysTo.

''Примеры:''

{:from PyQt4.QtCore import QDate}
{:from library.PrintInfo import CDateInfo}
{:begDate = CDateInfo(QDate(2022, 1, 1))}
{:endDate = CDateInfo(QDate(2022, 2, 1))}
{begDate.daysTo(endDate)}
{begDate.workDaysTo(endDate)}

action.begDate.date.daysTo(action.endDate.date) - дней от начала действия до конца
event.execDate.date.daysTo(currentDate.date) - прошло со времени события



Определение разности в часах, минутах и секундах относительно двух переменных

''Пример 1:''

{:seconds = action.begDate.time.secsTo(action.endDate.time)}
{:minutes, seconds = divmod(seconds, 60)}
{:hours, minutes = divmod(minutes, 60)}

{hours}:{minutes}:{seconds}

''Пример 2:''

{:x = action.begDate.time}
{:y = action.endDate.time}

{(x.addSecs(x.secsTo(y) - (x.second() + x.minute()*60 + x.hour()*60*60))).toString('HH:mm:ss')}



Определение возраста на определенную дату

При необходимости определить возраст пациента на конкретную дату можно использовать функцию ageOnDate:

{client.ageOnDate(event.setDate)}

Если необходимо определить, например, не точный возраст, а возрастную категорию, то можно использовать следующий пример:

{:from library.Utils import calcAgeTuple}
{:isChildren = calcAgeTuple(client.birthDate.date, event.setDate.date)[-1] < 18} {int(isChildren)} В примере выше если на дату начала случая обслуживания пациенту меньше 18 лет, то isChildren будет равна 1, иначе 0. Пример определения возраста пациента в годах на конец года: {:QDate = type(event.client.birthDate.date)} {:endY = int(((event.client.ageOnDate(QDate(event.execDate.year, 12, 31))).split(' '))[0])}



Полезные функции Python

*Функция позволяет узнать, есть ли какой-либо атрибут у объекта:

hasattr(объект, 'имя_аттрибута')

''Пример использования:'' {if: hasattr(diagnosis, u'MKBEx')}

*dir(объект) - список всех полей(переменных) объекта

''Пример использования:'' {dir(arr[0])}

*Функция amountToWords преобразует число в сумму прописью

''Пример использования:'' {amountToWords(account.sum)}

*{:exit()} - функция прерывает выполнение шаблона печати (без показа диалогового окна).

''Пример использования:''
{:from PyQt4.QtGui import QMessageBox}
{:buttons = QMessageBox.Yes | QMessageBox.No}
{:reply = QMessageBox.question(None, '', u'Показать окно шаблона?', buttons)}
{if: reply == QMessageBox.Yes}
<h2>Текст шаблона</h2>
{else:}
{:exit()}
{end:}

*{break:}

Прерывает выполнение текущего цикла.

*{continue:}

В цикле переходит к следующей записи.

''Ключевые слова break и continue должны быть указаны внутри цикла.''

*Следующая конструкция позволяет вызывать в печать один шаблон из тела другого шаблона:

''Пример использования:''
{:from library.PrintTemplates import applyTemplate}
{:applyTemplate(None, 72, globals())}

В печать будет вызван шаблон с id=72 (rbPrintTemplate)

*Конструкция, которая выводит данные из свойства с переносами строк и пробелами:

''Пример использования:''

{action[...].value.replace('\n', '
').replace(' ', ' ') :h}



Другие полезные ключевые слова

В связке с атрибутом href элемента `a` HTML в шаблонах печати могут быть использованы следующие ключевые слова:

*karta_

Позволяет выполнить открытие регистрационной карты пациента, которому соответствует указанный идентификатор, пример:

`a href="karta_21"` Открыть карту пациента - `/a`

При нажатии на ссылку в шаблоне выполнится открытие регистрационной карты пациента с идентификатором 21, если пациента с таким идентификатором нет в БД, то ничего не произойдет.

*event_

Позволяет выполнить открытие случая обслуживания пациента, которому соответствует указанный идентификатор, пример:

`a href="event_198198"` Открыть случай обслуживания `/a`

При нажатии на ссылку в шаблоне выполнится открытие случая обслуживания пациента с идентификатором 198198, если случая обслуживания с таким идентификатором нет в БД, то ничего не произойдет.

Также результат выполнения шаблона печати с сгенерированными ссылками на регистрационную карту пациента и/или случай обслуживания может быть скопирован и вставлен "как есть" в новое сообщение информатора и в таком случае пользователю будет доступны аналогичные функции из окна сообщения информатора

*medKarta_

Позволяет выполнить переход в мед.карту пациента, которому соответствует указанный идентификатор, пример:

`a href="medKarta_21"` Открыть мед.карту пациента `/a`

При нажатии на ссылку в шаблоне выполнится поиск пациента и переход на вкладку "Мед.карта" в интерфейсе "Обслуживание пациентов", если пациента с таким идентификатором нет в БД, то ничего не произойдет.

*browser

Позволяет вызвать браузер и выполнить переход по указанной ссылке, пример:

`a href="browser://ya.ru"` Перейти по ссылке `/a`

*openTemplate_

Позволяет выполнить другой шаблон печати, которому соответствует указанный идентификатор, пример:

`a href='openTemplate_809'`Выполнить шаблон `/a`

Дополнительно из основного шаблона можно передавать один или несколько параметров в вызываемый шаблон.

Пример 1:

{if: not params}
{:params = {"number": 1}}
{end:}
`a href='openTemplate_809_{params}'` Выполнить шаблон `/a`

Пример 2:

{:example = [1,2]}
`table border=1 cellpadding = 3`
{for: el in example}
`tr`
`td`{el}`/td`
`td`док_1`/td`
`td`{:params = {"number": el}} `a href='openTemplate_809_{params}'` Выполнить шаблон `/a` `/td`
`/tr`
{end:}
`/table`

В данном примере сформируется две ссылки для вызова шаблона печати и для каждой из них будет передано свое значение в params - для первой 1, для второй 2.

*loadTemplate()

Позволяет загрузить шаблон печати и выполнить его код в рамках текущего шаблона печати.
В качестве аргумента необходимо указывать идентификатор вызываемого шаблона печати (rbPrintTemplate.id).

Ниже приведен пример, где в вызываемом шаблоне печати заложена проверка наличия СНИЛС у пациента, а в качестве результата выполнения основного шаблона печати ожидается либо вывод номера СНИЛС, либо выполнение шаблона печати будет прервано.

Основной шаблон печати:


{:a = loadTemplate(815)}

{if: a == u'' }
{exit(0)}
{end:}

{a}

Вызываемый шаблон печати:


{if: not client.SNILS}
{: from PyQt4.QtGui import QMessageBox as mb}
{mb.critical(None, u'Проверка заполнения данных', u'

ВНИМАНИЕ! Обнаружены ошибки:

' + u'
- не указан СНИЛС у пациента', mb.Ok, mb.Ok)}
{exit(0)}
{else:}
{client.SNILS}
{end:}

Поддержана передача переменных из основного шаблона печати в вызываемый.



Визуализация отметки об электронной подписи документа(ЭЦП)

Для визуализации отметки об электронной подписи в документе используется:

{userCertPlate():h}.

Рекомендуется использовать в связке с условием проверки соответствия СНИЛС исполнителя действия и текущего пользователя:

{if:userCertPlate() == u' '}
{action.person.post}:____________________/{action.person.shortName}
{elif: action.person.SNILS == currentPerson.SNILS}
{userCertPlate():h}
{else:}
{action.person.post}:____________________/{action.person.shortName}
{end:}

Такая конструкция позволяет решить ситуацию, когда у пользователя на рабочем месте настроен сертификат электронной подписи, но ему требуется распечатать осмотр другого пользователя.

Также существует возможность обратиться к СНИЛС непосредственно в сертификате электронной подписи:

{:from PyQt4 import QtGui}
{:from library.MSCAPI import MSCApi}
{:snils = QtGui.qApp.getUserCert(MSCApi(QtGui.qApp.getCsp())).snils()}

При необходимости изменить размер отметки об электронной подписи можно воспользоваться одним из следующих вариантов:

1) Изменить ширину и длину изображения электронной цифровой подписи:

{:s = userCertPlate()}{s[:5] + 'width="384" height="114" ' + s[5:] :h}.

2) Изменить семейство шрифта, его размер и масштаб изображения электронной цифровой подписи:

{userCertPlate(fontFamily='Times New Roman', fontSize=12, scale=1.0) :h}.



Проверка валидности СНИЛС

=== Проверка валидности СНИЛС ===

В шаблонах печати можно использовать соответствующие функции для проверки валидности указанного СНИЛС. Пример использования:

{:from library.Utils import checkSNILS, fixSNILS, formatSNILS}

{if: not checkSNILS(client.SNILS)}

СНИЛС указан с ошибкой

Правильный СНИЛС: {formatSNILS(fixSNILS(client.SNILS))}

{end:}

При этом вместо client.snils, например, можно указать непосредственно номер СНИЛС в кавычках - 'ХХХ-ХХХ-ХХХ ХХ'.



Встраивание штрих-кодов

В шаблонах печати можно использовать как одномерные - [[Code 39]] и [[Code 128]], так и двумерные штрих-коды - [[Data Matrix]], [[PDF417]] и [[QR-код]]. Одномерные у нас реализованы с привлечением подходящих шрифтов, двумерные создаются как растровые изображения.



Кодирование в base64

Cтроки имеют метод .encode(<кодировка>)

Обычные 8-битные строки можно кодировать с указанием 'base64' в качестве кодировки.

Пример:
>>> 'Hello world!'.encode('base64')
'SGVsbG8gd29ybGQh\n'

Для строк содержащих помимо латиницы еще и кириллицу в САМСОН обычно используются юникодные строки и для таких строк кодирование в base64 не определено. Поэтому сначала нужно перевести в подходящую случаю 8-битную кодировку, а потом уже - в base64.
>> u'Привет от Петрова и Бaширова!'.encode('utf-8').encode('base64')
'0J/RgNC40LLQtdGCINC+0YIg0J/QtdGC0YDQvtCy0LAg0Lgg0JFh0YjQuNGA0L7QstCwIQ==\n'

>>> u'Привет от Петрова и Бaширова!'.encode('utf-16').encode('base64')
'//4fBEAEOAQyBDUEQgQgAD4EQgQgAB8ENQRCBEAEPgQyBDAEIAA4BCAAEQRhAEgEOARABD4EMgQw\nBCEA\n'

>>> u'Привет от Петрова и Бaширова!'.encode('utf-16be').encode('base64')
'BB8EQAQ4BDIENQRCACAEPgRCACAEHwQ1BEIEQAQ+BDIEMAAgBDgAIAQRAGEESAQ4BEAEPgQyBDAA\nIQ==\n'

>>> u'Привет от Петрова и Бaширова!'.encode('utf-16le').encode('base64')
'HwRABDgEMgQ1BEIEIAA+BEIEIAAfBDUEQgRABD4EMgQwBCAAOAQgABEEYQBIBDgEQAQ+BDIEMAQh\nAA==\n'

>>> u'Привет от Петрова и Бaширова!'.encode('cp1251').encode('base64')
'z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE=\n'

>>> u'Привет от Петрова и Бaширова!'.encode('cp866').encode('base64')
'j+CooqXiIK7iII+l4uCuoqAgqCCBYeio4K6ioCE=\n'

>>> u'Привет от Петрова и Бaширова!'.encode('koi8-r').encode('base64')
'8NLJ18XUIM/UIPDF1NLP18EgySDiYdvJ0s/XwSE=\n'

>>> u'Привет от Петрова и Бaширова!'.encode('iso8859-5').encode('base64')
'v+DY0tXiIN7iIL/V4uDe0tAg2CCxYejY4N7S0CE=\n'

Обращаем внимание на переводы строк, encode('base64') по непонятной причине не только перекодирует, но ещё добавляет переводы строк - в примере с 'utf-16' их два, они обозначены как \n. Можно использовать замену переноса строк на пустые строки:
>>> u'Привет от Петрова и Баширова!'.encode('cp1251').encode('base64').replace('\n', '')

'z/Do4uXyIO7yIM/l8vDu4uAg6CDBYfjo8O7i4CE='



Подстановка данных в шаблон

Текущая дата: {currentDate}

Текущее время: {currentTime}

Текущий населенный пункт (Предпочтения): {defaultKLADR[:2]}

Текущая область (Предпочтения): {provinceKLADR[:2]}

Текущее подразделение: currentOrgStructure (COrgStructureInfo), имеет свойства:

• Сокращенное название:{name} (строка),

• {infisInternalCode} (строка),

• {infisDepTypeCode} (строка),

• Полное название:{fullName} (строка)

• Организация, к которой принадлежит подразделение:{organisation} (COrgInfo),

• Родительское подразделение:{parent} (COrgStructureInfo)

• Адрес:{address} (строка)

• Начальник подразделения: {chief} (типа CPersonInfo)

• Старшая мед.сестра подразделения: {headNurse} (типа CPersonInfo)

• Поле "Примечания": {note}

Текущий пользователь: currentPerson (CPersonInfo)



Пациент: client (CClientInfo)

• код: {client.id}

• код ЛПУ + код пациента: {'*'+currentOrganisation.miacCode+'.'+client.id+'*'}

• штрих код: *{client.id}*

• ФИО: {client.fullName} (строка)

• Фамилия И.О.: {client.shortName} (строка)

• Фамилия: {client.lastName} (строка)

• Имя:{client.firstName} (строка)

• Отчество: {client.patrName} (строка)

• Дата Рождения: {client.birthDate} (CDateInfo)

• Время Рождения: {client.birthTime}

• Дата смерти: {client.deathDate}

• Возраст: {client.age} (строка)

• Пол: {client.sex} ('М'/'Ж')

• СНИЛС: {client.SNILS} (строка)

• Документ: {client.document} (CClientDocumentInfo)

• Тип документа: {client.document.type}

• Серия документа: {client.document.serial}

• Номер документа: {client.document.number}

• Кем выдан: {client.document.origin}

• Код подразделения: {client.document.originCode}

• Дата выдачи документа: {client.document.date}

• Полис: {client.policy} (CClientPolicyInfo)

• Адрес регистрации: {client.regAddress} (CClientAddressInfo)

• Адрес проживания: {client.locAddress} (CClientAddressInfo)

• Занятость: {client.work} (CClientWorkInfo)

• Группа крови: {client.bloodType} (строка)

• Дата определения группы крови: {client.bloodDate}

• Примечания по группе крови: {client.bloodNotes}

• Аллергии: {client.allergies} (CClientAllergyInfoList)

• Лекарственные непереносимости: {client.intolerances} (CClientIntoleranceMedicamentInfoList)

• Факторы риска: {client.riskFactors}

• Телефоны: {client.phones} (строка) . Также в данном блоке содержится информация об эл.почте пациента

• Дата и время добавления в БД пациента(таблица Client): {client.createDatetime}

• Автор добавления в БД пациента(таблица Client):{client.createPerson}

• Дата и время изменения регистрационной карточки пациента:{client.modifyDatetime}

• Автор изменения регистрационной карточки пациента:{client.modifyPerson}

Пример печати телефона и эл.почты пациента:

{:contact1=[]}
{:contact2=[]}
{if: len(client.phones)}
{:phones = client.phones.split(', ')}
{for: phone in phones}
{:items = phone.replace(':',' ').split(' ')}
{if: items[1]==u'телефон' and items[3]!=''''}''
{:contact1.append(items[3])}
{end:}
{if: items[1]==u'почта' and items[3]!=''''}''
{:contact2.append(items[3])}
{end:}
{end:}
{end:}
Телефон: {if: contact1}{for: item in contact1}{item}, {end:}{else:}______________________{end:}

Электронная почта: {if: contact2}{for: item in contact2}{item} {end:}{else:}_________________________{end:}

• Телефоны(2): {client.contacts} (массив) . Выводится массив, у которого в каждом элементе по 3 параметра: тип контакта, контакт и примечание.

Пример:
{for: contact in client.contacts}
Тип контакта: {contact[0]}
Контакт: {contact[1]}
Примечание: {contact[2]}
{end:}

• Постоянное прикрепление: {client.permanentAttach} (CClientAttachInfo)

• Временное прикрепление: {client.temporaryAttach} (CClientAttachInfo)

Для новорождённых и маленьких пациентов

*Рост при рождении {client.birthWeight}
*Вес при рождении {client.birthHeight}



Вкладка картотека (контекст token)

Доступна печать информации из фильтров.

*Прикрепление «по заявлению» {isStatement}

clientsList - Отфильтрованный список пациентов

Пример вывода списка из «Картотеки»:

{for: c in clientsList}
{c}
{end:}

selectedClientsList - Печать произвольно выделенных пациентов в списке.

Пример вывода списка из «Картотеки»:

{for: selectedClient in selectedClientsList}
{selectedClient}
{end:}



Согласия пациента: (client.consents} (CClientConsentInfo)

Класс CClientConsentInfo (Данные о согласиях пациента):

*id - идентификатор согласия пациента
*code - код типа согласия
*name - наименование типа согласия
*value - значение согласие числом (0-отказ, 1-согласен)
*strValue - значение согласия строкой ("Да", "Нет")
*date - дата регистрации согласия
*endDate - дата окончания действия согласия
*representerClientId - идентификатор подписавшего согласия, если это не сам пациент
*representer - ФИО подписавшего согласия, если это не сам пациент

При этом код:

{for: consent in client.consents}
{consent}
{end:}

в шаблоне печати выдаст все согласия пациента в виде
''код_типа_согласия: значение_строкой''



Квоты пациента: (client.quotas} (CClientQuotaInfo)

'''Класс CClientQuotaInfo (Данные о квотах пациента):'''

*identifier - идентификатор
*ticket - номер талона
*type - тип квоты
*stage - этап
*directionDate - дата направления
*freeInput - направившее ЛПУ (свободный ввод)
*org - направившее ЛПУ
*amount - количество квот
*MKB - шифр МКБ
*status - статус квоты
*request - обращение (0 - первичное, 1 - повторное)
*statement - показания к выделению квоты
*registrationDate - дата регистрации квоты
*endDate - дата окончания действия квоты
*orgStructure - подразделение базового ЛПУ
*regionCode - код направившего региона
*discussion - согласование предоставления квоты



Класс "Прикрепление" CClientAttachInfo

Пример: {client.permanentAttach.org}

*code: код прикрепления (строка)
*name: наименование прикрепления (строка)
*outcome: выбытие (логическое)
*begDate: начало прикрепления
*endDate: окончание прикрепления
*org (COrgInfo): организация прикрепления
*document (CClientDocumentInfo): документ подтверждающий прикрепление
*orgStructure (COrgStructureInfo): подразделение прикрепления

Пример обращения ко всем прикреплениям в карточке пациента:

{for: attach in client.getAttaches(temporary=True)}
{attach}
{end:}

*temporary=True: обращается к временным прикреплениям
*temporary=False: обращается к постоянным прикреплениям



Полис: client.policy (CClientPolicyInfo)

*тип: {client.policy.type}
*вид: {client.policy.kind}
*страхователь: {client.policy.insurer}
*КЛАДР-код зоны обслуживания страховой компании {client.policy.insurer.areaRaw}
*серия: {client.policy.serial}
*номер: {client.policy.number}
*название: {client.policy.name}
*начальная дата: {client.policy.begDate}
*конечная дата: {client.policy.endDate}
*примечания: {client.policy.note}

Для явно указания типа страхования полиса вместо client.policy следует использовать:

*client.compulsoryPolicy - полис ОМС
*client.voluntaryPolicy - полис ДМС



Адрес регистрации: {client.regAddress} (CAddressInfo)

*Рег-КЛАДР: {client.regAddress.KLADRCode}
*Рег-КЛАДР улицы: {client.regAddress.KLADRStreetCode}
*Рег-GUID FIAS улицы: {client.regAddress.FIASStreetGUID}
*Рег-город: {client.regAddress.city}
*Рег-улица: {client.regAddress.street}
*Рег-дом: {client.regAddress.number}
*Рег-корпус: {client.regAddress.corpus}
*Рег-квартира: {client.regAddress.flat}
*Рег-текст: {client.regAddress.freeInput}
*Рег-район: {client.regAddress.district}
*Рег-ОКАТО: {client.regAddress.ОКАТО}
*Рег-Индекс: {client.regAddress.index}



Адрес проживания: {client.locAddress}

*Прож-КЛАДР: {client.locAddress.KLADRCode}
*Прож-КЛАДР улицы:{client.locAddress.KLADRStreetCode}
*Прож-GUID FIAS улицы: {client.locAddress.FIASStreetGUID}
*Прож-город: {client.locAddress.city}
*Прож-улица: {client.locAddress.street}
*Прож-дом: {client.locAddress.number}
*Прож-корпус: {client.locAddress.corpus}
*Прож-квартира: {client.locAddress.flat}
*Прож-текст: {client.locAddress.freeInput}
*Прож-район: { client.locAddress.district}
*Прож-ОКАТО: { client.locAddress.ОКАТО}
*Прож-Индекс: {client.locAddress.index}



Адрес места рождения: {client.birthPlace}

*МРож-КЛАДР: {client.birthPlace.KLADRCode}
*МРож-КЛАДР улицы:{client.birthPlace.KLADRStreetCode}
*МРож-GUID FIAS улицы: {client.birthPlace.FIASStreetGUID}
*МРож-город: {client.birthPlace.city}
*МРож-улица: {client.birthPlace.street}
*МРож-дом: {client.birthPlace.number}
*МРож-корпус: {client.birthPlace.corpus}
*МРож-квартира: {client.birthPlace.flat}
*МРож-текст: {client.birthPlace.freeInput}
*МРож-район: {client.birthPlace.district}
*МРож-Индекс: {client.birthPlace.index}



Определение местности

Для определения местности в шаблоне печати можно применить следующее: 6. Местность: {:incity = (str(client.regAddress.KLADRCode)[8:11] == '000')} {if: incity} городская {else:} сельская{end:}

Принадлежность адреса к региону РФ: {client.regAddress.mainRegion}, {client.locAddress.mainRegion}



"Разделение" адреса на город, улицу, дом, квартиру

{client.regAddress.town + u", " + client.regAddress.street + u", д." + client.regAddress.number + u", корп." + client.regAddress.corpus + u", кв. " + client.regAddress.flat }



Занятость: {client.work}

*занятость-орг.: {client.work.shortName}
*занятость-должность по справочнику: {client.work.postId}. Код должности: {client.work.postId.code}. Название должности: {client.work.postId.name}
*занятость-должность: {client.work.post}
*занятость-ОКВЕД: {client.work.OKVED}



Идентификация: {client.identification} ( CClientIdentificationInfo )

*client.identification.byUrn['1'] -- вернёт идентификатор по коду из rbAccountingSystem

или пустую строку

*str(client.identification) -- вернёт строку с разными идентификаторами (типа Единый полис (1): 7801983056802872, Идентификатор ЕИС РПФ (2): 18951363 )
*{for: code, ident in client.identification.iteritems()} ... {:end} -- цикл по парам (код, идентификатор)
*client.identification.byCode -- вернёт словарь с отображением код->идентификатор (этот словарь лежит в основании client.identification)
*client.identification.nameDict -- вернёт словарь с отображением код->название,может быть полезно для заголовков.

Такой же механизм можно использовать для классов '''COrgIdentificationInfo и CPersonIdentificationInfo'''.

Вывод определенного кода идентификации (01)

{if: client.identification.byCode['01']}
{client.identification.byCode.get('01', '')}
{end:}

Если не знаем кода, но знаем urn:

{for: (code, urn) in currentOrganisation.identification.byUrn.items()}
{if: urn == u'urn:oid:1.2.643.5.1.13.2.1.1.178'}
{code}
{end:}
{end:}

Второй способ получения идентификатора по '''urn''' из rbAccountingSystem

*.identify

Пример получения идентификатора по справочнику должностей oid:1.2.643.5.1.13.13.11.1002:

{action.person.post.identify('urn:oid:1.2.643.5.1.13.13.11.1002')

Работает для следующих объектов и классов:

*rbBloodType '''CBloodTypeInfo'''
*rbContainerType '''CContainerTypeInfo'''
*rbDiagnosticResult '''CDiagnosticResultInfo'''
*rbDiseaseCharacter '''CCharacterInfo'''
*rbDispanser '''CDispanserInfo'''
*rbDocumentType '''CDocumentTypeInfo'''
*rbEventTypePurpose '''CPurposeInfo'''
*rbFinance '''CFinanceInfo'''
*rbHospitalBedProfile '''CHospitalBedProfileInfo'''
*rbMedicalAidProfile '''CMedicalAidProfileInfo'''
*rbMedicalAidType '''CMedicalAidTypeInfo'''
*rbMetastasis '''CMetastasisInfo'''
*rbNodus '''CNodusInfo'''
*rbNomenclature '''CNomenclatureInfo'''
*rbPost '''CPostInfo'''
*rbService '''CServiceInfo'''
*rbSocStatusType '''CSocStatusType''','''CClientSocStatusInfo'''
*rbSpeciality '''CSpecialityName'''
*rbSpecimenType '''CSpecimentTypeInfo'''
*rbTNMphase '''CTNMphaseInfo'''
*rbTempInvalidReason '''CTempInvalidReasonInfo'''
*rbTempInvalidResult '''CTempInvalidResultInfo'''
*rbTissueType '''CTissueTypeInfo'''
*rbTraumaType '''CTraumaTypeInfo'''
*rbTumor '''CTumorInfo'''
*rbUnit '''CUnitInfo'''
*rbVisitType '''CVisitTypeInfo'''
*rbRelationType '''CRelativeIdentificationInfo'''
*rbNomenclatureActiveSubstance '''CNomenclatureActiveSubstanceInfo'''
*rbNomenclatureUsingType '''CNomenclatureUsingTypeInfo'''



Связи пациента: {client.relations} (список)

*rel. client (CClientInfo) связанный пациент
*rel. relative (CClientInfo) сам пациент
*rel. identification (CRelativeIdentificationInfo) Идентификация связи
*rel.role: Строка, leftName или rightName в зависимости от "направления" связи
*rel.otherRole: Строка, "другое" имя
*rel.name: Строка, role -> otherRole; добавлено для "совместимости" с интерфейсом
*rel.other: ClientInfo связанного клиента
*rel.code: Строка, соотв. коду из rbRelationType
*rel.regionalCode: Строка, regionalCode или regionalReverseCode из rbRelationType смотря по направлению связи
*rel.isDirectGenetic: Логическое, isDirectGenetic или isBackwardGenetic из rbRelationType смотря по направлению связи
*rel.isBackwardGenetic: Логическое, аналогично
*rel.isDirectRepresentative: Логическое, аналогично
*rel.isBackwardRepresentative: Логическое, аналогично
*rel.isDirectEpidemic: Логическое, аналогично
*rel.isBackwardEpidemic: Логическое, аналогично
*rel.isDirectDonation: Логическое, аналогично
*rel.isBackwardDonation: Логическое, аналогично

Например. Связи:

{if: client.relations}
rel
rel.role
rel.otherRole
rel.name
rel.other
rel.code
rel.regionalCode
rel.isDirectGenetic
rel.isBackwardGenetic
rel.isDirectRepresentative
rel.isBackwardRepresentative
rel.isDirectEpidemic
rel.isBackwardEpidemic
rel.isDirectDonation
rel.isBackwardDonation

{for: rel in client.relations}

{rel}
{rel.role}
{rel.otherRole}
{rel.name}
{rel.other}
{rel.code}
{rel.regionalCode}
{rel.isDirectGenetic}
{rel.isBackwardGenetic}
{rel.isDirectRepresentative}
{rel.isBackwardRepresentative}
{rel.isDirectEpidemic}
{rel.isBackwardEpidemic}
{rel.isDirectDonation}
{rel.isBackwardDonation}

{end:}

{else:}
связей нет
{end:}



Аллергия: (CClientAllergyInfo)

{for: allergy in client.allergies}

*Название: {allegy.name} (строка)
*Сила: {allergy.power} (число)
*Дата: {allergy.date} (CDateInfo)
*Примечания: {allergy.notes} (строка)



Лекарственная непереносимость: (CClientIntoleranceMedicamentInfo)

{for: intolerance in client.intolerances}

*Название: {intolerance.name} (строка)
*Сила: {intolerance.power} (число)
*Дата: {intolerance.date} (CDateInfo)
*Примечания: {intolerance.notes} (строка)



Факторы риска: (client.riskFactors)

{for: riskFactor in client.riskFactors}

*Идентификатор записи в справочнике "Факторы риска": {riskFactor.id}
*Идентификатор записи из таблицы ClientRiskFactor: {riskFactor._clientRiskFactorId}
*Код: {riskFactor.code} (строка)
*Региональный код: {riskFactor.regionalCode} (строка)
*Наименование: {riskFactor.name} (строка)
*МКБ: {riskFactor.MKB} (строка)
*Степень: {riskFactor.power} (строка)
*Примечание: {riskFactor.note} (строка)
*Дата начала: {riskFactor.begDate} (CDateInfo)
*Дата окончания: {riskFactor.endDate} (CDateInfo)



Вредность и факторы

{if:client.work.hurts}
{for: i, hurt in enumerate(client.work.hurts)}
Вредность номер {i+1}: код: {hurt.code}, наименование: {hurt.name}, стаж: {hurt.stage}, строка: {hurt},
{if: hurt.factors}
{for: j, factor in enumerate(hurt.factors)}
фактор № {j+1}, код:{factor.code}, наименование:{factor.name}
{end:}
{else:}
факторов нет
{end:}
{end:}
{else:}
вредности нет
{end:}

Аналогичным образом можно получить информацию об идентификации типов и факторов вредности (например, для формирования в СЭМД):

{if: client.work.hurts}
{for: hurt in client.work.hurts}
code="{hurt.identify('urn:oid:1.2.643.5.1.13.13.11.1060').value}" codeSystemVersion="2.1" displayName="{hurt.name}"
{if: hurt.factors}
{for: factor in hurt.factors}
code="{factor.identify('urn:oid:1.2.643.5.1.13.13.11.1060').value}" codeSystemVersion="2.1" displayName="{factor.name}"
{end:}
{end:}
{end:}
{end:}

С ревизии клиента 33840 и выше обращение к факторам было изменено.

{: j = 0}
{if: client.work.hurtFactors}
{for: i, factor in enumerate(client.work.hurtFactors)}
фактор № {j+1}, код: {factor.code}, наименование: {factor.name}, идентификатор по справочнику с OID 1.2.643.5.1.13.13.11.1060: {factor.identify('urn:oid:1.2.643.5.1.13.13.11.1060')}
{end:}
{else:}
факторов нет
{end:}



Соц.статусы: {client.socStatuses}

client.socStatuses (CClientSocStatusInfoList) - массив соц. статусов. Элемент соц.статуса (CClientSocStatusInfo) имеет параметры:

*code
*name
*document
*begDate
*endDate
*classes - массив классов элемента соц. статуса (CSocStatusClassInfoList)
*identify('urn справочника')

Элемент класса соц.статуса (CSocStatusClassInfo) имеет параметры:

*code
*name
*group

*Список статусов

{if:len(client.socStatuses)}
{for: s in client.socStatuses}
{s.code} {s.name} {s} {s.identify('urn:oid:1.2.643.5.1.13.13.11.1050')}
код имя всё идентификатор по справочнику 1.2.643.5.1.13.13.11.1050
{end:}
{end:}

*Проверка наличия соц.статуса

{if:len(client.socStatuses)}
Л
{else:}
Х
{end:}

*Выбор кода соц.статуса

1. последний в списке {client.socStatuses[-1].code} 2. первый в списке {client.socStatuses[0].code}

'''Документ подтверждающий соц.статус:'''

*client.socStatuses[i].document (CClientDocumentInfo):
*type - тип документа (CDocumentTypeInfo)
*serial - серия документа
*number - номер документа
*date - дата выдачи документа
*origin - орган выдавший документ



Прививочная карта пациента.

{for: vaccination in client.vaccinations}

*{vaccination} - прививка
*{vaccination.vaccine} - описание вакцины
*{vaccination.datetime} - дата вакцинации
*{vaccination.dose} - доза
*{vaccination.seria} - серия
*{vaccination.person} - исполнитель
*{vaccination.reaction} - реакция
*{vaccination.transitionType} - тип перехода/дополнительно
*{vaccination.relegateOrg} - направитель
*{vaccination.infections} - список инфекций
*{vaccination.vaccineationType} - тип вакцинации
*{vaccination.vaccine.identify('urn:oid:номер справочника')} - идентификация вакцины
*{vaccination.vaccine.identify('urn:oid:номер справочника').vaccinationType} - тип вакцины на вкладке идентификация

{end:}

{for: vaccineProbeItem in vaccineProbeList}

*{vaccineProbeItem.probe.name} - наименование пробы
*{vaccineProbeItem.date} - дата пробы
*{vaccineProbeItem.reaction} - реакция
*{vaccineProbeItem.result} - результат

{end:}



Данные о событии пациента

Существует параметр '''clientEvents''' - это массив из событий. По каждому элементу массива можно получить все данные о событии



Эпидемиологичеcкий случай пацинета

Класс '''CClientEpidCaseInfo''' содержит следуюшие элементы:

*id - идентификатор
*MKB - шифр МКБ
*number - эпид. номер
*redDate - дата присвоения эпид. номера
*regPerson - лицо, зарегистрировавшее эпид. номер
*endDate - дата завершения эпид. случая
*note - примечание

В класс CClientInfo добавлено свойство epidCases. 

Пример использования:

{for: case in client.epidCases}

{case.number}

{end:}



Сотрудник person (CPersonInfo)

*код: {person.code} (строка)
*какой-то федеральный код: {person.federalCode} (строка)
*какой-то региональный код: {person.regionalCode} (строка)
*фамилия: {person.lastName} (строка)
*имя: {person.firstName} (строка)
*отчество: {person.patrName} (строка)
*фамилия, имя, отчество: {person.longName} (строка)
*фамилия и.о.: {person.shortName} (строка)
*кабинет: {person.office} (строка)
*должность: {person.post} (CPostInfo)
*специальность: {person.speciality} (CSpecialityInfo)
*место работы: {person.organisation} (COrgInfo)
*организационная структура: {person.orgStructure} (COrgStructureInfo)
*имя для входа в систему: {person.login} (строка)
*список кадровых перемещений: {person.orders} (CPersonOrderInfo)
*ученая степень сотрудника {person.academicDegree}

Например: начальник подразделения в котором работает сотрудник

{person.orgStructure.chief}
{person.orgStructure.chief if person.orgStructure else None}



Класс "Кадровые перемещения сотрудника" CPersonOrderInfo

*date - дата перемещения
*type - тип перемещения
*typeAsString - название типа перемещения
*documentDate - дата документа о перемещении
*documentNumber - номер документа о перемещении
*documentType - тип документа о перемещении (HL7)
*validFromDate - дата начала действия перемещения
*validToDate - дата окончания действия перемещения
*orgStructure - подразделение
*post - должность

Доступен механизм подстановки замещающих в шаблонах печати. Пример:

{def: getSubstitutionChief(actionInfo)}
{:orgStr = actionInfo.person.orgStructure}
{while: not orgStr.chief.id}
{:orgStr = orgStr.parent}
{end:}
{for: order in orgStr.chief.orders}
{if: order.type in (3,4,5,6) and actionInfo.endDate.date >= order.validFromDate.date and actionInfo.endDate.date <= order.validToDate.date} {if: order.substitutionPerson.id} {:return order.substitutionPerson} {else:} {:return orgStr.chief} {end:} {end:} {end:} {:return orgStr.chief} {end:} {def: getSubstitutionPerson(actionInfo)} {for: order in actionInfo.person.orders} {if: order.type in (3,4,5,6) and actionInfo.endDate.date >= order.validFromDate.date and actionInfo.endDate.date <= order.validToDate.date} {if: order.substitutionPerson.id} {:return order.substitutionPerson} {else:} {:return actionInfo.person} {end:} {end:} {end:} {:return actionInfo.person} {end:}
Заведующий отделением: {getSubstitutionChief(action)}
Врач исполнитель: {getSubstitutionPerson(action)}



Класс "Квалификация сотрудника" (CEducationInfoList)

У person (CPersonInfo) есть параметр {educations}, с помощью которого можно получить информацию по квалификации сотрудника. Пример использования:

{for: education in event.setPerson.educations}
{education.documentType} - тип документа (CDocumentInfo)
{education.serial} - серия
{education.number} - номер
{education.date} - дата
{education.origin} - организация
{education.status} - статус
{education.validFromDate} - действительно с даты
{education.validToDate} - действительно по дату
{education.speciality} - специальность (CSpecialityInfo)
{end:}



Класс "Вид деятельности сотрудника"

{for: activity in person.activities}
{activity.code}
{activity.name}
{activity.regionalCode}
{activity.note}
{end:}



Справочник "Старые фамилии"

Для шаблонов печати реализован доступ к справочнику старых фамилий, через внешнюю учетную систему "Старые фамилии", с кодом "OldSurname". Данные указываются на вкладке Идентификация в карте сотрудника.

{getShortName(byDate=None, code='OldSurname')}
{getFullName(byDate=None, code='OldSurname')}

Параметр byDate может принимать значения:

{event.execDate} - дата выполнения события
{action.begDate} - дата начала действия
{action.endDate} - дата окончания действия
{action[u'Name'].value} - дата из свойства с именем Name



Контактные данные сотрудника

Сведения о контактных данных сотрудника представлены в виде массива, который выводится при помощи {person.contacts}.
Работа с массивом контактов сотрудника идентична работе с массивом контактов пациента.



Услуга (профиль оплаты) service (CServiceInfo)

Элемент справочника, имеющий свойства code и name и, кроме того, свойства:

*унаследовано из ЕИС: {service.eisLegacy} (логический); пример: {visit.service.eisLegacy}
*признак необходимости лицензии: {service.license} (строка)
*ИНФИС-код: {service.infis} (строка)
*дата начала: {service.begDate} (CDateInfo)
*дата окончания: {service.endDate} (CDateInfo)



Посещение (визит)

visit (CVisitInfo), имеет свойства:

*Тип визита: {visit.type} (справочник CVisitTypeInfo)
*Назначенная дата: {visit.date} (CDateInfo)
*Врач: {visit.person } (CPersonInfo)
*Место выполнения визита: {visit.scene} (справочник CSceneInfo)
*Признак первичности: {visit.isPrimary} (1 - первичный, 2 - повторный)
*Источники финансирования: {visit.finance} (справочник CFinanceInfo)
*Услуга (профиль ЕИС): {visit.service} (CServiceInfo)
*Флаги финансирования: {visit.payStatus} (целое число)



Вкладка визиты (контекст visitsList)

Доступна печать фильтров информации из фильтров. Пример:

Дата визита:
с {if: filterVisitBegDate}{filterVisitBegDate}{end:} {if: filterVisitBegTime}{filterVisitBegTime}{end:}
по {if: filterVisitEndDate}{filterVisitEndDate}{end:} {if: filterVisitEndTime }{filterVisitEndTime}{end:}

Подразделение исполнителя: {if: filterVisitExecSetOrgStructure}{filterVisitExecSetOrgStructure}{end:}

Специальность исполнителя: {if: filterVisitExecSetSpeciality}{filterVisitExecSetSpeciality}{end:}

Исполнитель: {if: filterVisitExecSetPerson }{filterVisitExecSetPerson}{end:}

Ассистент: {if: filterVisitAssistant }{filterVisitAssistant}{end:}

Тип финансирования: {if:filterVisitFinance }{filterVisitFinance}{end:}

Услуга: {if: filterVisitService}{filterVisitService}{end:}

Место: {if: filterVisitScene}{filterVisitScene}{end:}

Автор: {if: filterVisitCreatePersonEx}{filterVisitCreatePersonEx}{end:}

Дата создания:
с {if: filterVisitBegCreateDateEx}{filterVisitBegCreateDateEx}{end:}
по {if :filterVisitEndCreateDateEx}{filterVisitEndCreateDateEx}{end:}

Автор последнего изменения: {if: filterVisitModifyPersonEx }{filterVisitModifyPersonEx}{end:}

Дата последнего изменения:
c {if: filterVisitBegModifyDateEx }{filterVisitBegModifyDateEx}{end:}
по {if: filterVisitEndModifyDateEx}{filterVisitEndModifyDateEx}{end:}

Оплата: {if: filterVisitPayStatusCodeEx}{filterVisitPayStatusCodeEx}{end:} {if: filterVisitPayStatusFinanceEx}{filterVisitPayStatusFinanceEx}{end:}



Обращение {event} (CEventInfo)

*Тип обращения: {event.eventType} (CEventTypeInfo)
*Идентификация типа события: {event.eventType.identify('urn:oid:1.2.643.5.1.13.13.99.2.726')}
*Назначение типа обращения; цель: {event.eventType.purpose} (CPurposeInfo)
*Тип финансирования: {event.eventType.finance} (CFinanceInfo)
*Базовый сервис ОМС: {event.eventType.service} (CServiceInfo)
*Имя контекста печати: {event.eventType.printContext} (строка)
*Внешний идентификатор/Номер документа: {event.externalId} (строка)
*Организация: {event.org} (COrgInfo)
*Клиент: {event.client} (CclientInfo)
*Код карточки: {event.id} (строка)
*Контракт: {event.contract} (CContractInfo)
*Дата предыдущего обращения: {event.prevEventDate} (CDateInfo)
*Дата назначения: {event.setDate} (CDateInfo)
*Кем назначен: {event.setPerson} (CPersonInfo)
*Дата выполнения: {event.execDate} (CDateInfo)
*Выполнил: {event.execPerson} (CPersonInfo)
*Признак первичности: {event.isPrimary} (1-первичный, 2-повторный, 3-активное посещение, 4-перевозка)
*Порядок наступления: {event.order} (0-плановый, 1-экстренный, 2-самотёком, 3-принудительный) и т.д.
*Результат обращения: {event.result} (CResultInfo)
*Дата следующего обращения: {event.nextEventDate} (CDateInfo)
*Флаги финансирования: {event.payStatus} (целое)
*Тип актива: {event.typeAsset} (CEmergencyTypeAssetInfo)
*Примечания: {event.note} (строка)
*Куратор: {event.curator} (CPersonInfo)
*Ассистент: {event.assistant} (CPersonInfo)
*Мероприятия: {event.actions} (CActionInfoList)
*Диагнозы: {event.diagnosises} (CDiagnosticInfoList)
*Описание диагноза: {event.diagnosises.freeInput} Для вывода описания каждого диагноза необходимо использовать цикл по {event.diagnosises}
*Посещения: {event.visits} (CVisitInfoList)
*Листы временной нетрудоспособности с begDate по endDate: {event.getTempInvalidList(begDate, endDate)} (CTempInvalidListInfo)
*МЭС: {event.mes} (CMesInfo )
*Особенности выполнения МЭС: {event.mesSpecification} (CMesSpecificationInfo )
*Модель пациента: {event.patientModel} (строка)
*Лицо по уходу, объект CClientInfo (доступны данные, которые есть у пациента): event.relative
*Тип квоты модели пациенты {event.patientModel.quotaType} (CQuotaTypeInfo )
*Вид лечения: {event.cureType} (строка)
*Метод лечения: {event.cureMethod} (строка)
*Вид медицинской помощи {event.eventType.medicalAidKind}
*Профиль медицинской помощи {event.medicalAidProfile}
*Предшествующее событие - {event.prevEvent} (CEventInfo)
*Автор записи: {event.createPerson} {CPersonInfo}
*Автор изменений: {event.modifyPerson} {CPersonInfo}
*Неделя беременности (стат.учёт): {event.pregnancyWeek}
*Имеются ли не сохраненные изменения в Событии: {event.isDirty}
*Направитель (организация) (вкладка Примечания): {event.relegateOrg}
*Номер направления(вкладка Примечания): {event.srcNumber}
*Дата направления(вкладка Примечания): {event.srcDate}
*Длительность (стат.учет) {:ED = event.execDate if event.execDate else currentDate()}

{:delta = ED.date.toJulianDay() - event.setDate.date.toJulianDay()} {:duration = str(delta).split()[0]}



Параметры требования МЭС

*Код - {event.mes.code}
*Наименование - {event.mes.name}
*Описание - {event.mes.descr}
*Сервис - {event.mes.service}
*Признак активности - {event.mes.active}
*Признак внутренний это МЭС или нет - {event.mes.internal}
*Группа - {event.mes.group}
*Минимальная длительность - {event.mes.min}
*Максимальная длительность - {event.mes.max}
*Средняя длительность - {event.mes.avg}
*Модель пациента - {event.mes.patientModel}
*Норматив визитов - {event.mes.norm}
*Периодичность в днях - {event.mes.periodicity}
*Группа КСГ- {event.mes.ksg}
*Дата окончания действия - {event.mes.endDate}
*Признак Политравма - {event.mes.isPolyTrauma}
*Заболевания, входящие в МЭС (в формулировках МКБ):

{for: i, mkb in enumerate(event.mes.MKB)}
{mkb.code} - код диагноза по МКБ
{mkb.name} - наименование МКБ
{mkb.exCode} - код доп. диагноза по МКБ
{mkb.exName} - наименование доп. диагноза по МКБ
{mkb.grouping}
{mkb.blending} - сочетаемость (0-основной и дополнительный,1-основной,2-дополнительный)
{end:}

*Оказанные услуги (мероприятия):

{for: i, serviceType in enumerate(event.mes.serviceTypes)}
{serviceType.groupCode} - код группировки услуг
{serviceType.groupName} - наименование группировки услуг
{serviceType.code} - код услуги
{serviceType.name} - наименование услуги
{serviceType.doctorWTU} - УЕТ врача
{serviceType.paramedicalWTU} - УЕТ средний
{serviceType.averageQnt} - среднее кол-во предоставления услуги (кратность) пациенту за период госпитализации
{serviceType.necessity} - частота предоставления услуги (потребность) в рамках настоящего стандарта
{serviceType.binding} - признак объединения услуг в единую технологическую совокупность
{serviceType.sex} - пол (0-не определено, 1-М, 2-Ж)
{serviceType.begAgeUnit} - применимо для минимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{serviceType.minimumAge} - минимальный возраст (yy-mm-dd)
{serviceType.endAgeUnit} - применимо для максимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{serviceType.maximumAge} - максимальный возраст (yy-mm-dd)
{serviceType.controlPeriod} - период контроля (0-Текущая дата, 1-Конец текущего года, 2-Конец предыдущего года)
{end:}

*Услуги лечащего и консультирующего врача (ВИЗИТЫ):

{for: i,visit in enumerate(event.mes.visitTypes)}
{visit.name} - наименование
{visit.specialityName} - наименование специальности
{visit.serviceCode} - услуга
{visit.additionalServiceCode} - дополнительный код услуги
{visit.altAdditionalServiceCode} - альтернативный доп. код
{visit.groupCode} - группировка визитов
{visit.averageQnt} - среднее кол-во визитов (кратность) за период госпитализации
{visit.sex} - пол (0-не определено, 1-М, 2-Ж)
{visit.begAgeUnit} - применимо для минимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{visit.minimumAge} - минимальный возраст (yy-mm-dd)
{visit.endAgeUnit} - применимо для максимального возраста (0-любой, 1-Д, 2-Н, 3-М, 4-Г)
{visit.maximumAge} - максимальный возраст (yy-mm-dd)
{visit.controlPeriod} - Период контроля (0-Текущая дата, 1-Конец текущего года, 2-Конец предыдущего года)
{end:}



Вкладка Обращение (контекст печати eventsList)

На вкладке реализована возможность выводить в шаблон печати данные полей фильтра. Сейчас доступны для печати следующие поля:

{filter.eventType} - тип события
{filter.eventBegSetDate} - начальная дата периода назначения
{filter.eventBegSetTime} - начальное время периода назначения
{filter.eventEndSetDate} - конечная дата периода назначения
{filter.eventEndSetTime} - конечное время периода назначения
{filter.eventBegExecDate} - начальная дата периода выполнения
{filter.eventBegExecTime} - начальное время периода выполнения
{filter.eventEndExecDate} - конечная дата периода назначения
{filter.eventEndExecTime} - конечное время периода назначения
{filter.eventOrgStructure} - подразделение
{filter.eventSpeciality} - специальность
{filter.eventPerson} - врач.

Данных по тарифу КСГ:

{for: csg in event.csgList}
{:csg.service.prepareTariff(event.contract.id, event.client.id)}
{csg.service.tariff}
{end:}



Вызов зубной формулы (CTeethEventInfo) (для формы ввода ф.043)

*{ write(event.stomat) } - нарисовать стоматологическую таблицу
*{ write(event.parodent) } - нарисовать пародентологическую таблицу

Так как стоматологическая таблица для детей имеет меньше значений то, чтоб не печатать лишних пустых граф существуют следующие подстановки:

*{write(event.stomatchildfull)} - нарисовать стоматологическую таблицу для ребенка
*{write(event.parodentchildfull)} - нарисовать пародентологическую таблицу для ребенка



Вызов скорой помощи event (CEmergencyEventInfo)

Имеет те же свойства, что и CEventInfo и, кроме того, свойства:

*Номер карты вызова: {event.numberCardCall} (строка)
*Номер бригады: {event.brigade} (CEmergencyBrigadeInfo)
*Повод к вызову: {event.causeCall} (CEmergencyCauseCallInfo)
*Кто вызывал: {event.whoCallOnPhone} (строка)
*Телефон: {event.numberPhone} (строка)
*Время начала: {event.begDate} (CDateTimeInfo)
*Время передачи бригаде: {event.passDate} (CDateTimeInfo)
*Время выезда: {event.departureDate} (CDateTimeInfo)
*Время прибытия: {event.arrivalDate} (CDateTimeInfo)
*Время окончания обслуживания: {event.finishServiceDate} (CDateTimeInfo)
*Время возвращения на станцию: {event.endDate} (CDateTimeInfo)
*Место получения вызова: {event.placeReceptionCall} (CEmergencyPlaceReceptionCallInfo)
*Вызов получен: {event.receivedCall} (CEmergencyReceivedCallInfo)
*Причина задержки: {event.reasondDelays} (CEmergencyReasondDelaysInfo)
*Результат: {event.resultCall} (CEmergencyResultInfo)
*Несчастный случай: {event.accident} (CEmergencyAccidentInfo)
*Смерть: {event.death} (CEmergencyDeathInfo)
*Опьянение: {event.ebriety} (CEmergencyEbrietyInfo)
*Больной: {event.diseased} (CEmergencyDiseasedInfo)
*Место вызова: {event.placeCall} (CEmergencyPlaceCallInfo)
*Способ транспортировки: {event.methodTransport} (CEmergencyMethodTransportInfo)
*Транспортировку перенес: {event.transfTransport} (CEmergencyTransferTransportInfo)
*Отказ от госпитализации: {event.renunOfHospital} (логический)
*Лицо отказа от госпитализации: {event.faceRenunOfHospital} (строка)
*Заболевание: {event.disease} (логический)
*Роды: {event.birth} (логический)
*Патология беременности: {event.pregnancyFailure} (логический)
*Примечание: {event.noteCall} (строка)



Констатация смерти event

Имеет те же свойства, что и CEventInfo и, кроме того, свойства:

*Смерть наступила: {event.deathPlaceType} (CDeathPlaceTypeInfo, есть поля code и name)

*Смерть произошла: {event.deathCauseType} (CDeathCauseTypeInfo, поля code и name)

*Причины смерти установлены: {event.employeeTypeDeterminedDeathCause} (CEmployeeTypeDeterminedDeathCauseInfo, поля code и name)

*Основание: {event.groundsForDeathCause} (CGroundsForDeathCauseInfo, поля code и name)

*Адрес места смерти (КЛАДР): {event.deathAddress} (CAddressInfo)

*Адрес места смерти (свободный ввод): {event.deathAddressFreeInput } (строка)



Диагноз (ЛУД)

Представляется экземплярами CDiagnosisInfo. У экземпляра CDiagnosisInfo есть свойства:

*type (CDiagnosisTypeInfo) - тип диагноза,
*MKB (CMKBInfo) - диагноз,
*MKBEx (CMKBInfo) - классификация по 5-му знаку,
*exSubclassMKB (CDiagnosisInfo и CDiagnosticInfo) - расширенная субклассификация МКБ,
*character (CCharacterInfo) - характер,
*dispanser (CDispanserInfo) - диспансерное наблюдение,
*traumaType (CTraumaTypeInfo) - травма,
*person (CPersonInfo) - врач,
*setDate (CDateInfo) - дата начала,
*endDate (CDateInfo) - дата окончания
*CDagnosisTypeInfo, CCharacterInfo, CDispanserInfo, CTraumaTypeInfo - суть представление элементов различных справочников, и предоставляют свойства code и name (оба - строки). Когда значение приводится к строке используется свойство name.
*CDispanserInfo также предоставляет свойство observed (boolean)
*CMKBInfo - есть свойства code, morphologyMKB, descr (строки) и VIMISList (список из CVIMISInfo). Когда значение приводится к строке, используется свойство code. morphologyMKB

При работе с отношением кода МКБ к ВИМИС возможно использование функции .hasVIMIS():
*{for: ds in event.diagnosises} ... {if: ds.MKB.hasVIMIS(u'Онкология')} ...



Диагноз (Случай обслуживания)

{event.diagnosises}. У экземпляра diagnosises есть те же свойства, что у диагноза ЛУД и, кроме того:

*stage (CStageInfo)
*sanatorium (boolean),
*hospital (boolean),
*speciality (CSpecialityInfo),
*healthGroup (CHealthGroupInfo),
*result (CResultInfo),
*phase
*notes (строка)
*CStageInfo, CHealthGroupInfo - суть также представление элементов различных справочников, которые предоставляют свойства code и name.
*TNMS
*MKBAdditional (CMKBAdditionalInfo) - Дополнительная субклассификация МКБ. Имеет свойства: code, name



Журнал хранения учетных документов

Информация о текущем местонахождении учетного документа {event.documentLocation}:

*location
*docDate
*docTime
*person
*note



Журнал отложенной записи

Контекст печати: suspendedAppointmentList.

*data = { 'suspendedAppointmentList': suspenedAppointmentInfoList; 'suspendedAppointment' : suspenedAppointmentInfo }
*Классы контекста: CSuspendedAppointmentInfoList, CSuspendedAppointmentInfo, CScheduleItemInfo, CScheduleInfo.



Тип действия (статус, мероприятие, диагностика, лечение, и.т.п.)

action (CActionTypeInfo), имеет свойства:

*класс: {action.class_} (0 - статус, 1 - диагностика, 2 - лечение, 3 - прочие мероприятия)
*группа типов: {action.group} (CActionTypeInfo)
*код мероприятия: {action.code} (строка)
*уникальный "плоский" код мероприятия: {action.flatCode} (строка)
*название мероприятия: {action.name} (строка)
*название мероприятия для печати: {action.title} (строка)
*услуга: {action.service} (CServiceInfo)
*имеет ли значение время мероприятия: {action.showTime} (логический)
*подразделения за которыми закреплено действие {action.orgStructure} (список из COrgStructureInfo)
*PACS: {for: e in action.equipmentList} {e.name} {end:} (список оборудования)



Действие (статус, мероприятие, диагностика, лечение, и.т.п.)

action (CActionInfo), имеет те же свойства, что и CActionTypeInfo и, кроме того, свойства:

*статус выполнения: {action.status} (0 - начато, 1 - ожидание, 2 - закончено, 3 - отменено, 4 - Без результата, 5 - Назначено)
*дата направления: {action.directionDate} (CDateTimeInfo)
*дата начала: {action.begDate} (CDateTimeInfo)
*плановая дата выполнения: {action.plannedEndDate} (CDateTimeInfo)
*дата выполнения: {action.endDate} (CDateTimeInfo)
*исполнитель: {action.person} (CPersonInfo)
*ученая степень врача, выполнившего действие {action.person.academicDegree}
*назначивший: {action.setPerson} (CPersonInfo)
*ученая степень врача, назначившего действие {action.setPerson.academicDegree}
*кабинет: {action.office} (строка)
*тип финансирования: {action.finance } (CFinanceInfo)
*цена: {action.price} (вещественное число)
*количество: {action.amount} (вещественное число)
*примечание: {action.note} (строка)
*имя контекста печати для действия: {action.getPrintTemplateContext(...)} (строка)
*свойство: {action[...]} (CPropertyInfo); пример: {action[u'рост']}
*имеются ли не сохраненные изменения в Действии: {action.isDirty}
*Количество процедур: {action.quantity}
*Длительность: {action.duration}
*Интервал: {action.periodicity}
*Кратность: {action.aliquoticity}
*Особенность выполнения действия: {action.specification.code}, {action.specification.name}

*У экземпляра действия также есть параметр serviceType {action.serviceType} - вид услуги (например, первичный осмотр, лабораторные исследования, операция и тд)

Выводит целочисленное значение от 0 до 11, соответствующее виду услуги. Расшифровка значений: 0-Прочие, 1-первичный осмотр, 2-повторный осмотр, 3-процедура/манипуляция, 4-операция, 5-исследование, 6-лечение, 7-профилактика, 8-анестезия, 9-реанимация, 10-лабораторное исследование, 11-опрос'

*Вывод данных о настройке идентификации Типа Действия выполняется путем указания urn внешней учетной системы следующими способами:

{action.identify('urn')} или {action.identify('urn').value} - вывод значения идентификатора для последней в списке записи по внешней учетной системе с указанным urn;
{action.identify('urn').note} - вывод значения поле "Примечание" для последней в списке записи по внешней учетной системе с указанным urn;
{action.identify('urn').urn} - вывод значения urn внешней учетной системы для последней в списке записи по внешней учетной системе с указанным urn.

{action.identifyAll('urn')} - вывод списка значений идентификаторов Типа Действия по указанному urn внешней учетной системы.

Также к идентификации можно обратиться циклом:
{for: identification in action.identifyAll('urn:oid:1.2.643.2.69.1.1.1.195.Cda')}
{identification.value}: {identification.note} ({identification.urn})
{end:}



Свойства действия

*рост: { action[u'Рост'] }/{ action[u'Рост'].value }/{ action[u'Рост'].unit }/{ action[u'Рост'].norm }
*вес: { action[u'Вес'] }/{ action[u'Вес'].value }/{ action[u'Вес'].unit }/{ action[u'Вес'].norm }
*{action.name} - цикл по свойствам

{for: prop in action}
{prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}

*{action.name} - цикл по номерам свойств

{for: i in xrange(len(action))}
{if: i == action.currentPropertyIndex} {end:}
{i+1}) {action[i].name}: {action[i].value}/{action[i].unit}/{action[i].norm}
{if: i == action.currentPropertyIndex} {end:}
{end:}

*{action.name} - цикл по свойствам с фильтром

{:l = [x for x in action if x.value]}
{for: i,prop in enumerate(l)}
{i}) {prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}

{for: i,prop in enumerate([x for x in action if x.value])}
{i}) {prop.name}: {prop.value}/{prop.unit}/{prop.norm}
{end:}

*количество действий: { len(actions)}

{for: i,a in enumerate(actions)}
{if: i == currentActionIndex}{end:}
{i}/{a.code}/{a.name}/{len(a)}
{if: i == currentActionIndex}{end:}
{end:}

*отображение значения свойства с типом html с обработкой тегов (может потребоваться для вывода таблицы)

{prop.value:h}

*параметр «Пол» свойства Действия, настраиваемый в типе действия {prop.sex}
*параметр «Тест» свойства Действия, настраиваемый в типе действия {prop.test}

*для ряда свойств, ссылающихся на записи в справочниках МИС, добавлена возможность отобразить в шаблоне печати данные таких записей

тип "Действующее вещество ЛСиИМН" (CNomenclatureActiveSubstanceInfo):
{prop.value.code} - код действующего вещества ЛСиИМН (далее - ДВ)
{prop.value.name} - наименование ДВ
{prop.value.unit} - единица измерения ДВ (CUnitInfo)
{prop.value.identify('urn справочника')} - идентификатор ДВ по справочнику с указанным urn

тип "Способ применения ЛСиИМН" (CNomenclatureUsingTypeInfo):
{prop.value.code} - код способа применения ЛСиИМН (далее - СП)
{prop.value.name} - наименование СП
{prop.value.identify('urn справочника')} - идентификатор СП по справочнику с указанным urn



КСГ, применённая в действии

Печать данных по КСГ, применённой в действии, возможна из действия или из события с помощью цикла по действиям, из форм ввода и из вкладок Обращение и Обслуживание

У действия (CActionInfo) есть параметр csg, у которого, в свою очередь, есть следующие параметры:

*{action.csg.begDate} - дата начала
*{action.csg.endDate} - дата окончалия
*{action.csg.MKB} - код МКБ
*{action.csg.CSGCode} - код КСГ
*{action.csg.amount} - количество
*{action.csg.payStatus} - статус оплаты



Биоматериал, связанный с действием

{action.takenTissueJournal} (CtakenTissueJournalInfo):

*datetimeTaken - дата забора биоматериала
*execPerson (CPersonInfo) - регистратор забора
*tissueType - тип биоматериала:
*externalId - идентификатор в журнале(суточный)
*amount - количество биоматериала
*note - примечание



Класс «Услуги/Квотирование» - справочник Типы действий/вкладка Услуги/Квотирование:

{for: action in event.actions}
{for: quotaType in action.quotaType}
{quotaType.quotaClass}
{quotaType.quotaType.name}
{quotaType.quotaType.code}
{quotaType.financeId}
{end:}
{end:}



Печать шаблона в редакторе действия

В случае, когда из редактора действия необходимо распечатать шаблон, содержащий обращение к другим действиям события, необходимо в шаблоне заменить все "event.actions" на "actions" и добавить в начало шаблона следующий код:
{:from PyQt4 import QtGui}
{:from library.PrintInfo import CInfoContext}
{:from Events.ActionInfo import CActionInfo}
{:records = QtGui.qApp.db.getRecordList('Action', 'id', 'Action.event_id = %d' % action.event.id)}
{:context = CInfoContext()}
{:actions = [CActionInfo(context, r.value('id').toInt()[0]) for r in records]}



Вкладка Обслуживание (контекст печати actionsList)

Для шаблонов печати, использующих контекст actionsList, существует возможность вывода данных полей фильтра.

{filter.actionType.name} - тип действия
{filter.actionBegSetDate} - начальная дата периода назначения
{filter.actionEndSetDate} - конечная дата периода назначения
{filter.actionBegExecDate} - начальная дата периода выполнения
{filter.actionBegExecTime} - начальное время периода выполнения
{filter.actionEndExecDate} - конечная дата периода выполнения
{filter.actionEndExecTime} - конечное время периода выполнения
{filter.actionExecOrgStructure} - подразделение исполнителя
{filter.actionExecSpeciality} - специальность исполнителя
{filter.actionExecSetPerson} - исполнитель
{filter.actionExecSetAssistant} - ассистент



Информация о лекарстве

value (CRLSInfo), имеет свойства:

*название вещества: {value.INPName} (строка); пример: {action[u"Выписано"].value.INPName}
*название вещества по-латыни: {value.INPNameLat} (строка)
*торговое название: {value.tradeName} (строка)
*торговое название по-латыни: {value.tradeNameLat} (строка)
*лекарственная форма: {value.form} (строка)
*доза в единице лекарственной формы: {value.dosage} (строка)
*фасовка: {value.filling} (строка)
*упаковка: {value.packing} (строка)

value (CLSiIMNInfo), имеет свойства:

*код: {value.code}
*наименование: {value.name}
*региональный код: {value.RegionalCode}
*тип: {value.type}, имеет параметры code и name. (CLSiIMNTypeInfo)
*наименование по МНН(Международное наименование ЛС): {value.internationalNonproprietaryName}
*Производитель: {value.producer}
*код по АТХ: {value.ATC}
*объем упаковки: {value.packSize}
*код по МНН(Международное наименование ЛС): {value.mnnCode}
*код по ТРН(Торговое наименование ЛС): {value.trnCode}
*дозировка: {value.dosageValue}
*единица изменения дозировки: {value.dosageUnit} (rbUnit)
*форма выпуска лекарственных препаратов: {value.lfForm} (rbLTForm)
*дата включения: {value.inDate}
*дата исключения: {value.exDate}
*комплектность: {value.completeness}
*Особенности ЛСиИМН: {features}. Представляет из себя словарь. Ключом словаря является name, значением - список value. (rbNomenclature_Feature)



Документ временной нетрудоспособности

tempInvalid (CTempInvalidInfo), имеет свойства:

*тип документа: {tempInvalid.doctype} (0-листок нетрудоспособности, 1-справка)
*причина нетрудоспособности: {tempInvalid.reason} (CRBInfo)
*cерия документа: {tempInvalid.serial} (строка)
*номер документа: {tempInvalid.number} (строка)
*дата выдачи документа: {tempInvalid.issueDate} (CDateInfo)
*пол: {tempInvalid.sex} (строка)
*возраст: {tempInvalid.age} (строка)
*продолжительность в днях: {tempInvalid.duration} (целое число)
*продолжительность в днях с учётом внешних периодов: {tempInvalid.externalDuration} (целое число)
*дата начала всего периода ВУТ: {tempInvalid.caseBegDate}
*дата начала ЛВН: {tempInvalid.begDate} (CDateInfo)
*дата окончания: {tempInvalid.endDate} (CDateInfo)
*код диагноза последнего периода: {tempInvalid.MKB} (строка)
*код доп. диагноза последнего периода: {tempInvalid.MKBEx} (строка)
*результат:{if: tempInvalid.state == 0}Открыт {elif: tempInvalid.state == 1}Закрыт {elif: tempInvalid.state == 2}Продлен {elif: tempInvalid.state == 4}Аннулирован {else:} Передан {end:} (0-Открыт, 1-Закрыт, 2-Продлён, 3-Передан)
*cтатус с точки зрения обмена с ФСС:

{if: blank.annulmentReason}Аннулирован
{elif: blank.fssStatus == 'P0'}Открыт
{elif: blank.fssStatus == 'P1'}Продлен
{elif: blank.fssStatus == 'P2'}Продлен
{elif: blank.fssStatus == 'R'}Закрыт
{elif: blank.fssStatus == 'M'} отправлен на МСЭ
{else:}
{end:}

**Обращение к текущему ЛВН просто через {tempInvalid.<что-то>},
**обращение к предыдущему - {tempInvalid.prev.<что-то>}

*результат эпизода ВУТ - {tempInvalid.result}
*Подписан ли результат эпизода ВУТ: {tempInvalid.isSigned}
Случай подписан - {u'Да' if tempInvalid.isSigned else u'Нет'}

CTempInvalidDocumentItemInfo, имеет свойства:

*подписан ли документ (bool): {isSigned}
*дата подписи: {signDate} (CDateInfo)
*подписавший: {signPerson} (CPersonInfo)

Пример использования:

{for: p in tempInvalid.periods}
<div>{p.begDate} {p.endDate} - {if: p.isSigned}'''Подписан''' {p.signPerson} в {p.signDatetime} {else:}Не подписан{end:}</div>
{end:}

Информация о периодах ВУТ (CTempInvalidPeriodInfo)
{for: item in tempInvalid.periods}
{item.begDate}-дата начала периода нетрудоспособности
{item.endPerson}-врач
{item.endDate}-дата окончания периода нетрудоспособности
{item.isExternal} -флаг внешний
{item.regime} -режим
{item.chairPerson} - председатель ВК
{item.duration} - продолжительность периода в днях
{item.note} - примечание
{end:}
Список лиц по уходу «cares».
CTempInvalidDocumentCareInfo имеет свойства:

*idx (число)

*client (CClientInfo)

*begDate (дата)

*endDate (дата)

*regime (CTempInvalidRegimeInfo)

*MKB (строка)

*reason (CTempInvalidReasonInfo)

Пример вывода:
{for: item in tempInvalid.items}
{for: care in item.cares}
<div>{care.client}: {care.begDate} - {care.endDate}</div>
{end:}
{end:}



Врачебная комиссия и направление на МСЭ

medicalCommission, имеет свойства:

{for: mse in expertise}
*Дата начала действия: {mse.begDate}
*Код действия: {mse.code}
*Дата и время добавления создания действия: {mse.createDatetime}
*Пользователь создавший действие: {mse.createPerson}
*Дата назначения действия: {mse.directionDate}
*Дата окончания действия: {mse.endDate}
*Обращение к событию в котором находится действие: {mse.event} (CEventInfo)
*Уникальный "плоский" код действия: {mse.flatCode}
*Уникальный идентификатор документа в БД: {mse.id}
*Дата и время последнего изменения: {mse.modifyDatetime}
*Пользователь внесший последние изменения: {mse.modifyPerson}
*Название действия: {mse.name}
*Примечание действия: {mse.note}
*Исполнитель действия: {mse.person}
*Также можно обратиться к свойствам действия {for: prop in mse} (CPropertyInfo)



Выполнение работ

jobTickets (CJobTicketWithActionsInfo), элемент списка CJobTicket имеет свойства:

*список Действий Работы: actions (СActionInfo)

Например:

jobTickets[i].actions[0].event.client



===== Вывод параметров фильтра (jobTicket_list) =====

*Период c {filter.begDate} по {filter.endDate}
*Работы: {', '.join([unicode(i) for i in filter.jobTypeList])}
*Ожидающие: {filter.awaiting}
*В очереди: {filter.enqueued}
*Выполняемые: {filter.inProgress}
*Законченные: {filter.done}
*Только срочные: {filter.onlyUrgent}
*Подразделение: {filter.orgStructure}
*Специальность: {filter.speciality}
*Врач: {filter.person}
*Пол: {filter.sex}
*Возраст от {filter.ageFrom} до {filter.ageTo} лет



Номерок на Работу

Ticket (СTicketInfo), имеет свойства:

*datetime - дата и время номерка
*idx - порядковый номер
*jobType - (CjobTypeInfo) данные о типе Работы
*jobPurpose - наименование назначения Работы
*jobPurpose.code - код назначения Работы
*orgStructure - (CorgStructureInfo) данные о подразделение в котором запланирована Работа
*status - состояние Номерка
*label - отмека в Номерке
*note - примечание
*begDateTime - плановое начало Работы
*endDateTime - планове окончание Работы



Лист предварительной записи врача (График)

Вкладка "амбулаторный прием" контекст печати "ambQueue"
Вкладка "На дому" контекст печати "homeQueue"
В данных контекстах определены:

*person: CPersonInfo - врач
*{createPerson} - автор записи
*setPersonId: CPersonInfo - поставивший в очередь
*date: CDateInfo - дата на которую получаем список
*office: строка - кабинет
*timeRange: строка - период приёма
*queue: список элементов CQueueInfo (очередь)

CQueueInfo :

*time: CTimeInfo - время приёма (номерка)
*checked: логическое - отметка
*client: CClientInfo - пациент
*complaints: строка - жалобы
*recordDatetime: CDateTimeInfo - дата и время записи

Пример шаблона для вывода на печать текущего листа предварительной записи:

<html>
<body>
Врач:{person}
Дата:{date} Кабинет:{office} Время приёма:{timeRange}

время
отметка
пациент
примечание
{for: i,q in enumerate(queue)}
{i}
{q.time if q.time else '-/-'}
{q.checked}
{q.client if q.client else '-/-'}
{q.complaints}
{end:}
</body>



Журнал кассовых операций

(CCashOperationInfo). Контекст печати - cashOrder. Переменные:

*event: CEventInfo
*client: ClientInfo,
*date: CDateInfo (дата),
*cashOperation: CCashOperationInfo,
*sum: float,
*cashBox:строка

Режим «Расчет» — «Журнал кассовых операций» контекст печати (cashBook):

{for: item in cashBook}
{item.event}
{item.client}
{item.date}
{item.cashOperation}
{item.sum}
{item.cashBox}
{end:}



Класс "Тип финансирования"

CFinanceInfo

*code - код источника
*name- название источника



Класс "Контракт"(Договор)

CContractInfo

*finance (CFinanceInfo) - тип финансирования
*number - номер контракта
*date - дата заключения контракта
*recipient (COrgInfo) - получатель
*payer (COrgInfo) - плательщик
*resolution - основание
*note - примечание
*{contingent}- вкладка Контингент. Это список, у каждого элемента есть следующие параметры:

{for: cont in account.contract.contingent}
{cont.attachType} - Тип прикрепления (CAttachTypeInfo) (code/name)
{cont.attachOrg} - ЛПУ прикрепления
{cont.org} - Занятость (COrgInfo)
{cont.socStatusType} - Соц. Статус (CSocStatusType) (code/name)
{cont.insurer} - СМО (COrgInfo)
{cont.policyType} - Тип страхования (CRBPolicyTypeInfo) (code/name)
{cont.serviceArea} - Зона обслуживания
{cont.sex} - пол
{cont.age} - возраст
{end:}

*{tariffs}- вкладка Тариф. Это список, у каждого элемента есть следующие параметры:

{for: tariff in account.contract.tariffs}
{tariff.service} - Услуга (CServiceInfo)
{tariff.batch} - Группа
{tariff.price} - Цена
{tariff.vat} - НДС
{tariff.age} - Возраст
{tariff.sex} - Пол
{tariff.unit} - Единица учета (rbUnit)
{end:}



Класс "Статьи затрат"

CContractCompositionExpenseInfo

*percent - процент
*sum - сумма
*name - имя статьи затрат
*code - код статьи затрат
*isBase - является ли базовой статьей затрат

Пример:

<html>
<body>
{for: item in account.items}
<h1>{item}</h1>
<table border="1"> <tr> <th>Затрата </th>
<th>Процент </th>
<th>Сумма </th>
</tr>
{for: expense in item.tariff.compositionExpenses}
<tr>
<td>{expense.name} ({expense.code}) </td>
<td&gt{expense.percent}% </td>
<td>{expense.sum} </td>
</tr>
{end:}
</table>
{end:}
</body>



Класс "МЭС"

CMesInfo

*code - код МЭС
*name - название МЭС
*descr



Класс "Особенности выполнения МЭС"

CMesSpecificationInfo

*code - код результата выполнения МЭС
*name - название результата выполнения МЭС
*done - флаг выполнения МЭС (логическое значение .T. соответствует выполнению МЭС)



Класс "КСГ"

Данные о КСГ можно выводить из форм ввода и контекста eventList.

{for: csg in event.csgList}

{csg.begDate} - дата начала

{csg.endDate} - дата окончалия

{csg.MKB} - код МКБ

{csg.CSGCode} - код КСГ

{csg.amount} - количество

{csg.payStatus} - статус оплаты

{end:}



Контекст "feed" (Порционник)

{recordList} - массив, каждый элемент содержит в себе:

*вид оплаты {finance}(CFinanceInfo)
*период питания {mealTime}(CMealTimeInfo)
*стол питания {diet}(CDietInfo)
*флаг патрона {isPatron} - 1, если запись о питании патрона, где каждый элемент соответствует активной галочке в графах питания пациента и патрона

{dietList}(СInfoList) - содержит в себе список всех возможных столов
{mealTimeList}(CInfoList) - содержит в себе список всех возможных периодов питания
{financeList}(CInfoList) - содержит в себе список всех возможных видов оплаты
{clientsCount} - число пациентов всего
{clientsWithFeed} - число пациентов с назначенным питанием
{patronsCount} - число патронов всего
{patronsWithFeed} - число патронов с назначенным питанием
{orgStructure} - текущее подразделение
{reportDate} - дата, выбранная в диалоге печати
{reportType} - тип порционника, выбираемый в диалоге печати



==== Печать из "Стационарного монитора" ====

В контексты печати передается rows, который является массивом, состоящим из CEventInfo и словаря с доп.данными (dop). Также передаются данные фильтра {filter}.

Фильтр - словарь, состоящий из:

*Дата начала - {filter.begDate}
*Время начала - {filter.begTime}
*Дата окончания - {filter.endDate}
*Время окончания - {filter.endTime}
*Поступили в - {filter.received}
*Тип финансирования - {filter.finance}
*Подразделение - {filter.orgStructure}
*Признак закрытого или открытого события - {filter.eventCloseType}

Далее представлены контексты печати с соответствующими им доп.данными.



Вкладка "Присутствующие"

Контекст печати "mPresence".

*Статус наблюдения пациента: код - {dop.observationCode}, имя - {dop.observationName}, цвет - {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Питание пациента: {dop.clientFeed} (номер стола)
*Питание Патрона: {dop.patronFeed}
*Комфортность: {dop.comfortableDate}
*Койка: код койки - {dop.bedCode}, название койки - {dop.bedName}
*Подразделение: {dop.orgStructure}



Вкладка "Поступили"

Контекст печати "mReceived".

*Статус наблюдения пациента: код - {dop.observationCode}, имя - {dop.observationName}, цвет - {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Койка: код койки - {dop.bedCode}, название койки - {dop.bedName}
*Питание пациента: {dop.clientFeed} (наличие или отсутствие)
*Дата госпитализации: {dop.setDate}
*Дата поступления: {dop.begDate}
*Дата выбытия: {dop.endDate}
*Подразделение: {dop.orgStructure}



Вкладка "Выбыли"

Контекст печати "mLeaved".

*Статус наблюдения пациента: код - {dop.observationCode}, имя - {dop.observationName}, цвет - {dop.observationColor}
*Источник финансирования: {dop.finance}
*Договор: {dop.contract}
*Койка: код койки - {dop.bedCode}, название койки - {dop.bedName}
*Дата госпитализации: {dop.setDate}
*Дата поступления: {dop.begDate}
*Дата выбытия: {dop.endDate}
*Подразделение: {dop.orgStructure}

Пример:

{for: event, dop in rows}
{event.client.fullName}
{dop.orgStructure}
{end:}



Счета

*Плательщик по договору - {account.contract.payer}
*Номер договора - {account.contract.number}, {account.number}
*Дата договора - {account.contract.date}, {account.date}
*Основание договора - {account.contract.resolution}
*Реестр счёта (дата, пациент, стоимость) списком - {account.items}, {item.event}
*Элемент реестра счета {account.payedSum}
*Сумма по счёту - {account.sum}
*Cсылка на новый элемент перевыставленного счета - {item.reexposeItem}
*Ссылка из элемента перевыставленного счета на элемент предыдущего счета - {item.preexposeItem}
*Применённые коэффициенты к элементы реестра счёта .

Пример использования:

{for: item in account.items}
{for: i in item.usedCoefficients}
{i[0]} - {i[1]} - {i[2]}
{end:}
{end:}

При этом: {i[0]} - группа, {i[1]} - название коэффициента, {i[2]} - значение коэффициента.

Также для одной группы присутствует '''дополнительный коэффициент''' с наименованием "__all__", значение которого соответствует значению всей группы.



Платные услуги (контекст localContract)

У localContract есть параметр payment (CEventPaymentInfo), который вытягивает следующие данные:

Пример использования: {for: payment in event.localContract.payment}

{payment.date} <-- дата платежа -->
{payment.cashOperation} <-- Кассовая операция {rbCashOperation} -->
{payment.sum} <-- Сумма платежа -->
{payment.typePayment} <-- Тип оплаты (наличный = 0, безналичный = 1) -->
{payment.settlementAccount} <-- Расчетный счет -->
{payment.bank} <-- Реквизиты банка (COrgInfo) -->
{payment.numberCreditCard} <-- Номер кредитной карты -->
{payment.cashBox} <-- идентификатор кассового аппарата --> {end:}



Журнал планирования профилактического наблюдения (контекст ProphylaxisPlanningList)

Текущая запись в журнале (CProphylaxisPlanningInfo):

*Код пациента: {ProphylaxisPlanning.clientId}
*Телефон: {ProphylaxisPlanning.contact}
*Пациент: {ProphylaxisPlanning.client) (CClientInfo)
*Дата и время добавления в БД: {ProphylaxisPlanning.createDatetime}
*Дата и время изменения: {ProphylaxisPlanning.modifyDatetime}
*Создал запись: {ProphylaxisPlanning.createPerson} (CPersonInfo)
*Изменил запись: {ProphylaxisPlanning.modifyPerson} (CPersonInfo)
*Дата начала (столбец "С"): {ProphylaxisPlanning.begDate}
*Дата окончания (столбец "По"): {ProphylaxisPlanning.endDate}
*Подразделение: {ProphylaxisPlanning.orgStructure} (COrgStructureInfo)
*Место: {ProphylaxisPlanning.scene} (CSceneInfo)
*Специальность: {ProphylaxisPlanning.speciality} (CSpecialityInfo)
*Врач: {ProphylaxisPlanning.person} (CPersonInfo)
*Диагноз: {ProphylaxisPlanning.diagnosis} (строка)
*Причина: {ProphylaxisPlanning.reason} (строка)
*Оповещен: {ProphylaxisPlanning.notified} (1-да, 0-нет)
*Отработан: {ProphylaxisPlanning.processed} (1-да, 0-нет)
*Талон на прием к врачу: {ProphylaxisPlanning.scheduleItem} (CScheduleItemInfo)
*Примечания: {ProphylaxisPlanning.note} (строка)
*Внешний пользователь: {ProphylaxisPlanning.externalUserId} (строка)
*Роль внешнего пользователя: {ProphylaxisPlanning.externalUserRole} (строка)
*Имя внешнего пользователя: {ProphylaxisPlanning.externalUserName} (строка)
*Удален: {ProphylaxisPlanning.deleted} (1-да, 0-нет)
*Тип планирования: {ProphylaxisPlanning.typeId} (CProphylaxisPlanningTypeInfo)

Список записей (CProphylaxisPlanningInfoList):

*Цикл по всем записям:

{for: planningInfo in ProphylaxisPlanningList}
...
{end:}

*Кол-во записей:

{len(ProphylaxisPlanningList)}



класс "Тип планирования" (CProphylaxisPlanningTypeInfo)

*Код: {code}
*Имя: {name}
*Дни до: {daysBefore}
*Дни после: {daysAfter}

Напечатать тип планирования для ProphylaxisPlanning:

{ProphylaxisPlanning.typeId}



Печать изображений

Свойства действия типа ActionProperty_Image и ActionProperty_ImageMap в качестве value возвращают CImageInfo.

с CImageInfo можно сделать: - преобразовано в строку (как сейчас) - возвращается HTML-тег <img ...>

{prop.value:h}

- получить ширину и высоту:

Size: {prop.value.width} × {prop.value.height}

- получить отмасштабированный CImageInfo:

{ prop.value.scaled(100): h}
{prop.value.scaled(width=50, height=100) :h}

Scaled имеет четыре параметра (имя=значение_по_умолчанию # примечание):

* width=None # требуемая ширина, если 0 или None то ширина меняется сообразно масштабу
* height=None # требуемая высота, если 0 или None то высота меняется сообразно масштабу
* keepAspectRatio=False # если keepAspectRatio=True, то изображение масштабируется так, чтобы вбить картинку в новый прямоугольник без искажения пропорций; иначе картинка получает новый размер и искажается
* smoothTransformation=True # если smoothTransformation=True то при масштабировании используется сглаживание, иначе - быстрые и некрасивые вставка/пропуск пикселей.



Прививочная карта пациента

Пример текста шаблона печати из прививочной карты

{for: vaccineItem in vaccineList}
{vaccineItem.vaccine.name}
{vaccineItem.vaccinationType}
{vaccineItem.datetime}
{vaccineItem.dose}
{vaccineItem.seria}
{vaccineItem.person.shortName}
{vaccineItem.reaction.name}
{vaccineItem.transitionType.name}
{vaccineItem.relegateOrg.title}

{for: infectionItem in vaccineItem.infections}
{infectionItem.infection.code}
{infectionItem.name}
{end:}
{end:}

{for: medicalExemptionItem in medicalExemptionList}
{medicalExemptionItem.date}
{medicalExemptionItem.MKB}
{medicalExemptionItem.person.shortName}
{medicalExemptionItem.endDate}
{medicalExemptionItem.medicalExemptionType.name}

{for: infectionItem in medicalExemptionItem.infections}
{infectionItem.infection}
{end:}
{end:}



Режим "Диспансерное наблюдение"

Контекст печати surveillance.

'''Печать списка пациентов'''
{clientsInfo} - массив списка пациентов, можно пройти как по массиву, обратиться по индексу, элементы - CClientInfo

'''Печать параметров фильтров
'''

*Общие параметры отбора 

{begDate} - значение параметра "Дата начала" (или "На дату" для вкладки Состоят), CDateInfo
{endDate} - значение параметра "Дата окончания", CDateInfo
{orgStructureId} - значение параметра "Подразделение врача", COrgStructureInfo
{specialityType} - значение параметра "Специальность", определение типа отбора, 0 - "Отбор по ИЛИ", 1 - "Отбор по И"
{for: spec in specialityId}
{spec.code} {spec.name}
{end:} - значение параметра "Специальность", CSpecialityInfo
{personId} - значение параметра "Врач", CPersonInfo
{MKBFilter} - значение параметра "Коды диагнозов по МКБ", определение типа фильтра, 0 - "Игнор.", 1 - "Интервал"
{MKBFrom} - значение параметра "Коды диагнозов по МКБ", определение первого значения диапазона, CMKBInfo
{MKBTo} - значение параметра "Коды диагнозов по МКБ", определение последнего значения диапазона, CMKBInfo

*Параметры отбора по пациенту 

{accountingSystemId} - значение параметра "Пациент", выбор системы идентификации (может быть "не задано"), CAccountingSystemInfo
{filterClientId} - значение параметра "Пациент", информация о пациенте с выбранным идентификатором, CClientInfo
{sex} - значение параметра "Пол", пустое значение - "не задано", М, Ж
{ageFor} - значение параметра "Возраст с"
{ageTo} - значение параметра "Возраст по"

*Параметры отбора по летальности 

{death} - значение параметра "Летальность", условие отбора, 0 - "не учитывать", 1 - "только живые", 2 - "только умершие"
{deathBegDate} - значение параметра "Летальность", дата начала периода отбора данных
{deathEndDate} - значение параметра "Летальность", дата окончания периода отбора данных

*Параметры отбора по прикреплению 

{attachOrganisationId} - значение параметра "Прикрепление к ЛПУ", COrgInfo
{isNotAttachOrganisation} - значение параметра "Не имеет прикрепления к выбранному ЛПУ", false - имеет прикрепление к выбранному ЛПУ, true - не имеет прикрепления
к выбранному ЛПУ
{isFilterAddressOrgStructure} - значение параметра "По участку", активность фильтра, false - не отмечен, true - отмечен
{addressOrgStructureTypeId} - значение параметра "По участку", условие подбора участка, 0 - "регистрация", 1 - "проживание", 2 - "регистрация или проживание",
3 - "прикрепление", 4 - "регистрация или прикрепление", 5 - "проживание или прикрепление", 6 - "регистрация, проживание или прикрепление"
{addressOrgStructureId} - значение параметра "По участку", подразделение прикрепления, COrgStructureInfo

*Параметры отбора по адресу 

{isFilterAddress} - значение параметра "Адрес", активность фильтра, false - не отмечен, true - отмечен
{addressTypeId} - значение параметра "Адрес", условие подбора по типу адреса, 0 - "регистрации", 1 - "проживания"
{addressCityCode} - значение параметра "Адрес", населенный пункт, возвращается КЛАДР-код нас.пункта, если выбран нас.пункт
{addressCityName} - значение параметра "Адрес", населенный пункт, возвращается наименование нас.пункта и его тип, если выбран нас.пункт
{addressCitySOCR} - значение параметра "Адрес", населенный пункт, возвращается тип нас.пункта, если выбран нас.пункт
{addressOkatoCode} - значение параметра "Адрес", район, возвращается КЛАДР-код района, если выбран район
{addressOkatoName} - значение параметра "Адрес", район, возвращается наименование района, если выбран район
{KLADRStreetCodeList} - значение параметра "Адрес", список улиц, возвращается список КЛАДР-кодов улиц выбранного населенного пункта, если выбран нас.пункт
{addressStreetCode} - значение параметра "Адрес", улица, возвращается КЛАДР-код выбранной улицы, пусто - если улица не выбрана
{addressStreetName} - значение параметра "Адрес", улица, возвращается наименование выбранной улицы, пусто - если улица не выбрана
{addressStreetSOCR} - значение параметра "Адрес", улица, возвращается тип выбранной улицы, пусто - если улица не выбрана
{addressHouse} - значение параметра "Адрес", номер дома
{addressCorpus} - значение параметра "Адрес", номер корпуса
{addressFlat} - значение параметра "Адрес", номер квартиры

*Параметры отбора по соц.статусу 

{isSocStatuses} - значение параметра "Соц.статус", активность фильтра, false - не отмечен, true - отмечен
{socStatusesBegDate} - значение параметра "Соц.статус", дата начала периода отбора, CDateInfo
{socStatusesEndDate} - значение параметра "Соц.статус", дата окончания периода отбора, CDateInfo
{socStatusesClass.code} - значение параметра "Соц.статус", код класса соц.статуса
{socStatusesClass.name} - значение параметра "Соц.статус", наименование класса соц.статуса
{socStatusesType.code} - значение параметра "Соц.статус", код типа соц.статуса
{socStatusesType.name} - значение параметра "Соц.статус", наименование типа соц.статуса

*Параметры отбора по обращениям 

{isFilterEvent} - значение параметра "Обращения", активность фильтра, false - не отмечен, true - отмечен
{isEventVisitDiagnosis} - значение параметра "по Диспансерному наблюдению", активность фильтра, false - не отмечен, true - отмечен
{eventVisitType} - значение параметра "Обращения", условие отбора, 0 - "обращались", 1 - "не обращались"
{eventBegDate} - значение параметра "Обращения", дата начала периода отбора, CDateInfo
{eventEndDate} - значение параметра "Обращения", дата окончания периода отбора, CDateInfo



Режим "Централизованный учет"

Контекст печати '''CentralizedAccountingDialog'''

eventList - список всех событий пациентов, данные которых используются в окне "Централизованного учета" (далее - ЦУ).

selectedEvents - список всех событий выделенных пациентов, данные которых используются в окне ЦУ.

{for: ev in eventList/selectedEvents}
доступ ко всем атрибутам события, его действий и их свойств (CCentralizedAccountingEventInfo)
{ev.client} - данные о пациенте (CСlientInfo)
{ev.hospitalBedOrgStructure} - данные о подразделении пребывания пациента (COrgStructureInfo)
{end:}

actions - список действий одного выбранного пациента, которые отображаются в окне ЦУ.

{for: act in actions}
доступ ко всем атрибутам действий и их свойств (CActionInfo)
{end:}



Режим "Складской учет"



Вкладка "Движение" (контекст StockMotions)

*Вывод информации по всем документам в списке
{for: item in motionsList}
{item.type} - тип документа
{item.number} - номер документа
{item.date} - дата документа
{item.reason} - основание документа
{item.reasonDate} - дата основания
{item.receiver} - подразделение-получатель
{item.supplier} - подразделение-поставщик
{item.note} - примечание
{item.client} - пациент
{item.supplierPerson} - ответственный сотрудник от подразделения-поставщика
{item.receiverPerson} - ответственный сотрудник от подразделения-получателя
{item.supplierOrgPerson} - ответственный от внешнего постащика
{item.supplierOrg} - внешний поставщик

{for: it in item.items} - информация по каждой позиции в документе
{it.price} - цена
{it.sum} - сумма
{it.qnt} - количество
{it.batch} - серия
{it.isOut} - 0, если исходный материал, 1, если результат (для документов типа "Производство")
{it.shelfTime} - годен до
{it.finance} - тип финансирования
{it.unit.code} - код ед.измерения
{it.unit.name} - наименование ед.измерения
{it.reason.code} - код причины утилизации (для документов типа "Утилизация")
{it.reason.name} - наименование причины утилизации (для документов типа "Утилизация")
{it.note} - примечание
{it.nomenclature.code} - код ЛСиИМН
{it.nomenclature.name} - ТН на русском ЛСиИМН
{it.nomenclature.RegionalCode} - региональный код ЛСиИМН
{it.nomenclature.type.code} - код типа ЛСиИМН
{it.nomenclature.type.name} - наименование типа ЛСиИМН
{it.nomenclature.internationalNonproprietaryName} - МНН на русском ЛСиИМН
{it.nomenclature.producer} - производитель ЛСиИМН
{it.nomenclature.ATC} - код по АТХ ЛСиИМН
{it.nomenclature.packSize} - объем упаковки ЛСиИМН
{it.nomenclature.mnnCode} - код по МНН ЛСиИМН
{it.nomenclature.trnCode} - код по ТРН ЛСиИМН
{it.nomenclature.dosageValue} - дозировка ЛСиИМН
{it.nomenclature.dosageUnit} - единица дозировки ЛСиИМН
{it.nomenclature.lfForm.code} - код формы выпуска ЛСиИМН
{it.nomenclature.lfForm.name} - наименование формы выпуска ЛСиИМН
{it.nomenclature.inDate} - дата включения ЛСиИМН
{it.nomenclature.exDate} - дата исключения ЛСиИМН
{it.nomenclature.completeness} - комплектность ЛСиИМН
{it.nomenclature.mnnLatin} - МНН на латинском ЛСиИМН
{it.nomenclature.originName} - ТН на латинском ЛСиИМН

{for: key in it.nomenclature.features} - характеристики ЛСиИМН
{key}

([for: data in it.nomenclature.features[key]}
{data}
{end:})

{end:}

{for: analog in it.nomenclature.analogues} - аналоги ЛСиИМН
{analog.name}
{end:}
{end:}
{end:}

{for: comp in it.nomenclature.composition} - состав ЛСиИМН
{it.idx}
{it.nomenclature.type}
{it.nomenclature.activeSubstance} (CNomenclatureActiveSubstanceInfo)
{end:}

*Вывод информации по выделенным документам в списке
{for: item in selectedMotionsList} - вывод информации по выделенным документам в списке
...
{end:}

*Документ "Внутреннее потребление" (контекст StockInternalConsumption)
{for: row in rows}
{row.sum} - сумма
{row.qnt} - количество
{row.nomenclature} - номенклатура
{row.batch} - серия
{row.isOut} - 0, если исходный материал, 1, если результат (для документов типа "Производство")
{row.note} - примечание
{row.shelfTime} - годен до
{row.finance} - тип финансирования
{row.unit} - ед.измерения
{row.price} - цена
{row.medicalAidKind} - профиль медицинской помощи
{number} - номер документа
{date} - дата документа
{supplier} - подразделение-поставщик
{supplierPerson} - ответственный сотрудник от подразделения-поставщика
{note} - примечание
{end:}

*Документ "Утилизация" (контекст StockUtilization)
{for: row in rows}
<tr>
<td>{row.sum}</td> - сумма
<td>{row.qnt}</td> - количество
<td>{row.nomenclature}</td> - номенклатура
<td>{row.batch}</td> - серия
<td>{row.shelfTime}</td> - Годен до
<td>{row.finance}</td> - тип финансирования
<td>{row.unit}</td> - ед. учета
<td>{row.reason}</td> - причина утилизации
<td>{row.price}</td> - цена
<td>{row.medicalAidKind}</td> - вид медицинской помощи
<td>{row.disposalMethod.code}</td> - код способа утилизации
<td>{row.disposalMethod.name}</td> - наименование способа утилизации
<td>{number}</td> - Номер документа
<td>{date}</td> -Дата
<td>{time}</td> - время
<td>{supplier}</td> - Подразделение
<td>{supplierPerson}</td> - Ответственный
<td>{note}</td> - Примечания
</tr>
{end:}

* Сведения о составе комиссии для документа "Утилизация" (контекст StockUtilization)

{for: item in commission}
<td>{item.person} - Фамилия И.О. и специальность члена комиссии
<td>{item.postName} - Роль в комиссии (Председатель, Утверждающий, Член комиссии)
{end:}

*Документ "Производство" (контекст InventoryList)
*Документ "Инвентаризация" (контекст InventoryList)

{Inventory.number} - номер
{Inventory.date} - дата
{Inventory.reason} - основание
{Inventory.reasonDate} - дата основания
{Inventory.receiver}/{Inventory.supplier} - подразделение
{Inventory.receiverPerson}/{Inventory.supplierPerson} - ответственный
{Inventory.note} - примечания
{for: it in Inventory.items}
{it.nomenclature} - ЛСиИМН
{it.batch} - серия
{it.shelfTime} - годен до
{it.finance} - тип финансирования
{it.medicalAidKind} - вид медицинской помощи
{it.oldQnt} - кол-во по документам
{it.oldPrice} - цена по документам
{it.oldSum} - сумма по документам
{it.unit} - ед. учета
{it.qnt} - фактическое количество
{it.price} - фактическая цена
{it.sum} - фактическая сумма
{it.note} - примечание
{end:}

* Сведения о составе комиссии для документа "Инвентаризация"

{for: item in CommissionList}
<td>{item.person}</td> - Фамилия И.О. и специальность члена комиссии
<td>{item.postName}</td> - Роль в комиссии (Председатель, Утверждающий, Член комиссии)
{end:}

* Вкладка "Остатки" (контекст StockRemainings)
{remainingsFilterDate} - на дату
{for: item in remainingsList}
{item.orgStructure} - подразделение
{item.nomenclature._} - аналогично it.nomenclature._ на вкладке "Движение"
{item.batch} - серия
{item.qnt} - количество
{item.shelfTime} - годен до
{item.finance} - тип финансирования
{item.unit.code} - код ед.измерения
{item.unit.name} - наименование ед. измерения
{item.sum} - сумма
{end:}



Вкладка "Мои требования" (контекст StockMyRequisitions) и "Требования ко мне" (контекст StockRequirementsToMe)

*Вывод информации по всем документам в списке
{for: item in requisitionsList}
{item.number} - номер требования
{item.date} - дата требования
{item.deadline} - срок исполнения требования
{item.receiver} - подразделение-заказчик по требованию
{item.recipientPerson} - ответственный подразделения-заказчика по требованию
{item.supplier} - подразделение-поставщик по требованию
{item.note} - примечание

{agreementDate} - Дата согласования
{agreementPerson} - Кто согласовал
{agreementStatus} - Статус согласования (0-Не согласовано, 1-Согласовано, 2-Отклонено)
{agreementNote} - Примечание к согласованию

{for: it in item.items} - информация по каждой позиции в требовании
{it.nomenclature._} - аналогично it.nomenclature._ на вкладке "Движение"
{it.finance} - тип финансирования
{it.qnt} - затребованное количество
{it.satisfiedQnt} - отпущенное количество
{it.unit.code} - код ед.измерения
{it.unit.name} - наименование ед. измерения
{end:}
{end:}

*Вывод информации по выделенным документам в списке
{for: item in selectedRequisitionsList} - вывод информации по выделенным документам в списке
...
{end:}
*Связь с накладными по требованиям
{for: item in requisitionsList}
{for: motion in item.motions} - накладная по требованию (см. цикл по motionsList на вкладке "Движение")
{for: pos in motion.items} - позиция накладной (см. цикл по item.items на вкладке "Движение")

...
{end:}
{end:}
{end:}



Вкладка "Идентификация"

Вкладка идентификация присутствует в большинстве таблиц.

Используя функцию '''.identify''' можно получить идентификатор по указанному в скобках справочнику.

Пример получения идентификатора по справочнику должностей oid:1.2.643.5.1.13.13.11.1002:

{action.person.post'''.identify'''('urn:oid:1.2.643.5.1.13.13.11.1002')

Пример получения идентификатора подразделения по справочнику "Справочник МО" oid:1.2.643.2.69.1.1.1.64':

{:urn = ''}
{:currentOrgStr = event.execPerson.orgStructure}
{if: currentOrgStr}
{while: currentOrgStr.id}
{:urn = currentOrgStr.identify('urn:oid:1.2.643.2.69.1.1.1.64')}
{if: urn}
{break:}
{else:}
{:currentOrgStr = currentOrgStr.parent}
{end:}
{end:}
{end:}

{urn}

Обратите внимание, что в данном примере если у подразделения лечащего врача случая обслуживания не выполнена настройка идентификации, то пытаемся определить идентификацию вышестоящего подразделения, а если у него нет, то у его вышестоящего и т.д.



Внешние учетные системы

При необходимости получить в шаблоне печати информацию о внешней учетной системе (например, версию для СЭМД) можно использовать следующую функцию:

{:from PyQt4 import QtGui}
{def: getLastVersion(urn)}
{:db = QtGui.qApp.db}
{:table = db.table('rbAccountingSystem')}
{:version = db.getMax(table, 'version', table['urn'].eq(urn))}
{:return unicode(version.toString()) if version else u''}
{end:}

{getLastVersion(u'urn:oid:1.2.643.5.1.13.13.11.1060')}

Если необходимо указать только "чистый" OID, то можно использовать .like():

{:from PyQt4 import QtGui}
{def: getLastVersion(urn)}
{:db = QtGui.qApp.db}
{:table = db.table('rbAccountingSystem')}
{:version = db.getMax(table, 'version', table['urn'].like(urn))}
{:return unicode(version.toString()) if version else u''}
{end:}

{getLastVersion(u'%1.2.643.2.69.1.1.1.195%')}

Для получение актуальной версии конкретной внешней учетной системы



Класс "Организация" COrgInfo

Текущая организация: {currentOrganisation} (COrgInfo) имеет свойства:

• Полное название:{currentOrganisation.fullName}

• Сокращенное название:{currentOrganisation.shortName}

• Для печати:{currentOrganisation.title}

• Сеть:{currentOrganisation.net}

• ИНФИС-код:{currentOrganisation.infisCode}

• ОКВЭД:{currentOrganisation.OKVED}

• ИНН:{currentOrganisation.INN}

• ОКПО:{currentOrganisation.OKPO}

• КПП:{currentOrganisation.KPP}

• ОГРН:{currentOrganisation.OGRN}

• ОКАТО:{currentOrganisation.OKATO}

• ОКФС:{currentOrganisation.OKPF}

• ФСС:{currentOrganisation.FSS}

• Регион:{currentOrganisation.region}

• Адрес (свободный ввод):{currentOrganisation.addressFreeInput}

• Код КЛАДР:{currentOrganisation.address.KLADRCode}

• Код КЛАДР улицы:{currentOrganisation.address.KLADRStreetCode}

• GUID FIAS улицы:{currentOrganisation.address.FIASStreetGUID}

• ФИО Шефа:{currentOrganisation.chief}

Теперь в COrgInfo есть два поля:

- chief (CPersonInfo)
- chiefFreeInput (строка)

А также функция formatChief().
Выводит chiefFreeInput, если нет Organisation.chief_id, а если есть, то выводит ФИО врача и должность.
Функция всегда возвращает строку.
Например: {currentOrganisation.formatChief()}

• Телефон:{currentOrganisation.phone}

• Адрес эл. почты:{currentOrganisation.email}

• ФИО Гл.бухгалтера:{currentOrganisation.accountant}

• примечание:{currentOrganisation.notes}  



Вкладка "Лицензии" (контекст COrgLicenseInfo)

• Номер лицензии: {COrgLicenseInfo.number}

• Кем выдана: {COrgLicenseInfo.issuer}

• Дата выдачи: {COrgLicenseInfo.issueDate}

• Начало действия: {COrgLicenseInfo.begDate}

• Окончание действия: {COrgLicenseInfo.endDate}



Окно "Планирование профилактического наблюдения"

Контекст печати surveillancePlanning

*Сведения о пациенте: client(CClientInfo)

*Сведения о случае диспансерного наблюдения пациента (блок "Планирование профилактического наблюдения" в окне "Планирование профилактического наблюдения")
planningSurveillances(CProphylaxisPlanningInfoProxyList):

{for: planningSurveillance in planningSurveillances}
{planningSurveillance.diagnosis} (CMKBInfo) - МКБ
{planningSurveillance.dispanser} - ДН
{planningSurveillance.takenDate} - Дата взятия
{planningSurveillance.person} (CPersonInfo) - Врач
{planningSurveillance.removeDate} - Дата снятия
{planningSurveillance.removeReason} - Причина снятия
{end:}

*Сведения о периодах случая диспансерного наблюдения пациента (блок "Планирование и контроль посещений" в окне "Планирование профилактического наблюдения")
controlSurveillances(CProphylaxisPlanningInfoProxyList):

{for: controlSurveillance in controlSurveillances}
{controlSurveillance.diagnosis} (CMKBInfo) - МКБ
{controlSurveillance.plannedDate} - Дата планирования
{controlSurveillance.begDate} - Дата начала периода
{controlSurveillance.endDate} - Дата окончания периода
{controlSurveillance.person} (CPersonInfo) - Врач
{controlSurveillance.visit.date} (CVisitInfo) - Явился
{controlSurveillance.removeDate} - Дата снятия
{controlSurveillance.removeReason} - Причина снятия
{end:}



Окно "Контрольная карта"

Открывается по кнопке "Печать" в окне "Планирование профилактического наблюдения".

Контекст печати surveillancePlanningCard

*Сведения о пациенте: client(CClientInfo)

*Сведения о случае диспансерного наблюдения пациента (блок "Диагноз" в "Контрольной карте")
planningSurveillances(CProphylaxisPlanningInfoProxyList):

{for: planningSurveillance in planningSurveillances}
{planningSurveillance.diagnosis} (CMKBInfo) - МКБ
{planningSurveillance.dispanser} - ДН
{planningSurveillance.takenDate} - Дата взятия
{planningSurveillance.person} (CPersonInfo) - Врач
{planningSurveillance.removeDate} - Дата снятия
{planningSurveillance.removeReason} - Причина снятия
{end:}

*Сведения о периодах случая диспансерного наблюдения пациента (блок "Контроль посещений" в "Контрольной карте")
controlSurveillances(CProphylaxisPlanningInfoProxyList):

{for: controlSurveillance in controlSurveillances}
{controlSurveillance.diagnosis} (CMKBInfo) - МКБ
{controlSurveillance.plannedDate} - Дата планирования
{controlSurveillance.begDate} - Дата начала периода
{controlSurveillance.endDate} - Дата окончания периода
{controlSurveillance.person} (CPersonInfo) - Врач
{controlSurveillance.visit.date} (CVisitInfo) - Явился
{controlSurveillance.removeDate} - Дата снятия
{controlSurveillance.removeReason} - Причина снятия
{end:}
*Сведения о мероприятиях случая диспансерного наблюдения пациента (отмеченные мероприятия в блоке "Лечебно-профилактические мероприятия" в "Контрольной карте")
measuresActionsSelected (CActionSelectedInfoProxyList, CActionInfo):

{for: action in measuresActionsSelected}
{action.name} - Наименование
{action.directionDate} - Назначено
{action.begDate} - Начато
{action.endDate} - Окончено
{action.person} (CPersonInfo) - Выполнил
...
{end:}



Формирование CDA документа

При необходимости после подписания и прикрепления документа также сформировать CDA документ в формате XML необходимо использовать функцию addSupplement:

{: addSupplement('xml', formatByTemplate('CDA_CERT_NOT_INF', 'CDA')) }

xml - формат документа
CDA_CERT_NOT_INF - имя соответствующего шаблона печати, по которому должен быть сформирован CDA документ
CDA - контекст соответствующего шаблона печати, по которому должен быть сформирован CDA документ

В случае, если при формировании СЭМД является критичным наличие в теле документа идентификатора случая обслуживания, то можно воспользоваться настройкой "Требует идентификатор события" шаблона печати, которая блокирует формирование превью шаблона до сохранения случая обслуживания в БД (т.е. до присвоения ему идентификатора).